pytorch 中的执行模式

PyTorch支持研究和生产两种模式,其中TorchScript用于模型的序列化和优化,提升性能和可移植性。TorchScript通过tracing和scripting将Python代码转为静态子集,便于部署在多平台。PyTorchJIT则进行编译优化,包括层融合和量化,以适应资源有限的设备。使用TorchScript在GPU上的推理速度可能提高,尤其在小批量处理时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. PyTorch 生态系统

PyTorch 支持 2 种独立的模式来处理研究和生产环境。

两种模式:
PyTorch 中两种主流模式:研究模式, 比如 eager mode 和 生产模式,比如 graph mode 或者script mode)。

科研模式 模式,侧重于易用性与灵活性,主要用于构建模型,易于调试,验证想法,适合科研人员魔改模型;

生产模式: 侧重于性能方面,适合生产,实际工程部署中应用。 (无论之前的script 模式或者 graph 都是为了更好的部署在生产环境中)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2. Script 模式

PyTorch1.0后,可以通过TorchScript的方式创建序列化和可优化的模型。可以通过两种方式,分别是Tracing和Script将一个Python代码转化为TorchScript代码,继而导出相应的模型可以继续被优化,同时被C++所调用,最终实现对生产环境下的支持(考虑到多线程执行和性能原因,一般Python代码并不适合做部署)。

TorchScript 是 PyTorch 中的一项功能,允许您序列化 PyTorch 模型并在各种环境中运行它们。它提供了一种保存经过训练的 PyTorch 模型并将其加载到无 Python 环境甚至不同硬件(例如 GPU、FPGA 或移动设备)上的方法。

与 PyTorch 相比,这有几个优点:

  1. 可移植性:借助 TorchScript,您可以在任何支持 TorchScript 运行时的环境中运行 PyTorch 模型,无论平台或语言如何。

可移植性允许将模型部署在多线程推理服务器、移动设备和汽车中,而这对于 Python 来说是困难的。为了实现这一点,PyTorch 模型需要与任何特定的运行时解耦。

  1. 性能:TorchScript 可以通过融合操作和消除未使用的操作来优化 PyTorch 模型,以加快执行速度。这可以显着提高速度,尤其是在移动电话等资源有限的设备上。

PyTorch JIT 是 PyTorch 的优化 JIT 编译器。它使用运行时信息来优化 TorchScript 模块。它可以自动执行层融合、量化、稀疏化等优化。

  1. 安全性:通过部署 TorchScript 模型,您可以保护您的 PyTorch 代码和模型免遭逆向工程或篡改。

  2. 易于部署:使用 TorchScript,您可以轻松地将 PyTorch 模型部署到生产环境,而无需 Python 环境。

它主要关注在生产用例方面,本节将讨论 TorchScript 相对于 PyTorch(或 Lightning)的优势,并展示如何完成转换.

2.1 Pytorch JIT

PyTorch JIT 是 PyTorch 程序的优化编译器

  • 它是一个轻量级的线程安全解释器
  • 支持轻松编写自定义转换
  • 它不仅仅用于推理,因为它具有自动差异支持

2.2 TorchScript

TorchScript 是 Python 语言的静态高性能子集,专门用于 ML 应用程序。它支持

  1. Complex control flows 复杂的控制流程
  2. Common data structures 常见数据结构
  3. User-defined classes 用户定义的类

2.2.1 torch.jit.trace()

torch.jit.trace 将数据实例和经过训练的 eager 模块作为输入。跟踪器运行提供的模块并记录所执行的张量操作。

该记录被转换为 TorchScript 模块。

它可以重用现有的 eager 模型代码,并且可以使用专有的 torch 张量/操作处理几乎任何程序。

它的主要缺点是省略了所有控制流、数据结构和 python 结构。它还可以在没有任何警告的情况下创建不忠实的表示。始终检查其 IR 以查看它是否正确解析 PyTorch 模型的结构。

2.2.2 torch.jit.script()

torch.jit.script 允许您将代码直接写入 TorchScript。它更冗长,但更通用,只需稍加调整就可以支持大多数 PyTorch 模型。

与跟踪模式相反,您只需将模型/模块的实例传递给 torch.jit.script. 不需要数据样本。

它保留了控制流和其他 Python 结构,看起来更像 Python。它对列表/字典具有一流的支持。

它省略了常量值并且需要类型转换。如果未提供类型,则默认为张量。

对于一次来说,理论太多了,让我们转向代码并查看运行中的跟踪/脚本。

2.3

要更全面地了解 TorchScript,我建议您阅读本教程。

您可以通过调用 to_torchscript 方法轻松将 Lightning 模块转换为 TorchScript。

script = model.to_torchscript()
torch.jit.save(script, "torchscript_model.pt")

经过一些测试,我发现使用 TorchScript 在 GPU 上的推理时间比 PyTorch Lightning 的推理时间低 2 倍。然而,这只发生在小批量(根据我的测试,为 1 或 2)

PyTorch 旨在通过 TorchScript 创建一个从研究到生产的统一框架。 TorchScript 会将您的 PyTorch 模块作为输入,并将其转换为适合生产的格式。

它将更快地运行您的模型并且独立于 Python 运行时。

3. torch.fx 模式

3.1

3.2

3.3

4. 模型量化

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ref

参考:
参考阅读

阅读2

<think>好的,用户想了解PyTorch的图模式的使用方法和工作原理。首先,我需要回忆PyTorch的动态图和静态图模式的区别。动态图模式PyTorch默认的,也就是即时执行,每个操作立即得到结果,便于调试。而静态图模式,也就是图模式,通常指的是通过torch.jit或者TorchScript将模型转换为静态计算图,这样可以在部署时优化性能。 接下来,用户可能需要知道如何切换到图模式。我记得主要有两种方法:使用torch.jit.script装饰器或者通过追踪(tracing)。比如,用torch.jit.trace来运行一个示例输入,记录操作,生成ScriptModule。需要提到两者的区别,比如tracing适合没有控制流的模型,而scripting可以处理更复杂的逻辑。 然后,关于工作原理,静态图会预先构建计算图,优化运行效率,比如融合操作,减少内存访问。但可能牺牲灵活性,调试困难。动态图则相反,灵活但效率较低。需要举例说明,比如在训练时用动态图,部署时用静态图。 用户可能还关心使用场景,比如移动端部署、性能优化时使用图模式。注意事项方面,要提到避免使用Python特有特性,比如动态类型或复杂控制流,否则转换可能失败。可能需要给出示例代码,展示如何用torch.jit.trace转换模型,并保存为.pt文件。 最后,生成相关问题需要考虑用户可能的后续疑问,比如动态图和静态图的比较,性能差异,TorchScript的高级技巧,或者实际应用案例。需要确保问题覆盖常见的使用场景和潜在问题。 检查是否有遗漏点:是否提到@torch.jit.script装饰器?是否有代码示例?是否解释优化原理,比如图优化和算子融合?是否注意事项中的Python限制?确认之后组织内容,分步骤说明方法和原理,保持结构清晰。</think>### PyTorch模式详解 PyTorch的图模式(即静态图模式)通过将动态计算图转换为静态计算图来实现性能优化,常用于模型部署和推理加速。以下是核心概念和使用方法: #### 一、图模式的使用方法 1. **通过`torch.jit.trace`生成静态图** 追踪执行路径生成计算图,适用于无分支的模型结构: ```python import torch class MyModel(torch.nn.Module): def forward(self, x): return x * 2 model = MyModel() example_input = torch.rand(3, 3) traced_model = torch.jit.trace(model, example_input) # 生成静态图 traced_model.save("model.pt") # 保存为独立文件[^1] ``` 2. **使用`@torch.jit.script`装饰器** 直接标注函数或模型类,支持包含控制流的代码: ```python @torch.jit.script def custom_fn(x: torch.Tensor) -> torch.Tensor: if x.sum() > 0: return x * 3 else: return x + 1 ``` #### 二、图模式的工作原理 - **动态图 vs 静态图** 动态图(默认模式)实时构建计算图,便于调试但效率较低;静态图预先编译优化,适合高性能场景[^1]。 - **优化机制** 静态图模式下,PyTorch会进行算子融合、内存复用等优化。例如将连续的`conv2d`和`relu`合并为单一操作,减少显存访问次数[^2]。 - **执行流程** ```mermaid graph LR A[Python代码] --> B{选择模式} B -->|动态图| C[即时执行操作] B -->|静态图| D[编译为中间表示IR] D --> E[执行图优化] E --> F[生成机器码] ``` #### 三、注意事项 1. **数据类型约束** 静态图要求输入类型固定,避免使用`if x is None`等动态类型判断。 2. **Python特性限制** 不支持部分Python特性(如`eval()`、`__dict__`),需改用Tensor操作。 3. **调试方法** 使用`torch.jit.save(traced_model.graph, "model_graph.txt")`导出计算图结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值