RuntimeError: expected data_ptr to be aligned to 16 bytes

该报错通常出现在 MoE 模型走 grouped matrix multiplication(grouped_mm)优化路径时,输入或权重张量的 stride / data_ptr 对齐不满足内核要求,却被 dispatcher 错误地路由到 grouped_mm,最终由 PyTorch 抛出运行时

快速结论:该报错通常出现在 MoE 模型走 grouped matrix multiplication(grouped_mm)优化路径时,输入或权重张量的 stride / data_ptr 对齐不满足内核要求,却被 dispatcher 错误地路由到 grouped_mm,最终由 PyTorch 抛出运行时异常;优先排查张量布局与 DeepSpeed 参数扁平化导致的对齐问题。

适用环境:Transformers 当前 main 分支;PyTorch grouped matrix multiplication 路径 src/transformers/integrations/moe.py;BF16 数据类型;涉及 DeepSpeed ZeRO/BF16 参数扁平化的场景。

最快修复方案:暂无确认的一步修复方案。Issue 中提出的方向是让 _can_use_grouped_mm() 同时校验 grouped-mm 的 stride 兼容性与非 CPU data_ptr() 的 16 字节对齐,不满足时回退到已有的 fallback 实现,相关修复尚在 Draft PR #48645 中评审。

注意事项:回退到 fallback 会放弃 grouped_mm 的优化,可能带来一定性能损失;上述修复方向来自 Draft PR,尚未合并验证,实际效果需以合并后的版本为准。

问题场景

用户在运行 MoE(Mixture of Experts)模型时,Transformers 的 grouped matrix multiplication 集成路径会调用 _can_use_grouped_mm() 决定是否使用 torch.nn.functional.grouped_mm / torch._grouped_mm。当专家权重经过转置、或使用 DeepSpeed ZeRO/BF16 参数扁平化后,张量的 stride 或存储偏移不再满足内核的对齐要求,但仍被分发到 grouped_mm,从而触发运行时失败。

报错原文

RuntimeError: expected data_ptr to be aligned to 16 bytes

原因分析

可能原因有两个层面:

第一,_can_use_grouped_mm() 此前只检查 grouped-mm 可用性、设备支持、dtype/compile 约束以及部分指针对齐情况,没有校验输入和权重张量的 stride 对齐要求。例如 BF16 下相关 stride 需按 8 个元素(16 字节)对齐,而转置后的 1025 宽权重会违反该要求,却仍可能被选中走 grouped_mm。

第二,PyTorch 的 grouped-mm 输入校验要求非 CPU 张量的 data_ptr() 满足 16 字节对齐。DeepSpeed ZeRO/BF16 参数扁平化会合法地把参数重绑定为扁平 buffer 的视图,其 stride 依然有效,但参数起始偏移可能不是 16 字节对齐,此时 dispatcher 仍返回 True,PyTorch 便抛出上述 RuntimeError。

环境排查

  • 确认 Transformers 版本是否为当前 main,grouped_mm 集成代码位于 src/transformers/integrations/moe.py
  • 确认 PyTorch 版本是否包含 grouped_mm 路径,以及是否支持 torch.nn.functional.grouped_mm / torch._grouped_mm
  • 确认数据类型是否为 BF16,并检查输入与权重张量的 stride 是否满足 8 元素(16 字节)对齐。
  • 如使用 DeepSpeed,确认是否启用 ZeRO 与 BF16 参数扁平化,并检查参数视图的存储偏移是否 16 字节对齐。
  • 确认 GPU 设备类型与型号是否满足 grouped-mm 设备支持条件(Issue 未给出具体显卡信息)。

解决步骤

  1. 先确认当前触发路径:检查 MoE 前向中 _can_use_grouped_mm() 是否对当前输入/权重返回了 True。
  2. 检查权重张量是否为转置视图,例如 torch.empty(4, 512, 1025, dtype=torch.bfloat16).transpose(-2, -1),并打印其 stride,确认最后一维 stride 不满足 16 字节对齐。
  3. 若使用 DeepSpeed ZeRO/BF16,检查被扁平化重绑定的参数视图,确认其 data_ptr() 起始偏移是否 16 字节对齐。
  4. 在等待上游修复期间,可优先尝试绕过 grouped_mm 优化路径,让该场景走已有的 fallback 实现(具体开关以你所使用版本的入口为准)。
  5. 关注 Draft PR #48645:该修复会在选择优化内核前同时校验 grouped-mm stride 兼容性与非 CPU data_ptr 对齐,不满足时自动回退。

验证方法

构造一个带有效 stride 但存储偏移未对齐的扁平 expert-weight 视图,确认 dispatcher 不再选择 grouped_mm,而是回退到已有实现,并且回退结果在数值上与预期一致(Issue 中提到回归测试正是这样验证的)。对转置权重场景,确认 _can_use_grouped_mm() 返回 False,且不再出现 RuntimeError: expected data_ptr to be aligned to 16 bytes

参考来源

huggingface/transformers #48644

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22943

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注