作者:昇腾实战派

小模型在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 模型并进行推理。

主要步骤包括:

  1. 模型初始化:配置 CANNExecutionProvider 并创建推理会话
  2. 预处理:将输入图像转换为模型所需的格式
  3. 推理:调用 ONNX Runtime 的 run 方法在 NPU 上执行计算
  4. 后处理:对模型输出进行解析和转换

本文仅提供了关键步骤的代码片段,完整的部署方案需要根据具体模型和业务需求进行补充。相比直接使用 torch_npu,ONNX Runtime 方案更适合需要跨框架部署、已有 ONNX 格式模型或追求标准化推理流程的场景。

随着 ONNX 生态和 CANN 的不断完善,这一方案将成为昇腾 NPU 推理部署的重要选择。

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐