小模型在昇腾NPU上的推理部署:【ONNX 模型快速部署】
本文为开发者提供一份实用指南,演示如何利用与华为 CANN的对接能力,将通用 ONNX 模型快速部署到昇腾 AI 处理器(NPU)上进行高效推理。通过标准化的中间格式和高效的执行提供者,实现一次导出、多处部署,是拥抱国产 AI 硬件生态的便捷路径。什么是 ONNX Runtime CANN?是一个跨平台的高性能推理引擎,支持多种硬件后端。CANN是华为昇腾 AI 处理器的计算架构。两者的结合点在于
作者:昇腾实战派
小模型在NPU上的推理部署: 【知识地图】
背景概述
本文为开发者提供一份实用指南,演示如何利用 ONNX Runtime 与 华为 CANN 的对接能力,将通用 ONNX 模型快速部署到昇腾 AI 处理器(NPU)上进行高效推理。通过标准化的中间格式和高效的执行提供者,实现一次导出、多处部署,是拥抱国产 AI 硬件生态的便捷路径。
什么是 ONNX Runtime CANN?
ONNX Runtime (ORT) 是一个跨平台的高性能推理引擎,支持多种硬件后端。CANN 是华为昇腾 AI 处理器的计算架构。两者的结合点在于 ONNX Runtime 的 CANN Execution Provider (EP)。
该执行提供者使得 ONNX Runtime 能够将计算图或算子直接调度到昇腾 NPU 上执行。其核心优势在于:
- 标准化:基于开放的 ONNX 模型格式,避免框架锁定
- 高性能:利用 CANN 的图编译和算子优化能力
- 易部署:无需重新训练,只需一次模型转换
- 多后端支持:同一套 API 可灵活选择 CPU/GPU/NPU 等不同后端
关键前提:版本配套与环境要求
建议使用 昇腾官方 CANN 镜像 创建容器并安装 onnxruntime 和 onnxruntime-cann。
部署实践:以 YOLOv5 模型为例
环境准备:安装 ONNX Runtime CANN
建议在昇腾 NPU 开发环境或官方 Docker 容器中进行。
# 1. 进入昇腾开发环境(假设已安装 CANN)
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 2. 安装 ONNX Runtime(选择与 CANN 兼容的版本)
pip install onnx==1.20.0 onnxruntime==1.23.2 onnxruntime-cann==1.23.2
准备 ONNX 模型
请前往 Ultralytics 官网 下载 YOLOv5 模型,并使用官方脚本导出为 ONNX 格式。
使用 ONNX Runtime + CANN 进行推理
以下为关键步骤的代码示例,展示了如何使用 onnxruntime_cann 在昇腾 NPU 上加载模型并进行推理。
1. 初始化模型
import onnxruntime as ort
def load_model(model_path, device_id):
# 设置 NPU 设备
torch.npu.set_device(f'npu:{device_id}')
providers = [
("CANNExecutionProvider", {
"device_id": device_id,
"arena_extend_strategy": "kNextPowerOfTwo",
"npu_mem_limit": 4 * 1024 * 1024 * 1024,
"enable_cann_graph": True,
}),
]
session = ort.InferenceSession(model_path, providers=providers)
return session
2. 预处理
import cv2
import numpy as np
import torch
from ultralytics.data.augment import LetterBox
def preprocess_image(image_path, target_size=(640, 640)):
original_image = cv2.imread(image_path)
# 使用 LetterBox 进行预处理,保持长宽比
image = LetterBox(target_size, auto=False)(image=original_image)
image = image.transpose(2, 0, 1) # HWC to CHW
image = np.ascontiguousarray(image)
image = torch.from_numpy(image).float() / 255.0
image = image.unsqueeze(0) # 添加 batch 维度
return image.numpy(), original_image
3. 推理
# 加载模型
model_path = "yolov5s.onnx"
device_id = 0 # NPU 设备 ID
session = load_model(model_path, device_id)
# 获取输入输出名称
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name
# 预处理图像
input_image, original_image = preprocess_image("test.jpg")
# 执行推理
outputs = session.run([output_name], {input_name: input_image})
4. 后处理
后处理部分通常包括非极大值抑制(NMS)等操作,此处以 YOLOv5 为例进行简单展示:
from ultralytics.utils.nms import non_max_suppression
def postprocess(prediction, original_shape, input_shape):
# 使用非极大值抑制
pred = non_max_suppression(prediction, conf_thres=0.25, iou_thres=0.45)
# 将检测框映射回原图尺寸
for det in pred:
if det is not None and len(det):
det[:, :4] = scale_boxes(input_shape, det[:, :4], original_shape).round()
return pred
更多资源
更多详细使用教程请参考 ONNX Runtime CANN 官方文档。
总结
本文演示了使用 ONNX Runtime + CANN 在昇腾 NPU 上进行模型推理的核心流程。通过本文提供的示例代码,开发者可以了解如何在昇腾 NPU 上使用 ONNX Runtime CANN 执行提供者加载 ONNX 模型并进行推理。
主要步骤包括:
- 模型初始化:配置 CANNExecutionProvider 并创建推理会话
- 预处理:将输入图像转换为模型所需的格式
- 推理:调用 ONNX Runtime 的 run 方法在 NPU 上执行计算
- 后处理:对模型输出进行解析和转换
本文仅提供了关键步骤的代码片段,完整的部署方案需要根据具体模型和业务需求进行补充。相比直接使用 torch_npu,ONNX Runtime 方案更适合需要跨框架部署、已有 ONNX 格式模型或追求标准化推理流程的场景。
随着 ONNX 生态和 CANN 的不断完善,这一方案将成为昇腾 NPU 推理部署的重要选择。
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐

所有评论(0)