torch.compile()是PyTorch 2.0推荐的运行时图优化方式,替代torch.jit.script()/trace(),但不可序列化;需配合torch.export.export()导出部署,且不支持data-dependent控制流、Python list/dict中间变量等。

torch.compile() 替代 torch.jit.script() 和 torch.jit.trace()
PyTorch 2.0 引入 torch.compile() 作为默认推荐的图优化方式,它比 torch.jit.script() 和 torch.jit.trace() 更通用、更易用,且通常性能更好。但不能简单替换——torch.compile() 是运行时编译,不生成可序列化的模型对象。
- 如果你原来用
torch.jit.script(model)导出模型供部署,现在需改用torch.export.export()(PyTorch 2.0+ 的新导出 API),或回退到torch.jit.script()(仍可用,但非推荐路径) -
torch.compile()不支持所有 Python 控制流(如含 data-dependent 条件的if),遇到torch._dynamo.exc.Unsupported错误时,优先加dynamic=True或用torch.compile(..., backend="eager")快速定位问题 - 编译后模型不能直接保存为
.pt文件;若需持久化,得先用torch.export.export()导出,再用torch.export.save()
torch.export.export() 取代旧版 torch.jit.trace() 导出逻辑
PyTorch 2.0 推出 torch.export.export() 作为统一导出接口,目标是替代 torch.jit.trace() 和部分 torch.jit.script() 场景,尤其适合带动态 shape 或 control flow 的模型。
- 输入必须是
torch.Tensor或嵌套的tuple/dict,且需提供示例输入(args),不能传空 tuple 或 None - 不支持任意 Python 函数调用(如
print()、time.sleep()),导出前务必剥离调试代码 - 导出后得到
ExportedProgram对象,可调用.module()获取可执行模块,或用torch.export.save()存为.pt2文件(注意:不是传统.pt) - 如果原代码依赖
torch.jit.load("model.pt"),现在要改成torch.export.load()+.module(),否则会报AttributeError: 'ExportedProgram' object has no attribute 'forward'
DataLoader 的 num_workers=0 问题在 Windows 上更常见
PyTorch 2.0 对 Windows 下多进程 DataLoader 的兼容性未显著改善,num_workers > 0 仍可能触发 BrokenPipeError 或卡死,尤其配合 torch.compile() 使用时。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
- Windows 用户建议默认设
num_workers=0,除非明确需要加速且已验证稳定性 - Linux/macOS 上若出现
torch._dynamo.exc.BackendCompilerFailed并伴随子进程崩溃,检查是否因DataLoader的 worker 初始化了 CUDA 上下文(避免在 worker 中调用torch.cuda.*) - 使用
torch.utils.data.IterableDataset时,torch.compile()可能无法正确追踪迭代逻辑,建议显式包装成torch.utils.data.Dataset或禁用编译
nn.Module.forward() 中的 Python list/dict 不再被自动跟踪
PyTorch 1.13 允许在 forward 中用普通 Python list 或 dict 存中间结果(例如 losses = []),Dynamo 在多数情况下能处理;但 PyTorch 2.0 默认更严格,这类结构容易触发 torch._dynamo.exc.UncapturedHigherOrderOpError。
立即学习“Python免费学习笔记(深入)”;
- 把中间容器改为
torch.tensor或torch.nn.ModuleList/torch.nn.ModuleDict,尤其当它们参与梯度计算或被传给其他nn.Module时 - 若只是临时收集日志或指标(不参与反向传播),用
@torch.no_grad()包裹相关代码块,或改用torch.compiler.disable()装饰局部函数 - 调试时加环境变量
TORCHDYNAMO_VERBOSE=1,能快速看到哪一行 Python 构造被 Dynamo 拒绝
torch.compile() 默认启用 fullgraph=True,意味着整个 forward 必须能构建成单个静态图——哪怕只有一行 if len(x) > 0: 且 x 长度在训练中变化,就可能失败。别急着删逻辑,先试 dynamic_shapes=True 或拆分编译区域。

















