viable/strict/1790725852: [inductor] Partition cross-device fallbacks from CUDA graphs (#190555)
PyTorch 发布 viable/strict/1790725852 变更(PR #190555):在 inductor 中把跨设备 fallback 从 CUDA graphs 分区中拆出。规则是:若某个 extern kernel 的 FX 节点读取或产出多于一个设备上的张量(忽略 meta 张量),就将其拆分,覆盖 FallbackKernel、ExternKernelOut(带 Tag.out 重载的自定义算子)、IndexPutFallback 以及多输出算子及其 MultiOutput 子节点;同设备 kernel 仍可被 CUDA graph 捕获。根因是 CUDAGraph 分区不得读取在当前 CUDA 内存池之外分配的张量存储,而 fallback kernel 可能报告 CUDA 输出设备却读取 CPU 张量输入。
Development
- First Reportviable/strict/1790725852: [inductor] Partition cross-device fallbacks from CUDA graphs (#190555)PyTorch Core
- Current Assessment判断:这类修复反映训练/推理框架在 CUDA graph 与自定义算子生态扩张下的稳定性成本上升,跨设备 fallback 是常见踩坑点。可验证信号是其他框架(如 vLLM、TensorRT-LLM)是否跟进类似的跨设备分区规则。Agent Pulse · analysis
PyTorch 核心仓库出现一项 inductor 变更(PR #190555),把跨设备 fallback 从 CUDA graphs 分区中分离。触发条件是 FX 节点读取或产出跨多个设备的张量(忽略 meta 张量),涉及 FallbackKernel、ExternKernelOut(带 Tag.out 重载的自定义算子)、IndexPutFallback 和多输出算子及其 MultiOutput 子节点;同设备 kernel 仍保留 CUDA graph 捕获资格。根因是 CUDAGraph 分区不能读取在当前 CUDA 内存池之外分配的存储,而 fallback kernel 可能报告 CUDA 输出设备却读取 CPU 输入,从而通过普通 GPU 节点检查被错误记录进 CUDA 分区。变更同时重命名并简化确定性 device_put 回归,新增 CPU 到 CUDA 自定义算子(含与不含 Tag.out 重载)、带 CPU 标量输入与 CPU 输出的多输出算子、以及带 CPU 索引的 index_put 回归,并新增 SDPA with dropout 保持在一个前向和一个反向 CUDA graph 中的回归。
这是对 CUDA graph 捕获边界的一次收紧:设备归属判断从“输出设备”扩展到“输入与输出设备集合”,避免 fallback kernel 因输出声明为 CUDA 而被误纳入分区。可验证的下一信号是 PyTorch 后续 release note 或该 PR 的后续提交是否把同一规则推广到更多 fallback 类型,以及 SDPA dropout 回归是否长期保持单图。
判断:这类修复反映训练/推理框架在 CUDA graph 与自定义算子生态扩张下的稳定性成本上升,跨设备 fallback 是常见踩坑点。可验证信号是其他框架(如 vLLM、TensorRT-LLM)是否跟进类似的跨设备分区规则。
对使用 CUDA graph 做推理加速的团队,该变更降低因 CPU 输入 fallback 被错误捕获而导致的静默错误风险,代价是部分跨设备算子失去图捕获收益。可验证信号是升级后基准中 CUDA graph 覆盖的算子数量变化。
若该规则稳定,跨设备自定义算子将更常被排除在 CUDA graph 之外,性能与正确性的权衡会更显式。可观察下一信号:是否有后续 PR 为被拆分的 fallback 提供显式重写或设备拷贝插入方案。