pytorch 源码阅读(1)——torch.complie

0 torch.complie(model, fullgraph, dynamic, backend, mode, options, disable),使用 TorchDynamo 和指定的后端优化给定的模型/函数

对于在编译区域内执行的每一帧,都会尝试编译,并将编译结果缓存到代码对象中,供将来使用。 如果之前的编译结果不适用于后续调用那么单帧可能会被编译多次,这被称为 guard_failure,此时可以使用 TORCH_LOGS=guards 来进行调试。

TorchDynamo 是一个设计用于加速未修改的 PyTorch 程序的 Python 级即时(JIT)编译器。它通过 Python Frame Evaluation Hooks(Python 框架评估钩子)来实现这一目标,以便在运行时动态地生成和优化代码。这使得 TorchDynamo 可以有效地处理各种 Python 代码,包括包含控制流(如循环和条件语句)的代码,而无需进行任何修改。

1 参数说明

torch.complie(model, fullgraph, dynamic, backend, mode, options, disable)

  • model(callable):需要进行优化的模型或者函数
  • fullgraph(bool):是否可以将模型分解为多个子图
  • dynamic (bool or None): 使用动态 shape 进行 tracing
    • True:尝试生成尽可能动态的 kernel,但这个也不总是有效的,因为某些特化优化会使动态 kernel 失效
    • False:将不生成任何动态的 kernel,只进行特化优化
    • None:默认值,会自动检测是否发生了动态变化,并在重新编译时编译一个更动态的动态内核。
  • backend (str or Callable):使用的后端
    • inductor,默认的后端,在性能和开销之间有较好的平衡
    • 可以使用 torch._dynamo.list_backends() 查看非实验性树内后端
    • 可使用 torch._dynamo.list_backends(None) 查看实验性或调试性的树内后端
    • 注册树外后端的方式:https://pytorch.org/docs/main/compile/custom-backends.html
  • mode(str),可以配置的值:"default", "reduce-overhead", "max-autotune" or "max-autotune-no-cudagraphs"
    • default:默认模式,在性能和开销之间进行很好的平衡
    • reduce-overhead:降低开销模式,小 batch 的场景比较有用,降低 python 使用 CUDA garphs 的开销。降低开销的代价是使用更多的内存,因为会缓存调用所需的工作区内存,这样就在后续运行中无需重新分配。减少开销并不能保证一定有效,只是减少了不改变输入的 CUDA graphs 的开销。在 CUDA graphs 不适用的其他情况下,可以使用 TORCH_LOG=perf_hints 来进行 debug。
    • max-autotune:利用基于 Triton 的矩阵乘法和卷积的模,默认开启 CUDA graphs。
    • max-autotune-no-cudagraphs:与 max-autotune 模式类似,但是不开启 CUDA graphs。
    • 调用 torch._inductor.list_mode_options() 可以查看每个模式的具体配置。
  • options (dict): 传递给后端的一些字典选项,一些值得尝试的配置:
    • epilogue_fusion,将点对点融合设置到模板中,需要同时设置max_autotune
    • max_autotune,通过配置文件选择最佳的 matmul 配置
    • fallback_random,在调试精度问题的时候比较有用
    • shape_padding,填充矩阵形状,以便更好地调整 GPU 上的负载,尤其是张量内核的负载
    • triton.cudagraphs,可减少 Python 在使用 CUDA graphs 时的开销
    • trace.enabled,最好用的 debug 选项,建议打开
    • trace.graph_diagram,将显示融合后的 graph 的图片
    • 可以通过调用 torch._inductor.list_options() 查看支持的全部配置列表
  • disable (bool): 将 torch.compile 设置为 no-op 的测试模式

2 额外说明

  • 这个函数一开始有这么一行:_C._log_api_usage_once("torch.compile"),这个是用来进行调试的。

    • _C._log_api_usage_once("torch.compile"),这是严格意义上的调试,很可能大部分使用都是在 facebook 内部进行的。如果设置环境变量PYTORCH_API_USAGE_STDERR=1,就能看到 PyTorch 记录了 "涉及 PyTorch 的哪些部分",这很可能会在出现意外情况时大致知道该去哪里找(以及找谁)。这个函数出现的原因是 pytorch 现在的规模已经很多大了,往往会出现很多意想不到的交互调用,这个函数可以帮助缩小 debug 的范围。
  • 这个函数的作用是使用 TorchDynamo 和指定的后端优化给定的模型/函数,进行包装和参数配置的设置,最终会调用torch._dynamo.optimize进行优化处理。

相关推荐
IvorySQL12 小时前
从双解析器到循环工程:IvorySQL 五年技术演进路线的深度观察
大数据·数据库·人工智能·postgresql·开源
测试老哥12 小时前
Pytest自动化测试详解
自动化测试·软件测试·python·测试工具·测试用例·pytest·接口测试
ZZZMMM.zip12 小时前
演示架构师-PPT大纲生成的HarmonyOS开发实践
人工智能·华为·powerpoint·harmonyos·鸿蒙·鸿蒙系统
青岛前景互联信息技术有限公司12 小时前
以新标准为底座,前景互联打造高危场景智能接处警新体系
大数据·网络·人工智能
2601_9568657712 小时前
怎么用AI生成带货视频?电商内容创作工具推荐与选择思路
人工智能·aigc·音视频
正在走向自律12 小时前
怎样区分人工智能、离身智能、具身智能、智能机器人与人形机器人
人工智能·机器人·具身智能·人形机器人·智能机器人·离身智能
MEIXIFU112 小时前
深夜里的温暖灯塔与便捷生活
大数据·人工智能·生活·迭代加深
坚持学习前端日记12 小时前
国产化适配全流程适配英伟达本地开发
人工智能·python
执笔论英雄12 小时前
【;Agent】SWEET-RL:在协同推理任务上训练多轮大语言模型智能体
人工智能·语言模型·自然语言处理
一个王同学12 小时前
从零到一 | CV转多模态大模型 | week17 | LLM 推理优化 & vLLM 详解
人工智能·深度学习·算法·机器学习·计算机视觉·vllm