torchprof 源码解析:动态 Hook forward 的 Monkey-Patching 剖析机制是如何实现的

发布时间:2026/8/27 16:58:14

torchprof 源码解析:动态 Hook forward 的 Monkey-Patching 剖析机制是如何实现的
torchprof 源码解析动态 Hook forward 的 Monkey-Patching 剖析机制是如何实现的【免费下载链接】torchprofPyTorch layer-by-layer model profiler项目地址: https://gitcode.com/gh_mirrors/to/torchproftorchprof 是一款轻量的 PyTorch 模型逐层性能剖析工具layer-by-layer profiler。它的核心思路是在模型运行时用Monkey-Patching猴子补丁技术动态替换每一层的forward方法套上 PyTorch 官方 autograd profiler从而输出每一层的 CPU/CUDA 耗时与显存/内存占用报表。本文完整拆解torchprof/profile.py中的实现机制带你看懂动态 Hook forward的全过程。⚠️先说结论torchprof 目前已处于废弃deprecated状态——PyTorch 1.9 重构官方 profiler 后它不再适用新项目请直接用torch.profiler。但它的补丁式动态 Hook手法非常经典对理解 PyTorch 模块机制和性能剖析原理极具价值。 快速上手3 步完成 PyTorch 逐层性能剖析无需修改模型代码with语句包住一次前向传播即可核心用法不到 10 行import torch, torchvision, torchprof model torchvision.models.alexnet(pretrainedFalse) x torch.rand([1, 3, 224, 224]) with torchprof.Profile(model, use_cudaTrue, profile_memoryTrue) as prof: model(x) print(prof)输出是一张树形表格每个叶子层一行的耗时与内存节选自 README.md 示例此处为纯文本示意Module | Self CPU total | CPU total | Number of Calls ---------------|----------------|-----------|---------------- AlexNet | | | ├── features | | | │├── 0 | 1.832ms | 7.264ms | 1 │├── 1 | 51.858us | 76.564us | 1 ...想读源码先拉取仓库git clone https://link.gitcode.com/i/11bd72c7dcae3b7c6980eb157dfe3b3c整个库只有两个核心文件剖析逻辑在torchprof/profile.py表格渲染在torchprof/display.py测试用例在tests/test_profile.py——体量小非常适合精读。 剖析机制全景查找 → 替换 → 恢复三步走torchprof 把动态 Hook拆成了清晰的生命周期正好对应 Python 的上下文管理器协议with torchprof.Profile(model) as prof: # 进入① 遍历模块 ② 替换 forward model(x) # 模型运行每个叶子层都被夹在 profiler 中测量 # 退出③ 恢复原始 forward下面逐步拆解。第一步递归遍历模块树找出每一层walk_modulesPyTorch 模型本质是一棵nn.Module树。torchprof/profile.py中的walk_modules用生成器深度优先遍历它产出一条条Trace(path, leaf, module)三元组——模块路径如(AlexNet, features, 0)、是否叶子层、模块实例本身def walk_modules(module, name, path()): named_children list(module.named_children()) path path (name,) yield Trace(path, len(named_children) 0, module) # 无子模块 叶子层 for name, child in named_children: yield from walk_modules(child, namename, pathpath)叶子层leaf是默认剖析粒度不指定paths时只有叶子层会被 Hook父容器如features、classifier只是树形结构占位。第二步Monkey-Patching 核心——一行module.forward wrap_forward这是全库最精华的一行。进入上下文时Profile.__enter__torchprof 对每个被选中的模块执行替换_forward module.forward # 先保存原始 forward闭包捕获 self._forwards[path] _forward functools.wraps(_forward) def wrap_forward(*args, **kwargs): ... module.forward wrap_forward # ← 猴子补丁生效的唯一一行这里用到了 Python 属性查找的经典规则forward本是类属性定义在nn.Module或其子类上module.forward wrap_forward是把包装函数写入该实例的__dict__即实例属性之后访问module(...)触发module.forward时实例属性优先命中原始方法被遮蔽。这就是 Monkey-Patching 最直接的形式——不继承、不改动类定义、不调用任何 PyTorch 扩展 API纯靠 Python 属性机制完成动态 Hook。为什么不用官方register_forward_hookHook API 是观察者模式回调只能拿到输入/输出无法决定 profiler 何时开闭也无法包住整段执行。直接替换 forward 才能把 profiler 上下文精确地嵌进每次调用内部。几个工程细节值得注意均在torchprof/profile.py的_hook_trace中id(module)去重用内存地址集合防止同一子模块被引用多处时重复包装避免耗时被双重计入functools.wraps保留原方法的__name__等元信息避免调试时面目全非paths参数允许指定非叶子层精确剖析例如paths[(AlexNet, classifier)]其余层直接跳过。第三步wrap_forward 内部——在剖析上下文中运行原始 forward被替换后的 forward 长这样简化版def wrap_forward(*args, **kwargs): with torch_profiler.profile(use_cudaself.use_cuda) as prof: res _forward(*args, **kwargs) # 原始 forward 在剖析器夹缝中执行 self.trace_profile_events[path].append(prof.function_events) return res要点每层独立启停一次 autograd profiler事件列表按path归入trace_profile_events模型被调用多次时事件追加到同一列表这就是表格中 Number of Calls 列的来源版本兼容处理很典型torch 1.6 不支持profile_memory靠捕获TypeError降级重试并发出警告torch 1.8 需手动调用event_list.populate_cpu_children()补建树结构。第四步with 退出时自动恢复模型无痕还原def __exit__(self, exc_type, exc_val, exc_tb): tuple(map(self._remove_hook_trace, self.traces)) del self._forwards_remove_hook_trace把每个模块的forward从self._forwards里取回原函数并重新赋值模型对象在剖析结束后与从未被 Hook 过完全一致。此外__enter__中有重入检查二次进入会抛出RuntimeError(torchprof profiler is not reentrant)避免状态混乱。 输出怎么读Self CPU total 与 CPU total 的区别渲染逻辑在torchprof/display.py每个模块聚合为一个Measure九元组CPU/CUDA 的 self 与 total 耗时、四类内存、调用次数。新手最容易混淆两列列名含义Self CPU total该层自己消耗的 CPU 时间不含子层/子算子CPU total含下层调用在内的累计时间例如 AlexNet 第一层卷积Self CPU total 1.832ms ≈ CPU total 7.264ms的差值就是它内部 conv、contiguous、add 等子算子链路的开销。加show_eventsTrue可以把每个aten::算子也展开成行定位到具体算子级别。⚠️ 避坑指南使用 torchprof 前必看已废弃setup.py 将 torch 限制在1.1.0,1.9PyTorch ≥ 1.9 请迁移到官方torch.profiler基于 Kineto能力更强。不可重入同一个Profile实例不能嵌套两次with。剖析有开销每个叶子层独立启停 profiler层数多的模型测量时间会明显变长用paths只剖析关键层可大幅提速。事件非确定性profiler 返回的算子顺序不保证稳定tests/test_profile.py中用子集包含断言而非顺序断言来验证 AlexNet 各层应出现的aten::算子。✅ 总结从 torchprof 学到的 3 个技巧实例属性遮蔽类属性是 Python 里最轻量的 Monkey-Patching 手段配合闭包保存原函数即可随时还原上下文管理器__enter__/__exit__是 Hook/Unhook 的天然配对结构保证异常路径下也能恢复现场用hasattr 异常捕获做跨版本兼容是维护依赖底层 API 工具时的实用套路。读懂了这套约 200 行的剖析核心你就能看懂大多数运行时插桩工具profiler、tracer、mock 框架的底层原理了。【免费下载链接】torchprofPyTorch layer-by-layer model profiler项目地址: https://gitcode.com/gh_mirrors/to/torchprof创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

性能优化揭秘:KISS-Matcher如何用TBB并行KD-Tree与Robin Hash实现百万点云的快速匹配

性能优化揭秘:KISS-Matcher如何用TBB并行KD-Tree与Robin Hash实现百万点云的快速匹配

2026/8/27 16:58:14

性能优化揭秘:KISS-Matcher如何用TBB并行KD-Tree与Robin Hash实现百万点云的快速匹配 【免费下载链接】KISS-Matcher KISS-Matcher: Fast, Robust, and Scalable Registration ROS2 SLAM examples 项目地址: https://gitcode.com/gh_mirrors/ki/KISS-Matcher …

技术写作知识体系的构建方法

技术写作知识体系的构建方法

2026/8/27 16:58:14

技术写作知识体系的构建方法 技术写作的目的,是帮助读者在具体条件下完成一项操作。知识体系应按常见任务、读者前置条件和可验证结果组织。 建立内容边界 一篇文章只回答一个主问题,并说明不覆盖的场景。概念说明、操作步骤和排错记录要分开&#xff…

离线翻译怎么做?Argos Translate 四条命令完成本地机器翻译部署

离线翻译怎么做?Argos Translate 四条命令完成本地机器翻译部署

2026/8/27 16:58:14

离线翻译怎么做?Argos Translate 四条命令完成本地机器翻译部署 【免费下载链接】argos-translate Open-source offline translation library written in Python 项目地址: https://gitcode.com/GitHub_Trending/ar/argos-translate 处理客户合同或医院病历最…

优化 | 5分钟读懂LLM:DeepSeek、ChatGPT背后的核心技术,零基础小白收藏这一篇就够了!!

优化 | 5分钟读懂LLM:DeepSeek、ChatGPT背后的核心技术,零基础小白收藏这一篇就够了!!

2026/8/27 17:58:16

前言 LLM(Large Language Model)是大型语言模型的简称,像DeepSeek、ChatGPT等都属于不同公司开发的LLM。你可以把它想象成一个超级聪明的聊天机器人和写作助手,它通过学习了海量文字资料,变得非常擅长理解和生成人类语…

基于SpringBoot的膳食搭配营养学知识智能问答小程序的实现毕业设计项目源码

基于SpringBoot的膳食搭配营养学知识智能问答小程序的实现毕业设计项目源码

2026/8/27 17:58:16

联系博主 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 …

这样图解Transformer应该没人看不懂了吧——Transformer工作原理

这样图解Transformer应该没人看不懂了吧——Transformer工作原理

2026/8/27 17:58:16

前言 本文将深入剖析Transformer的内部工作原理,详细研究其运作细节。 我们将通过实际的矩阵表示和形状,观察数据如何在系统中流动,并理解每个阶段进行的计算。 本文目标不仅是理解Transformer是如何工作的,更要探究它为何如此…

本地部署DeepSeek R1 + Ollama + XRAG:三步搭建RAG系统,并解锁全流自动化评测

本地部署DeepSeek R1 + Ollama + XRAG:三步搭建RAG系统,并解锁全流自动化评测

2026/8/27 17:58:16

引言 如何科学的评估RAG系统,对于RAG系统的性能优化至关重要。为此,本文提供了一个详细操作指南,帮助用户使用Ollama本地部署最新的DeepSeek R1模型,并使用最新的XRAG1.0框架来构建RAG系统并评估你的本地RAG知识库系统。 这一过程…

RustDesk部署到linux(自建服务器)

RustDesk部署到linux(自建服务器)

2026/8/27 17:58:16

简介 ‌RustDesk‌是一款开源的远程桌面软件,由中国开发者开发,使用Rust编程语言构建。它支持跨平台运行,可以在Windows、macOS、Linux、iOS、Android和Web等多个平台上使用。RustDesk的主要功能包括远程桌面访问、文件传输、文本聊天等&…

程序员必藏:LLM无法逾越的五大理论天花板,为何“大力出奇迹“已到尽头?

程序员必藏:LLM无法逾越的五大理论天花板,为何“大力出奇迹“已到尽头?

2026/8/27 17:48:16

前言 “大力出奇迹”——这似乎已成为AI领域的黄金法则。从GPT-1的1.17亿参数到GPT-4的万亿级别,模型规模的指数级增长带来了惊人的能力涌现。我们似乎相信,只要数据够多、参数够大,一切问题都能被“暴力”解决。 然而,一篇由谷…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…