[PyTorch] Request a migration path for downstream `_GroupedLinear` integrations after the 2.17 signature change
维护者通常 2 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 5/5
- 预计耗时
- 一周以上
- 新手友好度
- 35/100
- Issue 类型
- 缺陷
- 描述清晰度
- 基本清楚
- 活跃度
- 冷清
调研方向
从 transformer_engine/pytorch/module/grouped_linear.py 开始,检查 f8bda5d0 提交附近的 _GroupedLinear.forward 签名和 linear_fn dispatch。运行列出的 Megatron-Bridge pytest target 以复现 len(False) 失败,然后检查链接的 ModelOpt 和 Megatron-Bridge 兼容性示例。完成的标准是:已记录受支持的迁移或过渡行为,并且已通过针对 wrapped linear_fn 调用的回归测试进行覆盖。
由索引模型根据 Issue 内容生成。
描述
Describe the bug
Transformer Engine 2.17 intentionally changed the private PyTorch _GroupedLinear autograd call layout while making GroupedLinear graph-safe.
TE 2.16:
forward(ctx, inp, non_tensor_args, *weights_and_biases)
# non_tensor_args[0] is m_splits
TE 2.17:
forward(ctx, inp, m_splits, non_tensor_args, *weights_and_biases)
# m_splits is now a separate int64 tensor
# non_tensor_args[0] is use_bias
The change was introduced by f8bda5d0. The public GroupedLinear.forward accepts both list and tensor split inputs, while the internal linear_fn dispatch boundary changed positionally.
We understand that _GroupedLinear is private and that downstream users cannot assume its signature will remain stable. In practice, however, there does not appear to be a public functional or interception API for these use cases, so some downstream integrations currently use this boundary to intercept grouped GEMMs or invoke them with externally owned weights. Upgrading TE alone therefore causes deterministic runtime failures in those integrations.
Two downstream examples are affected:
-
NVIDIA ModelOpt intercepts the grouped-linear function to quantize its input and weights. Its compatibility logic finds
non_tensor_argsin the signature and readsnon_tensor_args[0]asm_splits. With TE 2.17, that value isuse_bias, so calibration fails with:File ".../transformer_engine/pytorch/module/grouped_linear.py", line 1788, in forward out, new_workspaces = linear_fn( File ".../modelopt/torch/quantization/plugins/transformer_engine.py", line 178, in te_grouped_quantized_linear_fn num_gemms = len(args[sig_params.index("non_tensor_args") - ctx_offset][0]) TypeError: object of type 'bool' has no len()Tracking issue: NVIDIA/Model-Optimizer#1940
-
Megatron-Bridge directly calls
_GroupedLinear.apply/forwardwith externally owned grouped adapter weights. The TE 2.16 layout passesx, non_tensor_args, weights..., biases.... Under TE 2.17, the same call is shifted: the old tuple is interpreted asm_splits, the first weight is interpreted asnon_tensor_args, and the remaining weights and biases are mispartitioned. The downstream compatibility fix is NVIDIA-NeMo/Megatron-Bridge#4721.
Steps/Code to reproduce bug
The failure is reproduced by changing only the TE pin in Megatron-Bridge PR #4696:
- Passing baseline:
2.16.0+d64bc14datd64bc14dc87eb658ab98839e4b7687595ee53e2d - Failing version:
2.17.0+2e559f06at2e559f062497bef768dfbe9d7e45548fadeca80a - ModelOpt remains pinned at
nvidia-modelopt==0.44.0rc5
Run:
uv run python -m pytest -s -x \
tests/functional_tests/test_groups/quantization/models/qwen/test_qwen3_moe_quantization_workflow.py::TestQwen3MoeQuantizationWorkflow::test_qwen3_moe_quantization_and_generation_with_expert_parallelism
The first calibration forward fails at the len(False) exception shown above. The same failure occurs on both GB200 and H100 runners. Full failing job: Megatron-Bridge GitHub Actions.
The signature transition can also be confirmed directly:
import inspect
from transformer_engine.pytorch.module.grouped_linear import _GroupedLinear
print(inspect.signature(_GroupedLinear.forward))
Requested guidance / compatibility support
We will update the affected downstream integrations to handle the new layout. To make that migration less disruptive, would the TE maintainers consider publishing a TE 2.17.x patch release with a short-lived transition path for both grouped-linear call layouts?
# Legacy layout used through TE 2.16
(ctx, inp, non_tensor_args, *weights_and_biases)
# Graph-safe layout introduced in TE 2.17
(ctx, inp, m_splits, non_tensor_args, *weights_and_biases)
If practical, the compatibility path could cover both grad-enabled _GroupedLinear.apply and direct no-grad _GroupedLinear.forward dispatch, preserve the correct backward arity, and emit a deprecation warning for the legacy form before it is removed in a later feature release. We are not asking for indefinite compatibility for the private API.
Because wrappers such as ModelOpt intercept the linear_fn boundary before _GroupedLinear.forward executes, compatibility may need to be provided at that dispatch/hook boundary rather than only inside the autograd function. A regression test using a wrapped linear_fn would cover this downstream use case.
If dual-layout support at this private boundary is not feasible, guidance on the intended supported approach—or an equivalent stable functional/interception API—would be equally helpful. Public GroupedLinear owns its parameters, so it is not currently a drop-in replacement for callers that need to supply externally owned grouped weights.
Environment overview (please complete the following information)
- Environment location: GitHub Actions, Docker, GCP GPU runners
- Transformer Engine install: Git source pin resolved by
uv - Passing TE:
2.16.0+d64bc14d - Failing TE:
2.17.0+2e559f06 - Downstream packages: Megatron-Bridge PR #4696 and
nvidia-modelopt==0.44.0rc5
Environment details
- OS: Linux container
- Python: 3.12.3
- Transformer Engine: versions and exact commits listed above
- The full container and runner information is recorded in the linked GitHub Actions job.
Device details
- Reproduced on GB200 and H100 CI runners.
Additional context
The old and new contracts are straightforward for downstream code to distinguish when it owns the call: prefer the explicit m_splits parameter when present, otherwise use non_tensor_args[0]. The harder compatibility case is an interceptor that TE calls through the changed positional boundary, which is why a short TE-side transition window would be valuable.
This report concerns only the grouped-linear signature transition. It is independent of other TE 2.17 packaging or import behavior changes.
- 主要语言
- Python
- 星标
- 3.6k
- 派生
- 851
- 平均合并
- 5 天 1 小时
- 30 天内合并 PR
- 52
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
NVIDIA/TransformerEngine 的其他 Issue
-
[Bug] group_quantize_fp8_blockwise: mbarrier invalidated before other threads finish waiting on it未关闭
难度 2/5 1-3 小时 新手友好度 82/100
NVIDIA/TransformerEngine#3647 ·
维护者通常 2 天内回复
-
[PyTorch] fp8_cs_quantize fake implementation returns a vector inverse scale instead of a scalar可能已有人在做 @sanjana658 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 82/100
NVIDIA/TransformerEngine#3636 · 2 条评论 ·
维护者通常 2 天内回复
-
[Bug] Backend selection picks FA3 for training with head_dim_qk=192 / v_head_dim=128, but FA3 backward cannot run it可能已有人在做 @yuweih205 于 31 天前认领。 未关闭attention
难度 2/5 1-3 小时 新手友好度 85/100
NVIDIA/TransformerEngine#3481 · 4 条评论 ·
维护者通常 2 天内回复
-
bug
难度 2/5 1-3 小时 新手友好度 68/100
NVIDIA/TransformerEngine#2189 · 7 条评论 · 5 个 reaction ·
维护者通常 2 天内回复
-
[PyTorch] CUDA graph RNG registration floods training logs on automatic-registration builds可能已有人在做 @ksivaman 今天认领。 未关闭
难度 4/5 3-5 天 新手友好度 50/100
NVIDIA/TransformerEngine#3645 · 1 条评论 · 已指派 1 人 ·
维护者通常 2 天内回复
查看 NVIDIA/TransformerEngine 的全部 Issue
相似的 Issue
-
bug ready for review
难度 2/5 1-3 小时 新手友好度 86/100
odysseus-dev/odysseus#6641 ·
维护者通常 1 天内回复
-
bug
难度 2/5 1-3 小时 新手友好度 76/100
happypawspillaro/happypaws#78 ·
维护者通常 4 天内回复
-
pydanty:is-working
难度 2/5 1-3 小时 新手友好度 82/100
pydantic/pydantic-ai#10020 ·
维护者通常 1 天内回复
-
Bug
难度 2/5 1-3 小时 新手友好度 78/100
ansible-collections/ibm_zos_core#2650 ·
-
hw: pvc tests: vllm vllm
难度 2/5 1-3 小时 新手友好度 68/100
intel/intel-xpu-backend-for-triton#8362 ·
维护者通常 1 天内回复