泉州免费网站制作,企业公司信息网,网络课程开发,网站设计毕业设计题目推理加速-- torch.compile 一、背景介绍1.2 首次推理速度慢1.3 推理多次之后#xff0c;又会出现一次速度特别慢的情况#xff0c;感觉好像是重新优化 二、如何使用三、其他设置3.1 mode 设置3.2 backend3.3 fullgraph3.4 dynamic 参考资料 一、背景介绍
PyTorch 2.0 官宣了… 推理加速-- torch.compile 一、背景介绍1.2 首次推理速度慢1.3 推理多次之后又会出现一次速度特别慢的情况感觉好像是重新优化 二、如何使用三、其他设置3.1 mode 设置3.2 backend3.3 fullgraph3.4 dynamic 参考资料 一、背景介绍
PyTorch 2.0 官宣了一个重要特性 —— torch.compile这一特性将 PyTorch 的性能推向了新的高度并将 PyTorch 的部分内容从 C 移回 Python。torch.compile 是一个完全附加的可选的特性因此 PyTorch 2.0 是 100% 向后兼容的。
支撑 torch.compile 的技术包括研发团队新推出的 TorchDynamo、AOTAutograd、PrimTorch 和 TorchInductor。
TorchDynamo使用 Python Frame Evaluation Hooks 安全地捕获 PyTorch 程序这项重大创新是 PyTorch 过去 5 年来在安全图结构捕获方面的研发成果汇总AOTAutograd重载 PyTorch 的 autograd 引擎作为一个跟踪 autodiff用于生成 ahead-of-time 向后跟踪PrimTorch将约 2000 多个 PyTorch 算子归纳为一组约 250 个原始算子的闭集开发人员可以将其作为构建完整 PyTorch 后端的目标。这大大降低了编写 PyTorch 功能或后端的流程TorchInductor是一种深度学习编译器可为多个加速器和后端生成快速代码。对于 NVIDIA GPU它使用 OpenAI Triton 作为关键构建块。TorchDynamo、AOTAutograd、PrimTorch 和 TorchInductor 是用 Python 编写的并支持 dynamic shapes无需重新编译就能发送不同大小的向量这使得它们具备灵活、易于破解的特性降低了开发人员和供应商的使用门槛。
1.2 首次推理速度慢
值得注意的是torch.compile函数不会立即对函数进行加速优化而是在第一次运行的时候才进行优化。这就会导致编译后的函数在第一次执行的时候十分缓慢。但是会在第二次执行开始变得非常快。
1.3 推理多次之后又会出现一次速度特别慢的情况感觉好像是重新优化
原因分析 动态推理的原因即输入的tensor是动态的 二、如何使用
一行代码进行使用
modoel_compile torch.compile(model)三、其他设置
def compile(model: Optional[Callable] None, *,fullgraph: builtins.bool False,dynamic: builtins.bool False,backend: Union[str, Callable] inductor,mode: Union[str, None] None,options: Optional[Dict[str, Union[str, builtins.int, builtins.bool]]] None,disable: builtins.bool False) - Callable:Optimizes given model/function using TorchDynamo and specified backend.Args:model (Callable): Module/function to optimizefullgraph (bool): Whether it is ok to break model into several subgraphsdynamic (bool): Use dynamic shape tracingbackend (str or Callable): backend to be usedmode (str): Can be either default, reduce-overhead or max-autotuneoptions (dict): A dictionary of options to pass to the backend.disable (bool): Turn torch.compile() into a no-op for testing3.1 mode 设置
关于mode参数介绍如下
默认default: 适合加速大模型编译速度快且无需额外存储空间reduce-overhead适合加速小模型需要额外存储空间max-autotune编译速度非常耗时但提供最快的加速 未正确设置该参数导致的问题 1推理速度慢 示例
modoel_compile torch.compile(model modereduce-overhead)3.2 backend
backend 编译器后端:API使用哪个后端将中间表示(IR)计算图(FX graph)转换为低级内核操作。这个选项对于调试graph编译问题和更好地理解torch.compile的内部非常有用。在大多数情况下默认的Inductor后端似乎能够提供最佳的训练性能结果。有很多后端列表我们可以使用下面命令查看
from torch import _dynamoprint(_dynamo.list_backends())我们测试使用nvprims-nvfuser后端可以获得比eager模式13%的性能提升(与默认后端28.6%的性能提升相比)。具体区别还是要看Pytorch文档我们这里就不细说了因为文档都有。
3.3 fullgraph
fullgraph 强制单个图:这个参数是非常有用可以确保没有任何不希望的图截断。
3.4 dynamic
dynamic 动态形状:目前 2.0对具有动态形状的张量的编译支持在某种程度上是有限的。编译具有动态形状的模型的一个常见解决方案是重新编译但会大大增加开销并大大降低训练速度。如果您的模型确实包含动态形状将动态标志设置为True将带来更好的性能特别是减少重新编译的次数。
都有什么是动态形状呢最简单的就是时间序列或文本长度不同如果不进行对齐操作的话序列长度不同就是动态的形状。
参考资料
https://www.zhihu.com/question/590338541/answer/2959785643 https://blog.csdn.net/tMb8Z9Vdm66wH68VX1/article/details/130939176