推理加速 --- torch.compile

文章介绍了PyTorch2.0中的torch.compile特性,该特性通过TorchDynamo等技术提升性能,但首次推理可能较慢。文章详细讲解了如何使用,包括mode、backend设置以及处理动态形状的方法。

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

一、背景介绍

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 optimize
        fullgraph (bool): Whether it is ok to break model into several subgraphs
        dynamic (bool): Use dynamic shape tracing
        backend (str or Callable): backend to be used
        mode (str): Can be either "default", "reduce-overhead" or "max-autotune"
        options (dict): A dictionary of options to pass to the backend.
        disable (bool): Turn torch.compile() into a no-op for testing
    """

3.1 mode 设置

关于mode参数介绍如下:

  • (默认)default: 适合加速大模型,编译速度快且无需额外存储空间
  • reduce-overhead:适合加速小模型,需要额外存储空间
  • max-autotune:编译速度非常耗时,但提供最快的加速
  • 未正确设置该参数导致的问题:
    1)推理速度慢
  • 示例
modoel_compile = torch.compile(model, mode="reduce-overhead")

3.2 backend

backend 编译器后端:API使用哪个后端将中间表示(IR)计算图(FX graph)转换为低级内核操作。这个选项对于调试graph编译问题和更好地理解torch.compile的内部非常有用。在大多数情况下,默认的Inductor后端似乎能够提供最佳的训练性能结果。有很多后端列表,我们可以使用下面命令查看:

from torch import _dynamo
 print(_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

<think>好的,用户的问题是关于如何解决PyTorch中的DeprecationWarning,特别是用torch.compile替代TorchScript的功能优化器。首先,我需要确认用户提到的警告具体是什么样子的,可能是在使用旧版的TorchScript功能优化器时出现的。根据PyTorch的更新,TorchScript的功能优化器已经被弃用,推荐使用torch.compile来替代。 接下来,我需要回忆PyTorch的文档和相关资料,了解torch.compile的使用方法。TorchScript的功能优化器可能指的是之前通过torch.jit.script或者类似的方法来优化模型执行效率,但现在PyTorch引入了torch.compile作为更高效且易用的替代方案。 用户需要的是具体的替换方案和示例代码。首先,应该解释为什么会出现这个警告,然后说明如何修改代码。例如,原来的代码可能使用了torch.jit.script来编译模型,现在应该改用torch.compile。同时,可能需要调整一些参数,比如设置mode参数为'default'、'reduce-overhead'或'max-autotune',以优化性能。 另外,用户可能关心如何验证替换后的效果,比如提升运行速度或减少警告。需要提供示例代码,展示旧方法和新方法的对比,并说明如何测试性能差异。例如,使用timeit模块测量执行时间,或者检查警告是否消失。 还需要注意用户提到的环境配置,比如引用了XTuner和相关库的安装命令,这可能意味着用户在使用特定的深度学习框架或工具,需要确保torch.compile与这些工具兼容。可能需要提醒用户检查PyTorch的版本是否满足要求,因为torch.compile是在PyTorch 2.0及更高版本中引入的。 最后,总结步骤:识别弃用警告的来源,替换旧代码为torch.compile,调整参数优化性能,验证结果,并处理可能的兼容性问题。同时,生成相关问题帮助用户进一步理解,比如如何选择mode参数,调试编译后的模型,或处理其他弃用警告。</think>在 PyTorch 中遇到与 TorchScript 功能优化器相关的弃用警告时,可以通过以下步骤替换为 $torch.compile$ 进行优化: 1. **警告原因分析** TorchScript 的功能优化器(如基于脚本的静态图优化)已被标记为弃用,推荐使用动态图优化工具 $torch.compile$。该工具通过即时编译(JIT)技术实现更高效的执行[^1]。 2. **代码改造示例** ```python # 旧方法(触发警告) model = torch.jit.script(model) # 新方法(使用 torch.compile) model = torch.compile(model, mode="reduce-overhead") # 模式可选:default/reduce-overhead/max-autotune ``` 3. **性能优化验证** ```python # 测试编译效果 with torch.no_grad(): compiled_model = torch.compile(model) # 首次运行触发编译(耗时较长) output = compiled_model(input_tensor) # 后续运行使用优化后的计算图 start_time = time.time() for _ in range(100): output = compiled_model(input_tensor) print(f"Average time: {(time.time()-start_time)/100:.6f}s") ``` 4. **兼容性处理** 若遇到动态控制流(如循环、条件分支),建议添加装饰器 $@torch.compile(backend="eager")$ 逐步调试。注意需要 PyTorch ≥ 2.0 版本支持该特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值