已关闭
医学影像开源模型LayerNorm算子昇腾310系列NPU适配兼容问题 #945
zhoutiezhu创建于  2025年12月15日关闭于  2025年12月29日
zhoutiezhu
2025年12月15日 创建

医学影像开源模型LayerNorm算子昇腾310系列NPU适配兼容问题

Describe the current behavior / 问题描述

在基于Ascend/ModelZoo-PyTorch 开源社区的医学影像领域模型迁移适配过程中,遇到 LayerNorm 算子与昇腾 310 系列 NPU 的兼容问题,具体表现为:

  1. 模型转换阶段:使用 ATC 工具将 ONNX 格式的医学影像模型(如conch、grandqc、ACMIL、mmsegmentation)转换为 OM 模型时,触发 "LayerNorm 算子不支持" 报错,转换流程中断;
  2. 报错显示:Optype [LayerNorm] of Ops kernel [AIcoreEngine] is unsupported. Reason: [tbe-custom]:op type LayerNorm is not found in this op store.
  3. 硬件差异:相同模型、相同操作步骤下,昇腾 910 系列(910B、910C) NPU 可正常完成模型转换与推理,仅 310 系列(310P3)存在该问题;
  4. 影响范围:涉及 Ascend/ModelZoo-PyTorch 社区中 6 类医学影像开源模型,导致相关模型无法在临床常用的 310 系列部署硬件上落地。

Environment / 环境信息

软件版本:

类别 具体版本信息
操作系统 openEuler 24.03 LTS(容器内环境,镜像自带)
芯片架构 昇腾310P3(Ascend310P3)
Python版本 3.11.6(容器内预安装)
CANN版本 8.2.RC1(集成于昇腾官方镜像)
昇腾镜像版本 swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.1.RC1-300I-Duo-py311-openeuler24.03-lts
模型来源 Ascend/ModelZoo-PyTorch开源社区(医学影像分类/分割类模型)
依赖工具版本 ATC工具(镜像内置,版本与CANN一致)、ais_bench 0.0.2、auto-optimizer 1.0

Steps to reproduce the issue / 重现步骤

测试步骤:

1. 环境准备(基于昇腾官方镜像部署)

# 1. 拉取昇腾预安装CANN环境镜像
docker pull swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.1.RC1-300I-Duo-py311-openeuler24.03-lts

# 2. 创建并启动容器(挂载驱动、固件及数据目录)
docker run -itd --privileged --name=medical_layer_norm --net=host --shm-size 100g \
--device=/dev/davinci_manager --device=/dev/hisi_hdc --device /dev/devmm_svm \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /usr/local/sbin:/usr/local/sbin \
-v /home/medical_data:/data \
swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.1.RC1-300I-Duo-py311-openeuler24.03-lts bash

# 3. 进入容器
docker exec -ti medical_layer_norm bash

# 4. 验证昇腾环境可用性
npu-smi info  # 正常输出310P3芯片信息
source /usr/local/Ascend/ascend-toolkit/set_env.sh  # 加载CANN环境变量
atc --version  # 输出ATC工具版本:8.2.RC1

2. 下载开源模型及依赖工具

# 1. 克隆Ascend/ModelZoo-PyTorch仓库(医学影像模型目录)
git clone https://gitee.com/ascend/ModelZoo-PyTorch.git
cd ModelZoo-PyTorch/ACL_PyTorch/built-in/medical/

# 2. 获取目标模型
本地模型,已上传至网盘,需要的话可以后台联系我获取

# 3. 安装模型依赖库
pip3 install torch==2.3.1 torchvision==0.18.1 numpy==1.26.4 onnx==1.15.0

# 4. 安装昇腾辅助工具(auto-optimizer用于算子修改,ais_bench用于推理测试)
git clone https://gitee.com/ascend/msadvisor.git
cd msadvisor/auto-optimizer
pip3 install .
cd ../../

# 安装ais_bench工具
wget https://gitee.com/ascend/tools/raw/master/ais-bench_workload/tool/ais_bench/whl/aclruntime-0.0.2-cp311-cp311-linux_aarch64.whl
wget https://gitee.com/ascend/tools/raw/master/ais-bench_workload/tool/ais_bench/whl/ais_bench-0.0.2-py3-none-any.whl
pip3 install aclruntime-0.0.2-cp311-cp311-linux_aarch64.whl ais_bench-0.0.2-py3-none-any.whl

3. 模型转换(ONNX转OM,触发LayerNorm报错)

# 1. 确认ONNX模型完整性
ls -l conch.onnx  # 大小约1.2GB,正常存在

# 2. 执行ATC转换命令(静态shape配置,适配310P3)
atc --model=conch_resize.onnx --framework=5 --output=conch_om --input_shape="input:1,3,448,448" --soc_version Ascend310P3

Describe the expected behavior / 预期结果 (Mandatory / 必填)

预期结果:
910C-LayerNorm.png

报错日志截图:
310P-LayerNorm.png
ATC模型转换阶段报错日志

[ERROR] GE(98765): [OpValidate][LayerNorm] The LayerNorm operator is not supported on Ascend310P3 soc_version. [FUNC:CheckLayerNormSupport][FILE:layer_norm_op_validate.cc][LINE:456]
[ERROR] GE(98765): [OpValidationFailed] Op LayerNorm_123 validation failed, reason: operator not supported on current soc_version. [FUNC:ValidateOp][FILE:op_validator.cc][LINE:892]
[ERROR] ATC(98765): [ModelConvert][ConvertGraph] Convert graph failed, error code: 1343225857. [FUNC:ConvertGraph][FILE:model_convertor.cc][LINE:1024]
ATC run failed, please check the log for details.

Special notes for this issue/备注 (Optional / 选填)

是否910系列支持,310系列目前不支持呢?

likedislike
Zzhoutiezhu
2025年12月15日 修改了issue 的描述
Zzhoutiezhu
2025年12月15日 修改了issue 的描述
Zzhoutiezhu
2025年12月15日 修改了issue 的描述
All_Fun
All_Fun
2025年12月16日 评论:

LayerNorm 算子当前仅支持Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件
您可以通过在转换前修改ONNX模型,将LayerNorm替换为等效的基本操作来规避这个问题

likedislike
zhoutiezhu
2025年12月16日 评论:

LayerNorm 算子当前仅支持Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件
您可以通过在转换前修改ONNX模型,将LayerNorm替换为等效的基本操作来规避这个问题

@Deng_RH

请问是否有建议的等效替代算子,因为我们查了一下有BatchNorm算子不知310P3是否支持,其次批量归一化与层归一化差别较大,需要改动整个ONNX模型结构,我们担心改了之后还是不行或对推理准确性有一定影响;最好是给我们提供一个案例或可行的算子替代解决方案我们去尝试,多谢了~

likedislike
All_Fun
All_Fun
2025年12月16日 评论:
likedislike
zhoutiezhu
2025年12月16日 评论:

自定义了一个layernorm层.png
目前我们这边通过自定义了一个归一化算子绕过了该算子不兼容的问题,但是转动态batch-size失败了,烦请看看是什么原因,有没有推荐的解决方法?
动态batchsize报错.png

likedislike
All_Fun
All_Fun
2025年12月16日 评论:

自定义了一个layernorm层.png
目前我们这边通过自定义了一个归一化算子绕过了该算子不兼容的问题,但是转动态batch-size失败了,烦请看看是什么原因,有没有推荐的解决方法?
动态batchsize报错.png

@zhoutiezhu

你动态batch设置的是--dynamic_batch_size="1,2,4,6,8" ,模型内部存在中间层的动态维度 [-2],ATC工具不支持

likedislike
zhoutiezhu
2025年12月16日 评论:

自定义了一个layernorm层.png
目前我们这边通过自定义了一个归一化算子绕过了该算子不兼容的问题,但是转动态batch-size失败了,烦请看看是什么原因,有没有推荐的解决方法?
动态batchsize报错.png

@zhoutiezhu

你动态batch设置的是--dynamic_batch_size="1,2,4,6,8" ,模型内部存在中间层的动态维度 [-2],ATC工具不支持

@Deng_RH

这里还是想用动态的batchsize,大佬,有没有什么解决途径?

likedislike
All_Fun
All_Fun
2025年12月16日 评论:

自定义了一个layernorm层.png
目前我们这边通过自定义了一个归一化算子绕过了该算子不兼容的问题,但是转动态batch-size失败了,烦请看看是什么原因,有没有推荐的解决方法?
动态batchsize报错.png

@zhoutiezhu

你动态batch设置的是--dynamic_batch_size="1,2,4,6,8" ,模型内部存在中间层的动态维度 [-2],ATC工具不支持

@Deng_RH

这里还是想用动态的batchsize,大佬,有没有什么解决途径?

@zhoutiezhu

https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/23.0.RC2/Application Development Guide/tmuacop/tmuacop_0018.html
参考一下这个文档修改ATC命令,使用完整的动态输入设置

likedislike
zhoutiezhu
2025年12月16日 评论:

自定义了一个layernorm层.png
目前我们这边通过自定义了一个归一化算子绕过了该算子不兼容的问题,但是转动态batch-size失败了,烦请看看是什么原因,有没有推荐的解决方法?
动态batchsize报错.png

@zhoutiezhu

你动态batch设置的是--dynamic_batch_size="1,2,4,6,8" ,模型内部存在中间层的动态维度 [-2],ATC工具不支持

@Deng_RH

这里还是想用动态的batchsize,大佬,有没有什么解决途径?

@zhoutiezhu

https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/23.0.RC2/Application Development Guide/tmuacop/tmuacop_0018.html
参考一下这个文档修改ATC命令,使用完整的动态输入设置

@Deng_RH

再打扰一下,该链接下没有动态输入的完整命令示例,我们尝试修改后无果;我可以提供离线模型动态BatchSize转换的命令如下:atc --framework=5 --model=model_zoo/conch_custom.onnx --output=conch_dynamic --input_shape="input:-1,3,448,448" --dynamic_batch="1,2,4,6,8" --soc_version=Ascend310P3
麻烦大佬帮忙看看提供我们修改后的正确转换命令~

likedislike
All_Fun
All_Fun
2025年12月16日 评论:

自定义了一个layernorm层.png
目前我们这边通过自定义了一个归一化算子绕过了该算子不兼容的问题,但是转动态batch-size失败了,烦请看看是什么原因,有没有推荐的解决方法?
动态batchsize报错.png

@zhoutiezhu

你动态batch设置的是--dynamic_batch_size="1,2,4,6,8" ,模型内部存在中间层的动态维度 [-2],ATC工具不支持

@Deng_RH

这里还是想用动态的batchsize,大佬,有没有什么解决途径?

@zhoutiezhu

https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/23.0.RC2/Application Development Guide/tmuacop/tmuacop_0018.html
参考一下这个文档修改ATC命令,使用完整的动态输入设置

@Deng_RH

再打扰一下,该链接下没有动态输入的完整命令示例,我们尝试修改后无果;我可以提供离线模型动态BatchSize转换的命令如下:atc --framework=5 --model=model_zoo/conch_custom.onnx --output=conch_dynamic --input_shape="input:-1,3,448,448" --dynamic_batch="1,2,4,6,8" --soc_version=Ascend310P3
麻烦大佬帮忙看看提供我们修改后的正确转换命令~

@zhoutiezhu

添加一下ND格式支持试试 atc --framework=5 --model=model_zoo/conch_custom.onnx \ --output=conch_dynamic \ --input_shape="input:-1,3,448,448" \ --input_format=ND \ # 添加ND格式支持 --dynamic_batch_size="1,2,4,6,8" \ --soc_version=Ascend310P3

likedislike
zhoutiezhu
2025年12月16日 评论:

已解决,多谢~~

likedislike
Zzhoutiezhu
2025年12月16日 issue类型由 Bug-Report 改变为 缺陷
Zzhoutiezhu
2025年12月16日 修改标题为 “医学影像开源模型 LayerNorm 算子昇腾 310 系”,原标题为“[Bug-Report | 缺陷反馈] 医学影像开源模型 LayerNorm 算子昇腾 310 系列 NPU 适配兼容问题”
Zzhoutiezhu
2025年12月16日 修改标题为 “医学影像开源模型LayerNorm算子昇腾310系列NPU适配兼容问题”,原标题为“医学影像开源模型 LayerNorm 算子昇腾 310 系”
Nniushiya成员
2025年12月29日 issue状态由 TODO 改变为 DONE
Nniushiya成员
2025年12月29日 关闭了 issue