最近在复现一个基于稀疏注意力机制的研究项目时遇到了一个比较棘手的底层问题,查阅了官方文档和过往的 Issue,暂时没找到解决方案,特来求助。
【环境信息】
- OS: EulerOS 2.10 (ARM64)
- NPU: Ascend 910B (驱动版本 24.1.RC1, CANN 8.0.RC1)
- MindSpore: 2.3.1 (pip install 方式)
- Python: 3.9.18
- 运行模式:
context.set_context(mode=context.PYNATIVE_MODE, device_target="Ascend")
【问题描述】
我编写了一个自定义算子 SparseMaskAttention,用于处理变长序列的掩码计算。该算子在 静态Shape 下前向推理(Forward)和反向梯度(Backward)均正常。
但在开启动态Shape功能后:
执行反向传播 grad_fn 时,程序崩溃,报错信息如下:
【已尝试的排查步骤】
- 检查
infer_shape 函数: 我在自定义算子的 Python 侧重写了 infer_shape,对于动态轴使用了 -1 或 AbstractScalar 进行占位,但似乎只在 Forward 生效,Backward 阶段似乎丢失了动态标记,被固化成了具体数值(32)。 - 对比静态图: 切换回
GRAPH_MODE 并关闭动态Shape,一切正常。 - 查看 CANN 日志: 开启
export MS_ENABLE_LBK=1,发现 TBE 编译生成的算子二进制文件中,反向算子的输入Shape确实被硬编码了。 - 文档查阅: 参考了《自定义算子开发指南》中关于动态Shape的部分,提到需要在
bprop 中显式传递 dyn_shapes 参数,但我按照示例修改后,报错变成了 TypeError: got an unexpected keyword argument 'dyn_shapes',怀疑是 API 在 2.3 版本有变动但未更新文档。
【核心疑问】
- 在 MindSpore 2.3+ 版本中,自定义算子支持 PYNATIVE 模式下的动态Shape反向传播,是否需要在
@cu_op 或 TBE 接口定义中添加特殊的属性标记(如 dynamic_rank 或 dynamic_axes)? - 如果是在 Python 侧实现
bprop,如何正确获取当前 Input 的抽象形状(AbstractShape)而不是具体数值,以确保输出的 Gradient Shape 也是动态的?
附件中贴出了简化后的算子代码片段(省略了具体的数学计算逻辑,只保留了 Shape 推断部分):
是否有大佬遇到过类似 InferShape 在反向阶段动态性丢失的问题?或者是否有最新的 Demo 工程可以参考?
非常感谢!
最近在复现一个基于稀疏注意力机制的研究项目时遇到了一个比较棘手的底层问题,查阅了官方文档和过往的 Issue,暂时没找到解决方案,特来求助。
【环境信息】
context.set_context(mode=context.PYNATIVE_MODE, device_target="Ascend")【问题描述】
我编写了一个自定义算子
SparseMaskAttention,用于处理变长序列的掩码计算。该算子在 静态Shape 下前向推理(Forward)和反向梯度(Backward)均正常。但在开启动态Shape功能后:
执行反向传播
grad_fn时,程序崩溃,报错信息如下:【已尝试的排查步骤】
infer_shape函数: 我在自定义算子的 Python 侧重写了infer_shape,对于动态轴使用了-1或AbstractScalar进行占位,但似乎只在 Forward 生效,Backward 阶段似乎丢失了动态标记,被固化成了具体数值(32)。GRAPH_MODE并关闭动态Shape,一切正常。export MS_ENABLE_LBK=1,发现 TBE 编译生成的算子二进制文件中,反向算子的输入Shape确实被硬编码了。bprop中显式传递dyn_shapes参数,但我按照示例修改后,报错变成了TypeError: got an unexpected keyword argument 'dyn_shapes',怀疑是 API 在 2.3 版本有变动但未更新文档。【核心疑问】
@cu_op或TBE接口定义中添加特殊的属性标记(如dynamic_rank或dynamic_axes)?bprop,如何正确获取当前 Input 的抽象形状(AbstractShape)而不是具体数值,以确保输出的 Gradient Shape 也是动态的?附件中贴出了简化后的算子代码片段(省略了具体的数学计算逻辑,只保留了 Shape 推断部分):
是否有大佬遇到过类似
InferShape在反向阶段动态性丢失的问题?或者是否有最新的 Demo 工程可以参考?非常感谢!