pytorch 中的执行模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch,`with`关键字用于在代码块定义一个上下文管理器。它通常与批处理和数据加载有关,但也可以用于其他目的。 使用`with`关键字可以确保在代码块执行完毕后执行特定的清理操作,例如释放资源或执行必要的清理任务。这在处理大量数据或使用昂贵的资源时特别有用,可以确保资源的正确释放,避免内存泄漏或资源耗尽的问题。 在PyTorch,常见的用法是在批处理上下文使用`with`关键字。批处理是一种常用的数据加载模式,用于批量处理输入数据并将其传递给模型进行训练或测试。通过使用`with`关键字,可以在批处理完成后执行特定的清理操作,例如重置模型参数或清空缓冲区。 以下是一个使用`with`关键字的示例: ```python with torch.no_grad(): # 关闭梯度计算 inputs = ... # 获取输入数据 outputs = model(inputs) # 传递输入数据给模型进行计算 ``` 在上面的示例,`torch.no_grad()`上下文管理器用于关闭模型的梯度计算。这意味着在批处理期间不会对模型参数进行更新,从而避免了梯度计算和参数更新所涉及的计算和内存消耗。 除了批处理上下文,`with`关键字还可以用于其他目的,例如定义临时变量或执行其他需要在代码块执行的特定任务。 需要注意的是,使用`with`关键字时需要确保代码块的正确性,并确保在代码块执行完毕后正确地清理资源。如果不正确地使用`with`关键字,可能会导致资源泄漏或其他问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值