作者​:昇腾实战派
知识地图​:https://blog.csdn.net/Lumos_Lovegood/article/details/161601003

背景概述

在 PyTorch 框架中,nn.attention.flex_attention 是一个通过 torch.compile 和 Triton 生成代码来运行的内部接口,用于实现灵活的注意力机制。NPU 环境下该接口在部分场景下存在兼容性问题。

本文记录了在 NPU 环境下适配 flex_attention 接口的完整过程,包括问题定位、解决方案及最终结论。


问题复现

测试命令

ASCEND_RT_VISIBLE_DEVICES=4 python test_dynamo_distributed.py -v -k 'test_compiled_flex_attention_full_model_ddp'
ASCEND_RT_VISIBLE_DEVICES=4 python test_dynamo_distributed.py -v -k 'test_compiled_flex_attention_local_ddp'

测试文件路径

/home/ops-debug/test00/pytorch/test/distributed/test_dynamo_distributed.py

测试用例

  • test_compiled_flex_attention_full_model_ddp
  • test_compiled_flex_attention_local_ddp

定位过程

1. 理解 FlexAttention 机制

查阅 PyTorch 官方文档,FlexAttention 是一个纯软件层实现的内部接口,不直接依赖底层驱动(如 CUDA Driver 或 NPU Driver),而是通过 torch.compile 和 Triton 生成代码来运行。

2. 初步排查设备类型检查

查看源码发现,flex_attention 函数内部执行了一个名为 _validate_device 的验证函数,该函数硬编码了对设备类型的检查,且发生在任何 torch.compiletorch.npu 逻辑之前。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

flex_attention.py 中的 _validate_device 函数不支持 npu 类型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3. 尝试绕过设备检查

  • 尝试将 device = "cuda" 修改为 device = "npu",但报错无变化。
  • 尝试通过添加环境变量或 Monkey Patch 绕过检查,同样无效。

4. 解决方案:添加 NPU 支持补丁

在测试代码初始化中应用补丁,添加对 "npu" 类型的支持。


新报错及解决

新报错 1:缺少 triton 和 pybind11module

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决方案:安装 triton-ascend 包。

pip install triton-ascend-3.4.0.dev2026012522

新报错 2:TypeError: ‘>=’ not supported between instances of ‘NoneType’ and ‘int’

File "/opt/_internal/cpython-3.10.18/lib/python3.10/site-packages/torch/utils/_triton.py", line 72, in cuda_extra_check
    return device_interface.Worker.get_device_properties().major >= 7
TypeError: '>=' not supported between instances of 'NoneType' and 'int'

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同时出现:

torch._dynamo.exc.InternalTorchDynamoError: TypeError: '>=' not supported between instances of 'NoneType' and 'tuple'

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决思路:修改 _triton.py 中的设备检查逻辑,使其兼容 NPU 环境。

新报错 3:ModuleNotFoundError: No module named ‘triton.language.extra.ascend’

手动设置 TRUE 后出现:

ModuleNotFoundError: No module named 'triton.language.extra.ascend'

更新 triton_ascendtriton_ascend-3.4.0.dev2026031112 无效。

解决方案triton.language.extra.ascend 已更名为 triton.language.extra.cann,需要更新 PTA 包至 2.7.1 版本。

pip install torch-npu-2.7.1.post4.dev20260312

新报错 4:SubgraphLoweringException: Buffers cannot be created while lowering a pointwise subgraph.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该错误属于模型编译优化过程中的具体实现问题,为 torch_npu 在支持 flex_attention 功能时的一个潜在限制,不影响功能。
该限制将在9月底的版本中予以支持,需满足pytorch版本>=2.13。


总结

本文详细记录了在 NPU 环境下适配 PyTorch flex_attention 接口的完整过程,包括:

  1. 设备类型检查的绕过与补丁
  2. triton 依赖的安装与版本适配
  3. 设备属性检查的兼容性修改
  4. 模块路径变更的适配
  5. 编译优化阶段的算子 fallback 问题
  6. 预计在9月底完整支持 flex_attention 的能力
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐