torchscript 生成可序列化、脱离 python 的 ir,非简单动静图转换;script 适合含控制流模型,trace 适用于固定结构前馈网络;报错需改写列表推导、加类型注解、慎用辅助函数;保存加载须版本一致且用 torch.jit.load。

PyTorch 的 TorchScript 不是“把动态图转成静态图”的翻译器,而是通过 torch.jit.script 或 torch.jit.trace 生成可序列化、可脱离 Python 运行的中间表示(IR),它仍保留 PyTorch 的语义和执行逻辑——但不再依赖 Python 解释器。
什么时候该用 torch.jit.script 而不是 torch.jit.trace
torch.jit.trace 只记录一次前向执行路径,对含控制流(if、for)、输入 shape 变化或非 tensor 输入敏感;torch.jit.script 则解析源码 AST,支持完整 Python 子集(如条件分支、循环、自定义类),更适合带逻辑分支的模型。
- 用
torch.jit.script:模型里有if x.shape[0] > 1:、for layer in self.layers:、或调用了自定义torch.nn.Module方法 - 用
torch.jit.trace:纯前馈网络(如 ResNet、CNN)、输入 shape 固定、无 Python 控制流,且你只关心单次推理路径 - 混合用法常见:先
torch.jit.script处理主干模块,再用torch.jit.trace包裹数据预处理部分(因预处理常含 NumPy 或 PIL 操作,无法 script)
torch.jit.script 报错 “Unsupported operation: list comprehension” 怎么办
TorchScript 不支持原生 Python 列表推导式、字典推导、**kwargs 解包、或未标注类型变量。错误往往出现在模型 __init__ 或 forward 中构造 list/dict 的地方。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 把
[x * 2 for x in inputs]改成显式torch.stack([x * 2 for x in inputs])或用torch.cat+ 循环 - 给所有非 tensor 属性加类型注解:
self.num_layers: int = 4,否则 TorchScript 推断为Any并失败 - 避免在
forward中调用未被@torch.jit.export标记的辅助函数;若必须用,先用@torch.jit.ignore排除(但该函数将不可导、不参与编译)
保存和加载 TorchScript 模型时的兼容性陷阱
torch.jit.save 生成的 .pt 文件包含模型结构、权重和 TorchScript IR,但不包含原始 Python 源码或依赖项——这意味着跨 PyTorch 版本加载可能失败,尤其在 1.x 和 2.x 之间。
- 始终用与训练环境**相同版本**的 PyTorch 加载:
torch.jit.load("model.pt")若报version mismatch,别硬试,重导出 - 不要用
torch.load()加载.pt文件(那是用于state_dict的),必须用torch.jit.load() - 若需部署到 C++,用
model.save("model.pt")后,在 C++ 端调用torch::jit::load("model.pt"),注意链接libtorch的 ABI 版本要匹配
真正难的不是导出这一步,而是导出后发现模型行为和原始 Python 版不一致——比如某个 torch.where 在 trace 里被固化为常量分支,或 torch.no_grad() 上下文没被正确捕获。务必用同一组输入,对比原始模型和 ScriptModule 的输出 tensor 值(逐元素 torch.allclose),而不是只看形状或 dtype。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










