飞桨x昇腾生态适配方案:10_ONNX转OM

简介: 本章节主要介绍如何将ONNX模型转化为昇腾AI处理器支持的OM模型,并进行离线推理。通过昇腾张量编译器(ATC),可实现静态OM、动态BatchSize、动态分辨率、动态维度及动态shape等多种模型转换。文中详细说明了ATC工具的使用方法、参数配置、命令格式以及常见问题解决方法,同时提供了具体示例和可视化工具辅助输入参数确认,帮助用户高效完成模型转换与部署。

本章节介绍 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

转换成功:
01_ONNX转静态OM.png

输出结果

执行完毕后,OM 模型会被保存在 ./inference/om/路径下:

inference/om/
    └── det.om           # OM模型文件

常见问题

命令行格式问题

报错信息:
02_命令行格式问题.png

解决方法:删除“=”后的空格。

input_shape设置错误

报错信息:
03_input_name设置错误.png

解决方法:修改input_shape中的input_name改成x(以模型实际的input_name为准)。

查看模型input_shape

使用ONNX模型可视化工具(https://netron.app/)查看模型的input_shape,如下图所示:

  • 进入netron工具,加载model.onnx模型:
    04_加载model.onnx模型.png

  • 点击“properties”
    05_点击“properties”.png

  • 查看模型input_shape

06_查看模型input_shape.png

INPUTS参数说明:
x:input_name
p2o.DynamicDimension.0:批次大小,对应NCHW格式中B,可设置动态
3:通道数 (排列方式BGR) ,对应NCHW格式中C,为固定值
p2o.DynamicDimension.1:图像高度,对应NCHW格式中H,可设置动态
p2o.DynamicDimension.2:图像宽度,对应NCHW格式中W,可设置动态

动态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模型文件

转换成功:
07_动态BatchSize转OM.png

常见问题

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

报错信息:
08_非BatchSize参数设为-1.png

错误原因:动态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 : 选ND
dynamic_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

转换成功:
09_动态分辨率转OM.png

输出结果

执行完毕后,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

报错信息:
10_非分辨率参数设为-1.png

错误原因:动态分辨率场景,除分辨率外,其它参数不能设置为-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 : 选ND
dynamic_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

转换成功:
11_动态维度转OM.png

输出结果

执行完毕后,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 : 选ND
input_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

转换成功:
12_动态shape转OM.png

输出结果

执行完毕后,OM 模型会被保存在 ./inference/om/路径下:

inference/om/
    └── dynamic_shape_det_linux_aarch64.om          # OM模型文件
目录
相关文章
|
5月前
|
编解码 人工智能 API
飞桨x昇腾生态适配方案:12_动态OM推理
本文介绍了基于Ascend AI平台的OM模型动态推理方法,包括动态BatchSize、动态分辨率、动态维度及动态Shape四种场景,支持固定模式与自动设置模式。通过`ais_bench`工具实现推理,提供示例命令及输出结果说明,并解决常见问题(如环境变量未设置、输入与模型不匹配等)。此外,还提供了API推理指南及参考链接,帮助用户深入了解ONNX离线推理流程、性能优化案例及工具使用方法。
241 0
|
5月前
|
API Python
飞桨x昇腾生态适配方案:13_API离线推理
ais_bench 提供了基于昇腾硬件的 Python API,用于离线模型(.om模型)推理。支持静态与动态API场景,如单个或多个OM模型推理。通过 `InferSession` 类加载模型并执行推理,可灵活处理输入输出形状转换。示例代码涵盖图片读取、形状调整、多模型串联推理及资源释放等操作,满足多样化推理需求。
301 26
|
6月前
|
容器
vllm+vllm-ascend本地部署QwQ-32B
本指南介绍如何下载、安装和启动基于Ascend的vLLM模型。首先,可通过华为镜像或Hugging Face下载预训练模型;其次,安装vllm-ascend,支持通过基础镜像(如`quay.io/ascend/vllm-ascend:v0.7.3-dev`)或源码编译方式完成;最后,使用OpenAI兼容接口启动模型,例如运行`vllm serve`命令,设置模型路径、并行规模等参数。适用于大模型推理场景,需注意显存需求(如QwQ-32B需70G以上)。
2324 17
|
5月前
|
人工智能 测试技术 API
飞桨x昇腾生态适配方案:11_静态OM推理
昇腾AI推理工具`ais_bench`基于ACL开发,支持命令行快速推理与性能测试(吞吐率、时延等),并提供相关API。用户需下载适配环境的`aclruntime`和`ais_bench`的whl包后通过pip安装。设置环境变量后,可通过多种场景使用工具:纯推理(默认输入全0数据)、调试模式(获取详细参数与耗时信息)、文件/文件夹输入(指定Numpy文件或目录)、以及多Device并行推理。例如,BERT模型需按顺序传入三个文件夹对应其输入参数。工具输出包括吞吐率、耗时等关键指标,助力高效模型性能评估。
253 0
|
4月前
|
前端开发 开发工具 C++
离线推理全流程&模型调优
本指南详细介绍小模型推理方案,涵盖从模型转换到推理的全流程。包括ATC架构转换、ModelZoo-PyTorch指导文档、ONNX导出与优化、离线及在线推理等环节。特别针对Chinese_CLIP模型,提供上机操作指导,如模型支持度分析、onnx-sim简化、msit surgeon优化、AOE自动调优和模型压缩等步骤。
离线推理全流程&模型调优
|
7月前
|
并行计算 开发工具 git
NPU上运行onnxruntime
在Ascend环境下使用onnxruntime推理时,若安装了GPU版本的onnxruntime(`onnxruntime-gpu`),可能会因缺少CUDA组件报错。正确做法是卸载`onnxruntime-gpu`,并根据官方文档适配NPU,通过源码构建支持CANN的onnxruntime whl包。具体步骤为克隆onnxruntime源码,使用`--use_cann`参数构建,并安装生成的whl包。最后,配置CANNExecutionProvider进行推理。
|
5月前
|
机器学习/深度学习 PyTorch 算法框架/工具
飞桨x昇腾生态适配方案:00_整体方案介绍
本文详细介绍PaddlePaddle与NPU的适配工作,涵盖训练与推理支持、性能优化及离线推理方案。PaddleCustomDevice作为适配层,支持主流模型(详见飞桨-昇腾模型列表),多数性能媲美V100,部分调优模型接近0.8*A800。硬件适配主要针对A2芯片,A1兼容但310系列建议离线推理。提供常用模型仓链接及整体方案导览,包括环境准备、算子适配、性能调优和Paddle转ONNX/OM等内容。
246 0
|
3月前
|
编解码 文字识别 API
InternVL3开源:7种尺寸覆盖文、图、视频处理,多模态能力扩展至工业图像分析
4月11日,OpenGVLab开源发布InternVL3系列多模态大模型,涵盖1B至78B共7个尺寸。相比InternVL 2.5,其在多模态感知与推理能力上表现更优,并新增工具使用、GUI代理等功能。得益于原生多模态预训练,文本性能超越Qwen2.5系列。
319 0
|
5月前
|
Python
飞桨x昇腾生态适配方案:15_loop算子缺失(下):for循环替换loop
本章节基于上一内容,将ONNX模型拆分为loop算子部分与非loop算子部分,分别转换为OM模型。通过使用for循环替换loop算子的计算逻辑,构造子图执行流程,并编写OM模型推理脚本进行验证。同时,编写ONNX模型推理脚本对比两者推理结果,确保一致性。实验结果表明,拆分后的OM模型与原始ONNX模型推理结果一致,证明方案可行。
168 27
|
5月前
|
JSON 数据格式 AI芯片
飞桨x昇腾生态适配方案:14_loop算子缺失(上):ONNX模型拆分
本文针对NPU不支持LOOP算子的问题,提出一种解决方案:将ONNX模型拆分为含LOOP算子和不含LOOP算子的子图,单独推理LOOP部分。通过构造包含LOOP算子的ONNX模型,将其转换为JSON格式提取子图,并对子图进行修改(如添加输入节点、删除无关节点)。最后,将JSON转回ONNX格式,完成模型切分与优化。此方法适用于关键路径上的LOOP算子,可有效解决离线推理中的兼容性问题。
292 26