作者:昇腾实战派

小模型在NPU上的推理部署: 【知识地图】

引言

在边缘计算和端侧AI应用蓬勃发展的今天,如何在资源有限的设备上实现高效、低延迟的模型推理,成为开发者面临的关键挑战。昇腾(Ascend)NPU 作为国产AI硬件的代表,以其高能效比备受关注。而 AISBENCH 正是华为为昇腾平台量身打造的轻量级推理工具链,特别适合小模型在边缘设备上的部署。

本文将带你从零开始,一步步完成 YOLOv5 模型在昇腾 NPU 上的完整部署流程,并提供可直接运行的代码示例。


什么是 AISBENCH?

AISBENCH 是昇腾平台面向轻量级模型推出的端侧推理工具集,它集成了模型转换、图优化、量化压缩与运行时调度等核心功能。与通用的推理框架相比,AISBENCH 专门针对小模型的特点进行了深度优化:

  • 极轻量:内存占用与二进制体积极小,适合嵌入式场景
  • 低延迟:优化数据流与算子调度,推理速度更快
  • 易用性:提供一键式编译工具,简化部署流程
  • 高能效:支持功耗与性能的平衡调节,延长设备续航

环境准备与版本配套

重要提示

ais_bench 推理工具包含两个部分:aclruntime包ais_bench推理程序包。安装前请务必注意以下事项:

  • 确保网络畅通
  • CentOS 平台默认的 gcc 4.8 可能无法安装,建议升级 gcc 版本

推荐安装方式

对于大多数开发者,建议直接使用 昇腾官方镜像,可省去复杂的环境配置:

更多安装说明:建议访问 ais_bench 官方仓库 获取最新安装指南。


部署实战:YOLOv5 模型部署全流程

步骤1:模型准备与转换

  1. 获取原始模型

    # 克隆 YOLOv5 官方仓库
    git clone https://github.com/ultralytics/yolov5.git
    cd yolov5
    
    # 导出 ONNX 格式
    python export.py --weights yolov5s.pt --include onnx --imgsz 640
    
  2. 转换为昇腾 OM 格式
    使用昇腾 ATC 工具将 ONNX 转为 OM:

    atc --model=yolov5s.onnx \
        --framework=5 \
        --output=yolov5s \
        --input_shape="images:1,3,640,640" \
        --soc_version=Ascend310P3 \
        --log=info
    

步骤2:AISBENCH Python API 推理实现

完整示例代码
import cv2
import numpy as np
import torch
from ais_bench.infer.interface import InferSession
from ultralytics.data.augment import LetterBox

class YOLOv5NPUInference:
    def __init__(self, model_path, device_id=0):
        """
        初始化 NPU 推理会话
        Args:
            model_path: OM 模型路径
            device_id: NPU 设备ID
        """
        self.session = InferSession(device_id, model_path)

    def preprocess(self, image_path, target_size=(640, 640)):
        """
        图像预处理(保持 YOLOv5 原始预处理逻辑)
        """
        # 读取图像
        img = cv2.imread(image_path)
        if img is None:
            raise ValueError(f"无法读取图像: {image_path}")

        original_img = img.copy()

        # 使用 LetterBox 进行预处理(保持长宽比)
        img = LetterBox(target_size, auto=False)(image=img)

        # 转换通道顺序 HWC -> CHW
        img = img.transpose(2, 0, 1)
        img = np.ascontiguousarray(img)

        # 归一化并添加 batch 维度
        img = torch.from_numpy(img).float() / 255.0
        img = img.unsqueeze(0)

        return img.numpy(), original_img

    def inference(self, image_path):
        """
        执行推理
        """
        # 1. 预处理
        input_data, original_img = self.preprocess(image_path)

        # 2. NPU 推理
        outputs = self.session.infer([input_data])

        # 3. 后处理(示例,需根据实际模型输出调整)
        predictions = self.postprocess(outputs[0], original_img.shape)

        return predictions, original_img

    def postprocess(self, output, img_shape):
        """
        后处理:将输出转换为检测结果
        注:此处为简化示例,实际需根据 YOLOv5 输出格式完整实现
        """
        # 获取原始图像尺寸
        original_h, original_w = img_shape[:2]

        # 示例:假设输出格式为 [batch, num_detections, 6]
        # 其中最后维度为 [x1, y1, x2, y2, confidence, class]
        detections = []

        for det in output[0]:
            if det[4] > 0.25:  # 置信度阈值
                # 将归一化坐标转换回原始图像尺寸
                x1 = int(det[0] * original_w)
                y1 = int(det[1] * original_h)
                x2 = int(det[2] * original_w)
                y2 = int(det[3] * original_h)

                detections.append({
                    'bbox': [x1, y1, x2, y2],
                    'confidence': float(det[4]),
                    'class_id': int(det[5])
                })

        return detections

更多学习资源

总结

本文详细介绍了使用 AISBENCH 在昇腾 NPU 上部署轻量化模型的完整流程,从环境配置到实际推理,提供了代码示例。主要步骤包括:

  1. 环境准备:选择合适的安装方式,推荐使用官方镜像
  2. 模型转换:使用 ATC 工具将 ONNX 转为 OM 格式
  3. 推理实现:利用 AISBENCH Python API 加载并执行模型
  4. 性能优化:通过基准测试和参数调优提升推理效率

随着昇腾边缘计算生态的不断完善,AISBENCH 将成为轻量化模型在国产 AI 硬件上部署的重要选择。无论是智能制造、自动驾驶,还是智能安防、物联网设备,这种高能效的部署方案都能为边缘 AI 应用提供坚实的技术支撑。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐