ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

昇腾Atlas 300V Pro部署YOLOv5全流程:从驱动安装到推理优化

昇腾Atlas 300V Pro部署YOLOv5全流程:从驱动安装到推理优化 如果你最近在搜“atlas”和“atlas部署yolo”大概率是拿到了一块华为昇腾的Atlas推理卡正对着满屏的文档发愁。我前阵子刚在Atlas 300V Pro 24G上把YOLOv5整套流程跑通从硬件确认、驱动安装、模型转换到推理调优踩了不少坑也积累了一些可复用的经验。这篇就按我实际操作的顺序把完整链路拆开讲清楚顺便明确回答那个高频问题Atlas 300V 24G到底是不是运算加速卡以及它跑YOLO到底行不行。1. 先搞清楚Atlas 300V 24G是个什么卡1.1 它不是GPU是一块NPU加速卡“Atlas 300V 24G是运算加速卡吗”——答案是肯定的但它和我们熟悉的NVIDIA GPU是两回事。Atlas 300V Pro是华为昇腾推理卡家族里很能打的一个型号核心芯片是昇腾310P系列板载24GB HBM内存支持FP16和INT8精度推理。和NVIDIA的T4、A10这类推理卡定位类似但它内部的计算单元是AI Core而不是CUDA Core指令集、运行时、开发栈全都不同。这块卡通常以PCIe卡的形式插在标准服务器上被动散热为主典型功耗控制在70多瓦能效比很突出。它的定位是“推理加速卡”不是训练卡所以别指望拿它跑PyTorch训练。做YOLO推理、OCR识别、视频结构化分析、语义分割这类模型部署才是它的主战场。1.2 为什么有人选它而不是NVIDIA现在选Atlas的原因很现实供货稳定、性价比高、国产化生态越来越成熟。单就24GB显存严格说是HBM内存这一点它在处理多路视频流、高分辨率输入、大batch推理时优势明显。同样24G显存的NVIDIA卡价格通常高出一截Atlas 300V Pro在算力和显存之间给了个很实在的平衡点。另外一个现实原因是部署生态。虽然昇腾的CANNCompute Architecture for Neural Networks早年确实给人“难用”的印象但最近几个大版本迭代下来模型转换工具、推理引擎、调优手段都比以前顺滑多了。YOLOv5这类主流检测模型官方和社区都有成熟的转换样例照着做基本能跑通。2. 动手部署前先准备一套干净的运行环境2.1 硬件确认和系统要求拆开服务器前先确认卡有没有被系统识别。开机后进系统用lspci | grep -i ascend或者lspci | grep -i huawei看看能不能看到设备。如果系统里完全找不到卡大概率是物理安装或者PCIe槽位问题先重插再排查。操作系统我建议直接用Ubuntu 20.04或22.04 x86_64这是昇腾生态支持最成熟的组合。内核版本不用刻意追求最新稳定版即可。内存建议至少32G因为推理时CPU端还要做解码、预处理和后处理内存不足会直接影响吞吐。2.2 固件、驱动、CANN三件套的关系刚接触昇腾的人最容易懵的是这三个词固件、驱动、CANN。打个比方固件是卡自己的底层操作系统驱动是操作系统和卡之间的通信管道CANN是跑AI模型需要的开发库和运行时。三者的版本必须严格对应否则会出现“驱动装了但卡状态异常”或者“CANN能装上但推理报错”的怪问题。安装顺序不要乱先固件再驱动最后CANN。官方文档每个版本都会给一张“版本配套表”下载时一定要按这个表来不要一个装最新一个装稳定版。我在第一次装的时候就因为驱动和CANN版本不配套折腾了整整一个下午最后老老实实按配套表全部重装。2.3 安装步骤实录以目前主流的CANN 7.0 RC1版本为例安装流程大概是# 1. 以root用户安装固件 ./Ascend-hdk-310p-npu-firmware_7.0.0.1.0.run --full # 2. 安装驱动 ./Ascend-hdk-310p-npu-driver_7.0.0.1.0.run --full # 3. 重启服务器让驱动生效 reboot # 4. 安装CANN工具包 ./Ascend-cann-toolkit_7.0.RC1_linux-x86_64.run --full # 5. 安装CANN内核相关包按需 ./Ascend-cann-kernels-910b_7.0.RC1_linux-x86_64.run --full安装完成后最关键的验证命令npu-smi info正常情况会输出卡的温度、芯片名称、HBM内存使用量、AI Core利用率等信息。如果看到“Chip Name: Ascend 310P”。HBM内存24G那硬件基本OK。注意npu-smi是昇腾卡的“任务管理器”类似NVIDIA的nvidia-smi。部署完模型后所有性能监控、状态排查都以它的输出为准。另外提醒一句每次开新终端都要执行一遍source /usr/local/Ascend/ascend-toolkit/set_env.sh或者直接写进~/.bashrc否则运行Python脚本时找不到CANN的动态库。3. YOLO模型在Atlas上的转换与部署3.1 为什么不能直接跑PyTorch模型在NVIDIA卡上PyTorch模型往往可以直接用CUDA跑但昇腾NPU不一样它执行的是一种叫OMOffline Model的离线模型格式。所以关键一步就是把PyTorch的权重文件转成OM格式。转换工具叫ATCAscend Tensor Compiler这个工具会把计算图做编译优化生成能在NPU上高效执行的二进制模型。转换链路推荐PyTorch模型 → ONNX → OM。不建议直接用PyTorch导出AIR再转流程更繁琐而且ONNX作为中间格式更容易排查问题。PyTorch能把模型导出成ONNXCANN又对ONNX兼容性做得比较好这条路线最稳。3.2 实操YOLOv5导出ONNX再转OM先导出ONNX。在YOLOv5仓库的目录下找一个训练好的权重文件比如yolov5s.ptpython export.py --weights yolov5s.pt --include onnx --opset 11这里有个小细节opset版本别用太高11是兼容性最好的。我在实际转换中发现opset 13以上偶尔会出现某些算子CANN不认的情况opset 11几乎没出过问题。导出的ONNX还需要做一次简化操作主要是把一些Identity节点、Shape节点清掉减少转换时卡住的概率python -m onnxsim yolov5s.onnx yolov5s_sim.onnx接下来用ATC转OM这是最核心的一步atc --modelyolov5s_sim.onnx --framework5 \ --outputyolov5s_640 \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --logerror参数解释一下--framework5表示输入的是ONNX模型这个值固定是5。--input_shape是模型输入的形状YOLOv5的输入名默认是images1张3通道640×640的图。--soc_version务必和你卡的实际芯片版本一致。Atlas 300V Pro一般是Ascend310P3如果不确定就跑npu-smi info看Chip Name。--logerror让日志只输出错误级避免刷屏。转换完成后会生成一个yolov5s_640.om文件。这一步看着简单实际上80%的部署问题都出在转换前后这个环节后面专门讲坑。3.3 AIPP配置与预处理对齐模型转换时有一个绕不开的概念叫AIPPAI PreProcessing它能让NPU在推理前自动完成图像的缩放、归一化、色域转换等操作。好处是省CPU开销坏处是配置错了结果全错。YOLOv5的预处理逻辑是letterbox缩放→归一化到0到1→RGB通道。如果用AIPP同时处理需要在ATC转换时加一个aipp配置文件aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_w: 640 src_image_size_h: 640 csc_switch: false rbuv_swap_switch: true min_chn_0: 0 min_chn_1: 0 min_chn_2: 0 var_reci_chn_0: 0.003921569 var_reci_chn_1: 0.003921569 var_reci_chn_2: 0.003921569 }其中rbuv_swap_switch: true表示把RGB转成BGR不是写反了昇腾内部默认很多算子的输入layout是BGRAIPP配置是按实际参数写入的具体以模型预处理要求为准。var_reci_chn_x是归一化系数的倒数0.003921569就是1/255。如果你不用AIPP那在推理代码里也必须做一模一样的预处理。我见过很多人模型转换成功、推理也不报错但结果完全是乱的十有八九就是预处理没对齐。3.4 用Python写一个最简推理脚本这里我用的是昇腾官方的ais_bench工具它是目前最省事的推理加载器import numpy as np import cv2 from ais_bench.infer.interface import InferSession model_path yolov5s_640.om session InferSession(device_id0, model_pathmodel_path) def preprocess(img): # letterbox resize到640x640 h, w img.shape[:2] scale min(640 / h, 640 / w) new_w, new_h int(w * scale), int(h * scale) resized cv2.resize(img, (new_w, new_h)) canvas np.zeros((640, 640, 3), dtypenp.uint8) canvas[:new_h, :new_w] resized rgb cv2.cvtColor(canvas, cv2.COLOR_BGR2RGB) rgb rgb.astype(np.float32) / 255.0 # 转成NCHW tensor np.transpose(rgb, (2, 0, 1))[None] return tensor, scale, new_h, new_w img cv2.imread(test.jpg) tensor, scale, new_h, new_w preprocess(img) outputs session.infer(feeds[tensor])[0] # outputs形状一般是 [1, 25200, 85] # 85 cx, cy, w, h, obj_conf, 80个类别置信度后处理部分用OpenCV自带的NMS就行boxes outputs[0][:, :4] scores outputs[0][:, 4] * outputs[0][:, 5:] class_ids np.argmax(scores, axis-1) conf np.max(scores, axis-1) # 过滤低置信度 mask conf 0.45 boxes, conf, class_ids boxes[mask], conf[mask], class_ids[mask] # 转成xyxy格式 boxes_xyxy np.zeros_like(boxes) boxes_xyxy[:, 0] boxes[:, 0] - boxes[:, 2] / 2 boxes_xyxy[:, 1] boxes[:, 1] - boxes[:, 3] / 2 boxes_xyxy[:, 2] boxes[:, 0] boxes[:, 2] / 2 boxes_xyxy[:, 3] boxes[:, 1] boxes[:, 3] / 2 # 调用OpenCV NMS indices cv2.dnn.NMSBoxes( boxes_xyxy.tolist(), conf.tolist(), 0.45, 0.5 )这个脚本跑通意味着YOLO在Atlas上的推理链路已经通了。接下来要做的就是把预处理、推理、后处理包成一个可复用的服务或者接进现有的推理框架。4. 部署过程中踩过的坑与排查实录4.1 模型转换失败一堆算子不认识这是最常见的问题。症状是ATC转换时狂刷“Unsupported Op”或者“Build model failed”。我遇到的典型原因有三个。一是ONNX版本太老或太新导出的算子结构跟CANN期望的不一致解决办法是升级onnx到1.12以上但别用最新版有时太新反而出问题。二是opset版本太高YOLOv5导出时指定--opset 11能避开大部分坑。三是模型里有些后处理算子比如NMS被打进了ONNX这类算子CANN不一定支持导出时用--no-nms之类的参数把后处理排除掉。4.2 推理出来全是框但没有一个是对的这是预处理不对齐的典型症状。模型转换成功了推理也跑完了但框要么偏到天边要么置信度全部接近0。我当时的排查顺序先确认color通道顺序YOLOv5训练时用的是RGB如果推理代码里用了BGR目标几乎检测不到。再确认归一化方式YOLOv5的归一化是直接除以255不是减去均值再除方差。最后确认letterbox的填充方式YOLOv5默认填充灰色114如果用了黑色0填充效果也会有偏差。个人心得遇到推理结果不对别去调模型先写个最简单的单目标测试图比如纯色背景上一个高对比物体一步步排查预处理。等这张图准了再换成真实场景图。4.3 24G显存看着大跑多路视频流还是爆Atlas 300V Pro虽然有24G HBM但如果每路视频流都做一次完整的模型推理照样会爆。原因是除了模型权重占用的空间每路视频流的输入帧、中间特征图都会吃内存。最有效的优化方案是让DVPP模块昇腾的硬件编解码与图像处理单元先做JPEG解码和缩放输出NV12格式给模型直接消费而不是在CPU里用opencv解好再传。这样既能省CPU又能把HBM占用控制在一个很低的水平。另一个方案是合理设置batch。不要为每一路视频流单独推理一次而是把多路的帧凑成一个batch一次性推理。比如4路视频流每路抽一帧凑成batch4推理时间只比单帧多一点但吞吐量翻了接近4倍。4.4 动态shape vs 静态shapeYOLO在输入分辨率不固定时会想用动态shape但昇腾NPU对动态shape的支持不如静态shape友好。动态shape每次推理都要做一次shape推导性能损失明显。我实际测试下来固定输入尺寸640×640是最省心的。如果业务确实需要多尺寸输入可以用ATC的--dynamic_batch_size只做动态batch输入分辨率仍然固定。这样既满足并发需求又不牺牲单次推理性能。5. 部署完成后的性能压测与调优心得5.1 先看一组实测数据我在Atlas 300V Pro 24G上跑YOLOv5s输入640×640batch1纯推理延迟稳定在6到8毫秒。换成batch4总延迟大概15毫秒左右相当于单张图不到4毫秒。这个成绩和T4处于同一水平线。如果跑的是YOLOv7或者YOLOv8这种体量更大的模型单帧延迟大概在12到18毫秒左右。对实时视频分析来说一秒钟能处理30帧以上完全够用。5.2 调优三板斧第一板斧是开AIPP。把预处理下沉到NPU后CPU占用立刻降下来整个链路吞吐量提升明显。第二板斧是把解码和缩放交给DVPP配合NV12输入格式每路视频流的CPU开销几乎可以忽略。第三板斧是灵活设置batch。纯离线批量处理用batch8或16实时流处理用batch4就够batch太大会增加首帧延迟。除了这三板斧还有个细节值得关注CANN的多线程推理。昇腾的推理上下文Context和流Stream设计得比较灵活可以把多路视频流的推理任务分配到不同的Stream上并行执行实测在4路视频流场景下能再提升30%的吞吐。5.3 什么场景才需要24G大显存很多人觉得YOLOv5s这种小模型用24G太浪费。确实单跑yolov5s24G HBM的利用率不到20%。但如果业务往这几个方向走24G的优势就体现出来了高分辨率输入检测比如1280×1280输入模型内存占用直接翻4倍。大模型推理比如YOLOX-L、YOLOv8-L甚至更大的分割模型。多模型并发同时跑一个检测模型加一个分类模型加一个OCR模型24G完全扛得住。多路视频流高并发比如32路D1分辨率视频同时分析。如果只是单路视频做目标检测那确实不需要这么大显存Atlas 300V标准版可能更划算。但考虑到未来业务扩展多花一点钱上24G省得以后频繁升级硬件。6. 最后再分享一个部署的小技巧把整个部署流程跑通之后我最大的体会是先别急着上复杂的推理框架先把“ONNX转OM→单张图推理→后处理出框”这条最小链路跑通。这条链路通了后面接FastAPI也好接消息队列也好都是水到渠成的事。我见过太多人一上来就想着做高并发服务结果模型在NPU上根本跑不出正确结果回头查又查不出来白白浪费好几天。老实把最基本的一步走扎实反而最快。
返回列表