本章节介绍 ONNX 模型如何转化为 OM 模型,并在昇腾 AI 处理器上做离线推理。
昇腾张量编译器(Ascend Tensor Compiler,简称 ATC)是异构计算架构 CANN 体系下的模型转换工具, 它可以将开源框架的网络模型或 Ascend IR 定义的单算子描述文件(json 格式)转换为昇腾 AI 处理器支持的.om 格式离线模型。ATC 功能详见:https://www.hiascend.com/document/detail/zh/canncommercial/80RC2/devaids/auxiliarydevtool/atlasatc_16_0001.html
设置环境变量
ATC 工具内置在 cann-toolkit 中,因此使用时需设置 ascend-toolkit 环境变量:
source /usr/local/Ascend/ascend-toolkit/set_env.sh
复制代码
ONNX 转静态 OM
命令格式
atc --framework=5 --model=XXX --output=XXX \
--input_format=XXX --input_shape=model_input_name:model_input_shape \
--log=error --soc_version=Ascend${chip_name}
复制代码
参数说明
--framework : 5 代表 ONNX 模型--model : ONNX 模型文件路径与文件名--output : 输出的 OM 模型文件路径与文件名--input_format : 可以选 NCHW or ND--input_shape : 模型输入的 shape--log : log 日志有 debug/info/warning/error/null 级别--soc_version : 指定模型转换时昇腾 AI 处理器的版本(可通过 npu-smi info 命令查看处理器版本)特别说明:把 log 设置成 debug,然后配合 export ASCEND_GLOBAL_LOG_LEVEL=0 和 export ASCEND_SLOG_PRINT_TO_STDOUT=1 可以重定向具体日志,方便定位问题。
执行转换
atc --framework=5 --model=inference/det_onnx/model.onnx --output=inference/om/det \
--input_format=NCHW --input_shape=x:1,3,224,224 \
--log=error --soc_version=Ascend910B4
复制代码
转换成功:
输出结果
执行完毕后,OM 模型会被保存在 ./inference/om/路径下:
inference/om/
└── det.om # OM模型文件
复制代码
常见问题
命令行格式问题
报错信息:
解决方法:删除“=”后的空格。
input_shape 设置错误
报错信息:
解决方法:修改 input_shape 中的 input_name 改成 x(以模型实际的 input_name 为准)。
查看模型 input_shape
使用 ONNX 模型可视化工具(https://netron.app/)查看模型的input_shape,如下图所示:
动态 BatchSize 转 OM
命令格式
atc --model=$HOME/module/resnet50.onnx --framework=5 \
--output=$HOME/module/out/resnet50 --soc_version=<soc_version> \
--input_shape="input_name:-1,3,224,224" --dynamic_batch_size="1,2,4,8" \
--log=error
复制代码
特定参数说明:dynamic_batch_size: 输入动态 BatchSize 的具体值
执行转换
atc --model=./inference/det_onnx/model.onnx --framework=5 \
--output=./inference/om/dynamic_batch_size_det --soc_version=Ascend910B4 \
--input_shape="x:-1,3,256,256" --dynamic_batch_size="1,2,4,8" \
--log=error
复制代码
输出结果
执行完毕后,OM 模型会被保存在 ./inference/om/路径下:
inference/om/
└── dynamic_batch_size_det.om # OM模型文件
复制代码
转换成功:
常见问题
input_shape 设置错误
错误命令:
atc --model=./inference/det_onnx/model.onnx --framework=5 \
--output=./inference/om/dynamic_batch_size_det --soc_version=Ascend910B4 \
--input_shape="x:-1,3,-1,-1" --dynamic_batch_size="1,2,4,8" \
--log=error
复制代码
报错信息:
错误原因:动态 BatchSize 场景,除 BatchSize 外,其它参数不能设置为-1 解决方法:--input_shape 设置为:"x:-1,3,256,256"
动态分辨率转 OM
命令格式
atc --model=$HOME/module/resnet50.onnx --framework=5 \
--output=$HOME/module/out/resnet50 --soc_version=<soc_version> \
--input_shape="input_name:1,3,-1,-1" --dynamic_image_size="224,224;448,448" \
--log=error
复制代码
特定参数说明:input_format : 选 NDdynamic_image_size : 输入动态分辨率的具体值
执行转换
atc --model=./inference/det_onnx/model.onnx --framework=5 \
--output=./inference/om/dynamic_image_size_det --soc_version=Ascend910B4 \
--input_shape="x:1,3,-1,-1" --dynamic_image_size="224,224;448,448" \
--log=error
复制代码
转换成功:
输出结果
执行完毕后,OM 模型会被保存在 ./inference/om/路径下:
inference/om/
└── dynamic_image_size_det.om # OM模型文件
复制代码
常见问题
input_shape 设置错误
错误命令:
atc --model=./inference/det_onnx/model.onnx --framework=5 \
--output=./inference/om/dynamic_image_size_det --soc_version=Ascend910B4 \
--input_shape="x:-1,3,-1,-1" --dynamic_image_size="224,224;448,448" \
--log=error
复制代码
报错信息:
错误原因:动态分辨率场景,除分辨率外,其它参数不能设置为-1 解决方法:--input_shape 设置为:"x:1,3,-1,-1"
动态维度转 OM
命令格式
atc --model=$HOME/module/resnet50.onnx --framework=5 \
--output=$HOME/module/out/resnet50 --soc_version=<soc_version> \
--input_shape="input_name:-1,3,-1,-1" --dynamic_dims="1,224,224;8,448,448" \
--input_format=ND --log=error
复制代码
特定参数说明:input_format : 选 NDdynamic_dims : 输入动态维度的具体值
执行转换
atc --model=./inference/det_onnx/model.onnx --framework=5 \
--output=./inference/om/dynamic_dims_det --soc_version=Ascend910B4 \
--input_shape="x:-1,3,-1,-1" --dynamic_dims="1,224,224;8,448,448" \
--input_format=ND --log=error
复制代码
转换成功:
输出结果
执行完毕后,OM 模型会被保存在 ./inference/om/路径下:
inference/om/
└── dynamic_dims_det.om # OM模型文件
复制代码
动态 shape 转 OM
命令格式
atc --framework=5 --model=XXX --output=XXX --input_format=ND \
--input_shape="input_name_0:1~10,32,208,208;input_name_1:16,64,100~208,100~208" \
--log=error --soc_version=Ascend${chip_name}
复制代码
特定参数说明:input_format : 选 NDinput_shape : 设置输入的动态 shape 范围
执行转换
atc --model=./inference/det_onnx/model.onnx --framework=5 \
--output=./inference/om/dynamic_shape_det --soc_version=Ascend910B4 \
--input_shape="x:1~8,3,224~448,224~448" \
--input_format=ND --log=error
复制代码
转换成功:
输出结果
执行完毕后,OM 模型会被保存在 ./inference/om/路径下:
inference/om/
└── dynamic_shape_det_linux_aarch64.om # OM模型文件
复制代码
评论