第一次拿到Atlas 200I DK A2开发板时,我对着这个巴掌大的黑色盒子研究了半天。别看它体积小,里面可是藏着华为昇腾310B1芯片,NPU算力高达8TOPS(INT8)。咱们部署YOLOv5的第一步,就是给这个"小钢炮"搭建好开发环境。
开发板出厂时已经预装了Ubuntu 18.04系统,但有几个关键组件需要确认。用网线连接开发板后,通过ssh登录(默认IP是192.168.1.2),先运行npu-smi info命令。如果看到类似下面的输出,说明NPU驱动正常:
bash复制+------------------------------------------------------------------------------+
| npu-smi 21.0.4 Version: 21.0.4 |
+----------------------+---------------+----------------------------------------+
| NPU Name | Health | Power(W) Temp(C) |
| Chip | Bus-Id | AICore(%) Memory-Usage(MB) |
+======================+===============+========================================+
| 0 310B1 | OK | 5.4 45 |
| 0 | 0000:01:00.0 | 0 224/7972 |
+======================+===============+========================================+
接下来要安装CANN工具包(当前推荐5.1.RC2版本),这个相当于NPU的"驱动程序"。我建议直接使用华为提供的Docker镜像,省去一堆依赖问题:
bash复制# 拉取官方镜像
docker pull swr.cn-south-1.myhuaweicloud.com/ascend-share/ascend_ubuntu18.04_aarch64:5.1.RC2
# 启动容器时记得挂载设备
docker run -it --privileged --device=/dev/davinci0 \
--device=/dev/davinci_manager --device=/dev/devmm_svm \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
swr.cn-south-1.myhuaweicloud.com/ascend-share/ascend_ubuntu18.04_aarch64:5.1.RC2 bash
YOLOv5官方提供的.pt模型不能直接在昇腾NPU上运行,需要先转ONNX再转OM格式。这里我踩过最大的坑就是算子兼容性问题——昇腾ATC工具对PyTorch某些算子的支持并不完美。
首先用YOLOv5自带的export.py转换时,务必加上--dynamic参数:
python复制python export.py --weights yolov5s.pt --include onnx --dynamic
转换完成后,强烈建议用Netron打开生成的.onnx文件检查结构。我遇到过这些典型问题:
nearest模式确认ONNX模型没问题后,使用ATC工具转换(注意替换自己的芯片型号):
bash复制atc --model=yolov5s.onnx --framework=5 --output=yolov5s \
--input_format=NCHW --input_shape="images:1,3,640,640" \
--log=error --soc_version=Ascend310B1
转换成功的OM模型会生成三个文件:
.om:模型本体.json:模型描述信息.bin:权重数据虽然NPU推理性能更强,但我建议先用CPU模式快速验证流程。昇腾开发板的Kunpeng 920 CPU性能其实不错,实测YOLOv5s模型在640x640输入下能达到8FPS。
关键步骤就三步:
bash复制su root
bash复制pip install -r requirements.txt
python复制# 原代码是加载.pt文件
model = torch.hub.load('ultralytics/yolov5', 'custom', path='yolov5s.pt')
# 改为加载ONNX模型
model = torch.hub.load('ultralytics/yolov5', 'custom', path='yolov5s.onnx')
这里有个隐藏坑点:OpenCV的版本必须用4.5.4.58,新版会有奇怪的段错误。可以用这个命令指定版本:
bash复制pip install opencv-python==4.5.4.58
切换到NPU推理才是真正的挑战。昇腾提供的MindX SDK性能确实强悍,但接口文档比较零散。经过多次尝试,我总结出这套最佳实践:
首先准备模型配置文件yolov5s.pipeline:
json复制{
"im_yolov5": {
"stream_config": {
"deviceId": "0"
},
"yolov5": {
"props": {
"modelPath": "yolov5s.om",
"labelPath": "coco.names",
"confidence_threshold": "0.5"
}
}
}
}
然后编写推理代码的核心部分:
python复制import mxpi
from mxpi import MxpiDataType
# 初始化流水线
pipeline = mxpi.PipelineManager()
pipeline.init_pipeline("yolov5s.pipeline")
# 图像预处理
resize = mxpi.ImageResize()
resize.set_property("resizeType", "RESIZER_STRETCHING")
resize.set_property("outputWidth", 640)
resize.set_property("outputHeight", 640)
# 创建输入输出端口
input_port = pipeline.create_input_port("input", MxpiDataType.MxpiTensorPackage)
output_port = pipeline.create_output_port("output", MxpiDataType.MxpiTensorPackage)
while True:
# 从摄像头获取帧
ret, frame = cap.read()
if not ret:
break
# 执行推理
input_port.send_data(frame)
result = output_port.get_data()
# 解析检测结果
bboxes = parse_result(result)
draw_boxes(frame, bboxes)
性能优化关键点:
MxpiParallel组件实现多线程预处理deviceId为0使用NPU设备RESIZER_STRETCHING模式保持宽高比实测YOLOv5s模型在NPU上能达到45FPS,是CPU版本的5倍多。内存占用也从1.2GB降到了300MB左右。
要让模型真正跑在生产线或监控场景,还需要解决几个实际问题:
多路视频流处理
建议使用GStreamer管道,比OpenCV的VideoCapture更稳定:
python复制pipeline_str = (
"rtspsrc location=rtsp://admin:password@192.168.1.100 latency=0 "
"! rtph264depay ! h264parse ! omxh264dec ! videoconvert "
"! appsink sync=false"
)
cap = cv2.VideoCapture(pipeline_str, cv2.CAP_GSTREAMER)
动态分辨率适配
不同摄像头可能有不同分辨率,需要动态调整:
python复制def auto_resize(frame, target_size=640):
h, w = frame.shape[:2]
scale = min(target_size / h, target_size / w)
new_h, new_w = int(h * scale), int(w * scale)
return cv2.resize(frame, (new_w, new_h))
异常处理机制
NPU在长时间运行后可能过热,需要监控状态:
python复制def check_npu_health():
output = subprocess.check_output(["npu-smi", "info"])
if b"Temp(C)" in output:
temp = int(output.split(b"Temp(C)")[1].split()[0])
if temp > 85: # 温度阈值
send_alert("NPU过热警告!")
部署完成后,还可以通过量化进一步提升性能。昇腾支持INT8量化,能带来2-3倍的加速:
calibration.cfg:ini复制[calibration]
algorithm = percentile
percentile = 99.99
[input_1]
shape = 1,3,640,640
dtype = float32
bash复制atc --model=yolov5s.onnx --framework=5 --output=yolov5s_int8 \
--input_format=NCHW --input_shape="images:1,3,640,640" \
--log=error --soc_version=Ascend310B1 \
--insert_op_conf=aipp.cfg --precision_mode=allow_mix_precision \
--calibration_file=calibration.cfg
量化后的模型精度损失通常在1-2% mAP左右,但推理速度能提升到60+FPS。对于实时性要求高的场景,这个trade-off非常值得。
最后分享几个只有实际用过才知道的小技巧:
散热优化
这个小开发板没有风扇,连续推理时芯片温度能到90℃。我试过几种方案:
bash复制echo "performance" > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
npu-smi set -t power-policy -i 0 -c 0 -v 1 # 设置为低功耗模式
内存管理
开发板只有8GB内存,处理大分辨率视频时容易OOM。解决方法:
python复制# 在Python代码中定期清理缓存
import gc
gc.collect()
日志调试
遇到诡异错误时,查看详细日志:
bash复制export ASCEND_GLOBAL_LOG_LEVEL=1 # 0-debug, 1-info, 2-warning
export ASCEND_SLOG_PRINT_TO_STDOUT=1