作者:昇腾实战派
小模型在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 兼容的版本)pipinstallonnx==1.20.0onnxruntime==1.23.2 onnxruntime-cann==1.23.2准备 ONNX 模型
请前往 Ultralytics 官网 下载 YOLOv5 模型,并使用官方脚本导出为 ONNX 格式。
使用 ONNX Runtime + CANN 进行推理
以下为关键步骤的代码示例,展示了如何使用 onnxruntime_cann 在昇腾 NPU 上加载模型并进行推理。
1. 初始化模型
importonnxruntimeasortdefload_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)returnsession2. 预处理
importcv2importnumpyasnpimporttorchfromultralytics.data.augmentimportLetterBoxdefpreprocess_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 CHWimage=np.ascontiguousarray(image)image=torch.from_numpy(image).float()/255.0image=image.unsqueeze(0)# 添加 batch 维度returnimage.numpy(),original_image3. 推理
# 加载模型model_path="yolov5s.onnx"device_id=0# NPU 设备 IDsession=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 为例进行简单展示:
fromultralytics.utils.nmsimportnon_max_suppressiondefpostprocess(prediction,original_shape,input_shape):# 使用非极大值抑制pred=non_max_suppression(prediction,conf_thres=0.25,iou_thres=0.45)# 将检测框映射回原图尺寸fordetinpred:ifdetisnotNoneandlen(det):det[:,:4]=scale_boxes(input_shape,det[:,:4],original_shape).round()returnpred更多资源
更多详细使用教程请参考 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 推理部署的重要选择。