torchlens

GitHub
640 28 简单 1 次阅读 2周前GPL-3.0开发框架
AI 解读 由 AI 自动生成,仅供参考

TorchLens 是一款专为 PyTorch 设计的开源工具,旨在让开发者无需修改任何模型代码,仅用一行命令即可提取并可视化模型前向传播中每一个张量操作的中间结果。在深度学习研究与调试中,深入理解复杂网络的内部计算结构往往困难重重,传统方法需要手动插入钩子或大幅重构代码。TorchLens 完美解决了这一痛点,它能自动记录从简单循环网络到拥有数千个操作的大型 Transformer 模型(如 Swin V2)的全部激活值与详细元数据,并生成直观的计算图可视化。

该工具特别适合深度学习研究人员、算法工程师以及需要排查模型行为的教育工作者使用。其核心技术亮点在于“零侵入”设计:用户只需定义标准模型并传入输入数据,TorchLens 便能返回包含完整执行日志的 ModelHistory 对象,支持按需查询任意层级的输出状态。无论是分析梯度消失问题、验证网络架构逻辑,还是教学演示,TorchLens 都能提供透明、详尽的内部视角,帮助用户轻松洞察黑盒模型的运作细节,是探索 PyTorch 模型内部机制的高效助手。

使用场景

某计算机视觉研究员正在调试一个包含复杂循环结构和动态分支的自定义 PyTorch 模型,试图定位导致梯度消失的具体算子位置。

没有 torchlens 时

  • 代码侵入性强:为了获取中间层输出,必须在模型源码中手动插入大量钩子(hooks)或修改 forward 函数,破坏了原有代码结构且容易引入新 bug。
  • 动态结构难追踪:面对循环或条件分支,难以确定某次特定迭代(如第 3 次循环中的线性层)的具体激活值,只能靠打印猜测。
  • 黑盒可视化缺失:缺乏自动生成的计算图,无法直观看到数据在数百个算子间的真实流向,排查拓扑错误全靠脑补。
  • 调试效率低下:每次尝试提取不同层的特征都需要重新编写提取逻辑并重启训练,单次排查往往耗时数小时。

使用 torchlens 后

  • 零代码侵入:仅需调用 tl.log_forward_pass 一行代码,无需修改任何模型定义,即可自动捕获所有中间算子的输出结果。
  • 精准定位迭代:通过生成的元数据字典,可直接索引到具体操作(如 linear_1_3:2 表示第一次线性层的第三次通行),瞬间锁定异常数值。
  • 自动全景可视:自动生成包含 1900+ 个节点的计算图可视化报告,清晰展示包括滚动循环在内的完整数据流转路径。
  • 即时反馈闭环:一次性获取全量历史日志与结构信息,将原本数小时的“猜谜式”调试缩短为分钟级的精准分析。

torchlens 将 PyTorch 模型的黑盒前向传播转化为透明、可索引且可视化的白盒过程,让复杂网络的内部机理一目了然。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU

未说明 (依赖 PyTorch 环境,CPU/GPU 均可运行)

内存

未说明 (取决于模型大小及是否保存所有中间层激活值)

依赖
notes安装前需先在操作系统层面安装 Graphviz 工具(例如 Linux 下使用 'sudo apt install graphviz'),否则无法生成网络可视化图像。该工具兼容 PyTorch 1.8.0 及以上版本,旨在支持任意 PyTorch 模型(包括 CNN、RNN、Transformer 等)。若需保存所有中间层激活值,内存消耗会随模型深度显著增加,可通过 layers_to_save 参数筛选特定层以节省内存。
python未说明 (示例中显示使用了 Python 3.10)
torch>=1.8.0
graphviz
torchlens hero image

快速开始

TorchLens

快速链接

概述

TorchLens 是一个用于完成以下两件事的工具包:

  1. 无需任何修改,只需一行代码即可轻松提取 PyTorch 模型中每一个中间操作的激活值。“每一个操作”指的就是每一个操作;“一行”就是真正的一行。
  2. 通过直观的自动可视化以及关于网络计算图的丰富元数据(部分列表在此),帮助理解模型的计算结构。

下面是一个非常简单的循环模型的示例:正如你所看到的,你只需像平常一样定义模型并将其传入,TorchLens 就会返回完整的前向传播日志以及可视化结果:

class SimpleRecurrent(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Linear(in_features=5, out_features=5)

    def forward(self, x):
        for r in range(4):
            x = self.fc(x)
            x = x + 1
            x = x * 2
        return x


simple_recurrent = SimpleRecurrent()
model_history = tl.log_forward_pass(simple_recurrent, x,
                                    layers_to_save='all',
                                    vis_mode='rolled')
print(model_history['linear_1_1:2'].activation)  # 第一次线性层的第二次传递

'''
tensor([[-0.0690, -1.3957, -0.3231, -0.1980,  0.7197],
        [-0.1083, -1.5051, -0.2570, -0.2024,  0.8248],
        [ 0.1031, -1.4315, -0.5999, -0.4017,  0.7580],
        [-0.0396, -1.3813, -0.3523, -0.2008,  0.6654],
        [ 0.0980, -1.4073, -0.5934, -0.3866,  0.7371],
        [-0.1106, -1.2909, -0.3393, -0.2439,  0.7345]])
'''

再来看一个非常复杂的 Transformer 模型(swin_v2_b),其前向传播过程中有 1932 个操作;你可以获取到每一个操作的保存输出:

TorchLens 的目标是能够对任何 PyTorch 模型实现上述功能。你可以在这个 模型动物园 中看到许多模型可视化的示例。

安装

要安装 TorchLens,首先确保已安装 graphviz(生成网络可视化所需的工具),然后使用 pip 安装 TorchLens

sudo apt install graphviz
pip install torchlens

TorchLens 兼容 PyTorch 1.8.0 及以上版本。

使用指南

以下是使用方法的简短演示;如需交互式演示,请参阅 CoLab 演示

TorchLens 的主要函数是 log_forward_pass:当它被调用时,会对给定的模型和输入执行一次前向传播,并返回一个 ModelHistory 对象,其中包含中间层的激活值及配套的元数据,同时还会生成前向传播过程中每个操作的可视化表示:

import torch
import torchvision
import torchlens as tl

alexnet = torchvision.models.alexnet()
x = torch.rand(1, 3, 224, 224)
model_history = tl.log_forward_pass(alexnet, x, layers_to_save='all', vis_mode='unrolled')
print(model_history)

'''
AlexNet前向传播日志:
	模型结构:纯前馈,无分支;共23个模块。
	前向传播中计算了24个张量(4.8 MB);保存了24个张量(4.8 MB)。
	参数操作16次(总参数数61100840个;248.7 MB)。
	随机种子:3210097511
	耗时:0.288秒
	模块层级:
		features:
		    features.0, features.1, features.2, features.3, features.4, features.5, features.6, features.7,
		    features.8, features.9, features.10, features.11, features.12
		avgpool
		classifier:
		    classifier.0, classifier.1, classifier.2, classifier.3, classifier.4, classifier.5, classifier.6
	层:
		0: input_1_0
		1: conv2d_1_1
		2: relu_1_2
		3: maxpool2d_1_3
		4: conv2d_2_4
		5: relu_2_5
		6: maxpool2d_2_6
		7: conv2d_3_7
		8: relu_3_8
		9: conv2d_4_9
		10: relu_4_10
		11: conv2d_5_11
		12: relu_5_12
		13: maxpool2d_3_13
		14: adaptiveavgpool2d_1_14
		15: flatten_1_15
		16: dropout_1_16
		17: linear_1_17
		18: relu_6_18
		19: dropout_2_19
		20: linear_2_20
		21: relu_7_21
		22: linear_3_22
		23: output_1_23
'''

你可以通过以下任意一种等效方式索引 ModelHistory 对象,来提取特定层的信息,包括其激活值和有用的元数据:

  1. 层的名称(约定为 'conv2d_3_7' 表示第3个卷积层,整体的第7层)
  2. 该层所属模块的名称(例如 'features' 或 'classifier.3')
  3. 层的序号位置(例如 2 表示第2层,-5 表示倒数第5层;这里的输入和输出也被计为层)。

为了快速确定这些名称,你可以查看图可视化,或者直接打印 ModelHistory 对象的输出(两者均已在上文展示)。以下是一些提取特定层信息以及该层实际激活值的示例:

print(model_history['conv2d_3_7'])  # 通过层名提取
# 以下注释掉的行也能提取同一层:
# model_history['conv2d_3'] 可以省略第二个数字(因为严格来说它是冗余的)
# model_history['conv2d_3_7:1'] 冒号表示某层的哪一次传递(这里只有一次)
# model_history['features.6'] 可以通过该层所属的模块来提取
# model_history[7] 整体的第7层

# model_history[-17] 倒数第17层
'''
层 conv2d_3_7,操作 8/24:
	输出张量:形状=(1, 384, 13, 13),类型=torch.float32,大小=253.5 KB
		张量([[ 0.0503, -0.1089, -0.1210, -0.1034, -0.1254],
        [ 0.0789, -0.0752, -0.0581, -0.0372, -0.0181],
        [ 0.0949, -0.0780, -0.0401, -0.0209, -0.0095],
        [ 0.0929, -0.0353, -0.0220, -0.0324, -0.0295],
        [ 0.1100, -0.0337, -0.0330, -0.0479, -0.0235]])...
	参数:由形状为 (384,) 和 (384, 192, 3, 3) 的参数计算得出;共 663936 个参数(2.5 MB)
	父层:maxpool2d_2_6
	子层:relu_3_8
	函数:conv2d(grad_fn=ConvolutionBackward0)
	在模块中计算:features.6
	耗时:5.670E-04s
	模块输出:features.6
	底层模块输出:features.6
	查找键:-17、7、conv2d_3_7、conv2d_3_7:1、features.6、features.6:1
'''

# 你可以通过 activation 字段提取某一层的实际输出激活值:
print(model_history['conv2d_3_7'].activation)
'''
tensor([[[[-0.0867, -0.0787, -0.0817,  ..., -0.0820, -0.0655, -0.0195],
          [-0.1213, -0.1130, -0.1386,  ..., -0.1331, -0.1118, -0.0520],
          [-0.0959, -0.0973, -0.1078,  ..., -0.1103, -0.1091, -0.0760],
          ...,
          [-0.0906, -0.1146, -0.1308,  ..., -0.1076, -0.1129, -0.0689],
          [-0.1017, -0.1256, -0.1100,  ..., -0.1160, -0.1035, -0.0801],
          [-0.1006, -0.0941, -0.1204,  ..., -0.1146, -0.1065, -0.0631]]...
'''

如果你不想保存所有层的激活值(例如为了节省内存),可以在调用 log_forward_pass 时使用 layers_to_save 参数指定要保存的层;你可以像上面那样通过索引方式指定层,也可以传入一个子字符串来筛选层(例如,'conv' 会提取所有卷积层):

# 提取 conv2d_3_7、'features' 模块的输出、倒数第五层以及所有线性层(即 fc 层):
model_history = tl.log_forward_pass(alexnet, x, vis_mode='unrolled',
                                    layers_to_save=['conv2d_3_7', 'features', -5, 'linear'])
print(model_history.layer_labels)
'''
['conv2d_3_7', 'maxpool2d_3_13', 'linear_1_17', 'dropout_2_19', 'linear_2_20', 'linear_3_22']
'''

TorchLens 的主要功能是 log_forward_pass;其余功能包括:

  1. get_model_metadata:用于检索所有模型元数据而无需保存任何激活值(例如,用于确定要保存哪些层;请注意,这与调用 log_forward_pass 并设置 layers_to_save=None 相同)
  2. show_model_graph:用于可视化模型图结构,同样无需保存任何激活值
  3. validate_model_activations:运行一个流程来检查激活值是否正确:具体来说,它会先执行一次前向传播并保存所有中间激活值,然后从每个中间层重新开始前向传播,并验证结果是否与真实输出一致。此外,它还会检查用随机噪声替换保存的激活值是否会生成错误的输出。如果此函数返回 False(即保存的激活值有误),请通过电子邮件 (johnmarkedwardtaylor@gmail.com) 或本 GitHub 页面告知我问题详情,我将更新 TorchLens 以修复该问题。

以上就是全部内容。TorchLens 目前仍在积极开发中,目标是能够毫无例外地兼容任何 PyTorch 模型。截至撰写本文时,它已在超过 700 种图像、视频、音频、多模态和语言模型上进行了测试,涵盖前馈网络、循环神经网络、Transformer 以及图神经网络等。

其他功能

  • 你可以使用 log_forward_passvis_nesting_depth 参数以不同嵌套深度可视化模型;例如,这里展示了 GoogLeNet 的“inception”模块在不同嵌套深度下的视图:
  • 一项实验性功能是可以不仅提取模型所有操作的激活值,还可以提取反向传播中的梯度(这些梯度可以基于任意中间层计算,而不仅仅是模型的输出),并可视化反向传播的路径(如下方蓝色箭头所示)。有关如何实现此功能的说明,请参阅 CoLab 教程。
  • 你可以通过 func_call_stack 字段查看运行模型所用的确切代码。每一项都是一个 FuncCallLocation 对象,包含清晰的表示和源代码上下文:
print(model_history['conv2d_3'].func_call_stack[0])
'''
FuncCallLocation:
  文件:/usr/local/lib/python3.10/dist-packages/torchvision/models/alexnet.py
  行:48
  函数:forward
  代码:
          x = self.features(x)
          x = self.avgpool(x)
    --->  x = self.classifier(x)
          return x
'''

计划中的功能

  1. 在未来,我计划增加一项功能,不仅可以保存激活值,还可以对它们进行反事实干预(例如,如果这些参数不同或使用了不同的非线性激活函数,输出会如何变化)。请告诉我你是否觉得这项功能有用,以及你希望具体实现什么样的功能。
  2. 我计划添加一个选项,允许只可视化模型的一个子模块,而不是一次性展示整个图结构。

其他值得了解的工具包

我们的目标是让 TorchLens 完全解决从深度神经网络中提取激活值和元数据、并可视化其结构的问题,从而让任何人都不再需要为此操心。然而,它有意省略了一些功能:例如,没有用于加载模型或刺激数据、也没有用于分析提取出的激活值的函数。这部分原因在于,我们无法预知你可能想对这些激活值做哪些操作,也无法预见所有你可能想要研究的模型类型;另一方面,目前已经有一些非常优秀的工具包可以完成这些任务。以下是一些推荐的工具包——如果你觉得我遗漏了什么,请告诉我!

  • Cerbrec:一款用于交互式可视化和调试深度神经网络的程序(底层使用了 TorchLens 来提取 PyTorch 模型的计算图!)
  • ThingsVision:提供了强大的视觉模型加载、刺激数据加载以及提取激活值后分析的功能。
  • Net2Brain:与 ThingsVision 类似,同样具备出色的端到端功能,并且还支持将提取的激活值与神经科学数据进行比较。
  • surgeon-pytorch:易于使用的模型激活值提取功能,同时还支持基于中间层激活值定义损失函数来训练模型。
  • deepdive:在加载和基准测试多种不同模型方面表现出色。
  • torchvision feature_extraction 模块:可以从具有静态计算图的模型中提取激活值。
  • rsatoolbox3:一个完整的解决方案,可用于对深度神经网络的激活值和脑数据进行表征相似性分析。

致谢

TorchLens 的开发得益于与 Nikolaus Kriegeskorte、George Alvarez、Alfredo Canziani、Tal Golan 以及哥伦比亚大学视觉推理实验室的深入讨论。同时,也感谢 Kale Kundert 提供的有益讨论及代码贡献,使得 TorchLens 能够兼容 PyTorch Lightning。所有网络可视化均使用 Graphviz 生成。Logo 由 Nikolaus Kriegeskorte 设计。

引用 TorchLens

若需引用 TorchLens,您可以参考介绍该工具包的论文,并在发现 TorchLens 有用时为本仓库点亮一颗星:

Taylor, J., Kriegeskorte, N. 使用 TorchLens 提取并可视化 PyTorch 模型的隐藏激活值和计算图。Sci Rep 13, 14375 (2023). https://doi.org/10.1038/s41598-023-40807-0

联系方式

由于 TorchLens 仍处于积极开发阶段,我们非常期待您的反馈。如有任何问题、意见或建议,或者您有兴趣开展合作,请通过以下方式与我们联系:

版本历史

v1.0.12026/03/23
v1.0.02026/03/13
v0.22.02026/03/13
v0.21.32026/03/11
v0.21.22026/03/09
v0.21.12026/03/09
v0.21.02026/03/09
v0.20.52026/03/09
v0.20.42026/03/09
v0.20.32026/03/08
v0.20.22026/03/08
v0.20.12026/03/08
v0.20.02026/03/08
v0.19.02026/03/08
v0.18.02026/03/08
v0.17.02026/03/08
v0.16.42026/03/08
v0.16.32026/03/08
v0.16.22026/03/08
v0.16.12026/03/07

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架