viable/strict/1789816992: [dynamo] Match CPython semantics in operator.length_hint (#196901)
PyTorch 发布 viable/strict/1789816992 版本说明,修复 torch.compile 的 Dynamo 在 operator.length_hint 上与 CPython 语义不一致的问题。原实现 BuiltinVariable.call_length_hint 直接返回 __length_hint__ 原始结果,未实现 CPython PyObject_LengthHint 的后处理:NotImplemented 未回退为 default、非 int 未抛 TypeError、负值未抛 ValueError、超出 ssize_t 未抛 OverflowError,default 也未做 __index__ 转换与范围检查,且 __len__ 抛出的 TypeError 未清除错误并回退到 __length_hint__。改动后 call_length_hint 镜像 PyObject_LengthHint,对 default 做 pynumber_index 转换与 ssize_t 范围检查。
Development
- First Reportviable/strict/1789816992: [dynamo] Match CPython semantics in operator.length_hint (#196901)PyTorch Core
- Current Assessment该修复属于 PyTorch 编译器与 CPython 语义一致性的持续收敛工作,反映 torch.compile 在走向生产可用时,主要成本正从算子覆盖转向边界语义与异常路径的对齐。对依赖 torch.compile 的框架与库而言,这类静默分歧比显式报错更难排查,因此上游把语义对齐作为独立修复项发布,是编译器成熟度提升的信号。Agent Pulse · analysis
PyTorch 在 viable/strict/1789816992 的发布说明中记录了一项 Dynamo 修复:torch.compile 与 eager 模式在 operator.length_hint 上存在静默分歧。该函数位于 list.extend、list.__init__、deque 以及 _PyList_AppendTakeRef 风格预分配的 hot path 上。原 Dynamo 实现直接返回 __length_hint__ 的原始结果,未复现 CPython PyObject_LengthHint 的后处理,导致四类情况静默给出错误答案而非回退:NotImplemented 被当作 hint 返回、非 int 原样返回、负值原样返回、超出 ssize_t 原样返回;同时 default 未做 __index__ 转换与范围检查,__len__ 抛出的 TypeError 也未清除错误并回退。修复后 call_length_hint 镜像 PyObject_LengthHint。
这是编译期语义对齐问题而非性能问题:Dynamo 在 trace 时把 length_hint 当作可内联的 builtin,若不复现 CPython 的异常与回退路径,编译结果会与 eager 产生静默差异,且错误发生在预分配尺寸上,可能影响后续容器行为。可验证的下一信号是 PyTorch 是否补充针对 NotImplemented、非 int、负值、超 ssize_t 与 default 越界的回归测试,以及是否将同类 PyObject_* 语义对齐纳入 Dynamo 的一致性测试集。
该修复属于 PyTorch 编译器与 CPython 语义一致性的持续收敛工作,反映 torch.compile 在走向生产可用时,主要成本正从算子覆盖转向边界语义与异常路径的对齐。对依赖 torch.compile 的框架与库而言,这类静默分歧比显式报错更难排查,因此上游把语义对齐作为独立修复项发布,是编译器成熟度提升的信号。
对使用 torch.compile 的团队,这类修复降低 eager 与编译模式行为不一致带来的线上排查成本,尤其在依赖 list.extend、deque 等容器预分配路径的数据加载与批处理代码中。价值不在新增能力,而在减少难以复现的静默错误,属于稳定性收益。
若 PyTorch 继续以逐函数方式对齐 CPython 语义,可预期后续版本会扩大 Dynamo 一致性测试覆盖,并可能将此类分歧纳入发布前的 strict 检查流程。观察点是后续 release note 中是否出现成批的语义对齐条目,而非零散单点修复。