ARTICLE DETAIL

资讯详情

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

Atlas 300V 24G部署YOLOv5全流程:从PyTorch权重到OM模型推理

Atlas 300V 24G部署YOLOv5全流程:从PyTorch权重到OM模型推理 我手上这块Atlas 300V 24G第一次插到服务器上时同事第一反应是“这也算加速卡看着跟个网卡似的”。第二天就有人拿着社区里搜出来的词条来问我“这卡是不是只能做视频解码能不能拿来部署YOLO”说实话Atlas 300V 24G这个型号在圈里确实有点尴尬想用的人多真正把它跑明白的人少。我用它前前后后折腾了三周把YOLOv5从PyTorch权重一路搞到OM离线模型最后在Atlas 300V 24G上稳定跑出了实时推理。这篇文章就把整个过程中的产品定位、部署路线、实操步骤和踩坑记录都写出来给准备上手Atlas的朋友一个参考。先说结论Atlas 300V 24G是运算加速卡而且是正儿八经的AI推理加速卡。虽然它外观设计得很“低调”但内部那颗昇腾310P处理器在视频分析和检测类任务上的实力不弱。更关键的是24G的显存在同系列的推理卡里属于大容量版本你完全可以在上面部署YOLO并把检测任务跑得明明白白。下面我会从卡本身的定位讲起然后带你走一遍完整的YOLO部署流程最后聊聊我实测中遇到的各种问题和解决方法。1. 先搞清楚Atlas 300V 24G到底是张什么卡1.1 产品线定位它是推理加速卡不是视频处理专用卡Atlas 300V是昇腾推理卡产品线里的一个系列核心芯片基于昇腾310系列处理器。和动辄两三百瓦的大GPU不同Atlas 300V主打低功耗推理卡体尺寸比较小风冷设计单卡功耗通常在几十瓦级别插在普通服务器上根本不愁供电和散热。早期这个系列确实大量出现在视频分析项目中很多资料把它归类为“视频分析卡”导致不少人以为它只能做视频解码、硬编硬解这类事情。实际上它的能力远不止视频处理本质上是AI推理加速卡支持加载OM离线模型做通用神经网络推理。你训练好的YOLO、ResNet、Unet这类模型只要转换成OM格式就能在它上面跑推理。我在项目里测试过不少模型Atlas 300V 24G在目标检测、语义分割、分类这些任务上都有不错的表现并不是“偏科生”。只是它在视频场景中曝光率太高反而让很多人忽略了它作为通用推理加速卡的身份。1.2 24G显存的实际意义显存这个东西在推理卡上往往比在训练卡上更容易成为瓶颈。训练卡一次算一个batch大样本显存吃紧可以等几轮再更新推理卡不同业务方希望一秒钟处理尽可能多的图片或视频帧显存直接决定了你能同时灌进去多少数据。Atlas 300V 24G的24G显存实际意义可以拆成两层看。第一层它能装下更大的模型。比如YOLOv5s这种轻量模型当然没问题但如果你用的是YOLOv5m、YOLOv7这类参数量更大的模型或者输入分辨率要求很高比如工业质检用1280x1280图片8G显存的卡立刻就会捉襟见肘24G版本就从容很多。第二层它可以塞下更大的batch。同样的单张图片推理耗时如果batch一次喂8张吞吐量能接近单张推理的8倍理想情况下但显存占用也按比例上升8G卡很可能跑不了batch 8的YOLOv5m24G卡就没这个压力。我在实际调优时用24G版本跑YOLOv5sbatch设为8时显存占用还不到一半这就意味着同一张卡还能再接一路视频流或者跑第二个模型资源利用率明显更高。1.3 实际部署场景中它适合干什么从我自己的项目经验来看Atlas 300V 24G适合以下几种典型场景。边缘机房或小机柜场景。很多企业的边缘服务器只有2U高度电源功率有限插两张高端GPU可能直接跳闸但插两三张Atlas 300V完全没压力。我做过的某园区项目一台2U服务器里插了两张Atlas 300V 24G分别跑不同楼宇的检测模型整体能耗比一张GPU还低。大规模视频分析场景。Atlas的昇腾芯片在视频解码和AI推理的联动上有专门优化配合CANN的硬件解码能力能实现“视频流直接进卡推理结果直接出”的高效链路。我实测单卡处理8路1080P视频流每路跑一次轻量检测模型CPU占用率很低整卡功耗也只有几十瓦。对显存有硬性要求的推理场景。比如同时加载多个模型做级联推理或者高分辨率输入做缺陷检测16G以下的卡经常报OOM。Atlas 300V 24G的24G显存让这类场景有了落地的可能。简单来说如果你想在低功耗、小体积、国产化方案的前提下找一个能跑目标检测模型、又不用频繁训练调参的生产环境Atlas 300V 24G是很合适的选项。2. 在Atlas上部署YOLO之前先把方案定下来2.1 部署路线的三种选择在Atlas 300V 24G上部署YOLO至少有三条路可以走我分别说下适用情况。第一条是原生CANN路线。用ATC工具把ONNX模型转换成OM模型然后用AscendCLACL写推理代码。这条路最灵活你能控制预处理、输入输出、后处理的每一个环节性能天花板最高但开发量也最大适合对性能有极致要求、或模型结构比较特殊的场景。第二条是MindX SDKmxVision路线。昇腾提供了pipeline式的SDK把图像解码、缩放、推理、后处理这些模块像积木一样串联起来通过配置文件和少量代码就能完成部署。这条路上手快但灵活性不如原生CANN适合标准的目标检测流程。我建议首次接触Atlas的朋友先从这条路入手跑通后再考虑要不要深入CANN。第三条是用PyTorch昇腾版或MindSpore直接推理。其实在昇腾设备上安装torch_npu后PyTorch代码也能直接跑但这种方式更偏向验证和调试性能通常不如OM模型。生产环境我一般不建议直接用因为你没法对模型做太多图优化部署链路也更重。我这次实战用的是第一条路线原生CANN OM模型把YOLOv5s完整跑通。原因很简单我想把每一层都摸清楚方便后续做性能优化而且这个路线最不依赖第三方封装问题排查时最透明。2.2 工具链版本匹配是最大的坑在Atlas上部署YOLO最常见的翻车点不是模型本身而是工具链版本对不上。昇腾平台有三大软件层级驱动NPU Driver、固件Firmware和CANN工具包。这三者必须严格配套否则很可能会出现“驱动能识别到卡但CANN加载模型时报RUNTIME_ERROR”或者“ATC转换时直接报soC版本不受支持”这类问题。我建议部署前先把版本梳理清楚用命令逐一确认。# 查看驱动和固件版本 npu-smi info # 查看CANN版本 cat /usr/local/Ascend/ascend-toolkit/latest/version.cfg如果发现驱动固件和CANN版本不匹配要去昇腾社区找到对应版本的下载链接重新安装。千万别图省事只升级CANN不升级驱动我踩过这个坑白白折腾了半天。2.3 环境准备清单除了版本匹配还有一些基础环境需要准备好。我习惯列一个清单逐项打勾省得到时候缺东少西。操作系统Ubuntu 20.04 / 22.04、openEuler或CentOS 7.6以上64位系统推荐Ubuntu 20.04。Python版本3.7到3.10之间通常3.8或3.9最稳。驱动和固件和CANN版本配套。CANN Toolkit从昇腾社区下载对应的run包比如Ascend-cann-toolkit_7.0.RC1_linux-aarch64.run。模型文件YOLOv5权重文件或导出的ONNX文件。辅助工具Netrononnx模型可视化、Python三方库numpy、opencv等。环境准备好之后不要急着下载模型先把CANN安装好跑一把官方自带的样例程序确认整条链路是通的再拿自己的模型动手。3. 完整实操从PyTorch权重到Atlas 300V上的YOLO推理3.1 第一步准备YOLOv5模型并导出ONNX我使用的是YOLOv5官方仓库版本是v6.0版本。这个版本比较经典后续代码稳定网上的参考资料也多。git clone -b v6.0 https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt # 下载权重后导出ONNX python export.py --weights yolov5s.pt --include onnx --opset 11导出ONNX时有一个细节需要注意opset版本不要太高。昇腾CANN对ONNX op的支持一直在迭代但直接用opset 13、14的某些算子还是可能出现不支持的情况。我实测opset 11最稳妥如果模型里用了特别新的算子再考虑升级版本。导出完成后用Netron打开yolov5s.onnx找到模型最后的三个输出节点。这三个节点对应YOLOv5的三个检测头常见命名是Conv_1180:0、Conv_1188:0、Conv_1196:0但不同导出方式、不同版本可能不一样。后面ATC转换时要用到准确的输出节点名这一步不能省。3.2 第二步ATC模型转换ATCAscend Tensor Compiler是昇腾平台的核心工具负责把ONNX模型编译成OM离线模型。转换命令如下source /usr/local/Ascend/ascend-toolkit/set_env.sh atc --modelyolov5s.onnx --framework5 \ --outputyolov5s_bs1 \ --soc_versionAscend310P3 \ --input_shapeimages:1,3,640,640 \ --out_nodesConv_1180:0;Conv_1188:0;Conv_1196:0 \ --logerror参数说明一下。--framework5表示输入为ONNX--soc_version表示芯片型号我的Atlas 300V 24G在使用Ascend310P3时能正常转换但你的卡可能有不同的SoC类型建议先执行npu-smi info确认或者看CANN安装路径下的相关文档选错会直接报错--input_shape里的images要和ONNX模型输入名一致YOLOv5默认输入名就是images--out_nodes就是上一步在Netron里查到的三个输出节点名。转换成功后会生成yolov5s_bs1.om文件这才是Atlas 300V 24G能直接加载的模型格式。如果转换过程报错优先检查输出节点名是否正确、opset版本是否合适、soc_version是否匹配这三个是出错率最高的点。3.3 第三步用AscendCL写推理代码OM模型转换好了之后就需要写推理代码。AscendCLACL是昇腾平台提供的C/Python API接口Python端我们可以用pyacl来调用。下面是一个思路版示例真实工程中还需要补充预处理、后处理和错误处理。import acl import numpy as np # 1. 初始化 acl.init() ret acl.rt.set_device(0) context, ret acl.rt.create_context(0) # 2. 加载OM模型 model_id, ret acl.mdl.load_from_file(yolov5s_bs1.om) desc, ret acl.mdl.create_desc() ret acl.mdl.get_desc(desc, model_id) # 3. 获取输入输出大小 input_size acl.mdl.get_input_size_by_index(desc, 0) output_size acl.mdl.get_output_size_by_index(desc, 0) # 4. 分配device内存 input_buffer, ret acl.rt.malloc(input_size, 2) output_buffer, ret acl.rt.malloc(output_size, 2) # 5. 将预处理后的图片数据拷贝到device image_data preprocess(image) # 需要自己实现 ret acl.rt.memcpy(input_buffer, input_size, image_data.tobytes(), input_size, acl.rt.MEMCPY_HOST_TO_DEVICE) # 6. 执行推理 ret acl.mdl.execute(model_id, [input_buffer], [output_buffer]) # 7. 把结果拷贝回host result np.zeros(output_size, dtypenp.uint8) ret acl.rt.memcpy(result.__array_interface__[data][0], output_size, output_buffer, output_size, acl.rt.MEMCPY_DEVICE_TO_HOST)这里需要重点提醒代码中的preprocess非常关键它负责把普通图片变成模型需要的输入张量包括缩放、归一化、颜色通道转换RGB、维度排布HWC转CHW。如果预处理不对推理结果就是废的。另外我在工程中习惯用acl.mdl.execute_async走异步推理而不是用上面的同步接口。异步方式可以让数据拷贝和计算重叠起来推理吞吐量能提升不少。异步模式需要自己管理stream第一次接触可能有点绕但值得学会。3.4 第四步后处理与NMSYOLOv5的模型输出通常不是直接可用的检测框而是三个特征图上的原始张量。以640x640输入、80类目标COCO为例每个检测头的输出shape通常是(1, 25200, 85)三轮加起来85代表cx, cy, w, h, obj_conf, class1...class80。后处理要做的事就是解码这些张量把中心点坐标换算成角落坐标乘以缩放系数映射回原图根据obj_conf过滤低置信度的框最后执行NMS去除重叠框。在Atlas上部署YOLO时我强烈建议把NMS放到CPU侧用NumPy或OpenCV实现不要让OM模型里去走NMS算子。原因有两个一是ATC转换时NMS算子版本兼容性比较麻烦二是昇腾侧对NMS这类算子的优化目前不如GPU生态那么成熟放CPU侧反而方便调试。简化的后处理代码如下def decode_output(output, conf_thres0.25, iou_thres0.45): boxes output[..., :4] obj_conf output[..., 4] class_conf output[..., 5:] class_ids np.argmax(class_conf, axis-1) class_scores np.max(class_conf, axis-1) scores obj_conf * class_scores mask scores conf_thres boxes, scores, class_ids boxes[mask], scores[mask], class_ids[mask] # 坐标转换 boxes[..., [0, 1]] - boxes[..., [2, 3]] / 2 boxes[..., [2, 3]] boxes[..., [0, 1]] # NMS keep cv2.dnn.NMSBoxes(boxes.tolist(), scores.tolist(), conf_thres, iou_thres) return boxes[keep], scores[keep], class_ids[keep]这一段代码虽然简单但部署时特别容易出错的地方是shape解析。有些OM模型的输出顺序不是(1, 25200, 85)而是三个独立输出每个输出对应一个尺度所以要针对三个输出分别解码再合并NMS。我在自己的工程里直接写了一个循环依次处理三个检测头代码可读性和稳定性都更好。4. 性能调优相同硬件帧率翻倍的几个参数4.1 AIPP让预处理进卡省下CPU开销第一次把YOLOv5跑通之后我观察了一下CPU占用率发现莫名其妙很高。后来细查才知道大量时间消耗在图片预处理上比如缩放、归一化、颜色转换这些操作全在CPU上跑把CPU累得够呛。昇腾平台提供了AIPPAI Preprocessing模块可以在ATC转换时把预处理配置到模型内部让图片送进卡之前就在硬件上完成缩放、归一化、色域转换等操作CPU只负责拷贝数据性能自然提升。AIPP的配置方式是写一个aipp.cfg文件然后在ATC转换时通过--insert_op_conf参数引入atc --modelyolov5s.onnx --framework5 \ --outputyolov5s_bs1_aipp \ --soc_versionAscend310P3 \ --input_shapeimages:1,3,640,640 \ --out_nodesConv_1180:0;Conv_1188:0;Conv_1196:0 \ --insert_op_confaipp.cfgaipp.cfg里比较关键的是色域转换和归一化配置。YOLOv5导出ONNX时输入通常是RGB格式预处理的均值和标准差与旧版YOLOv5一致或按你的训练配置来。网上有大量现成配置文件可以参考但要注意不同CANN版本对配置项的小细节要求不同我碰到过csc_switch和rbuv_swap_switch配置写反导致颜色通道错乱的情况调试了很久才发现是色域配置的问题。用上AIPP之后CPU占用率直接降了30%以上推理帧率也明显提升。如果你的业务对预处理要求不复杂推荐把尽量多操作交给AIPP去做。4.2 动态Batch与动态分辨率怎么选固定batch的OM模型只能以固定的输入shape运行这在跑单路视频流时没问题但想在同一张卡上灵活处理不同分辨率、不同批次的请求时就不够用了。ATC支持动态batch和动态分辨率。动态batch可以在转换时指定--dynamic_batch_size1,2,4,8运行时你要从1,2,4,8里选一个batch进行推理。同理动态分辨率可以指定--dynamic_image_size640,640;960,960;1280,1280这样同一个Om模型就可以接受不同尺寸的输入图片。但使用动态shape是有代价的。模型内部很多算子在固定shape时能提前优化动态shape等于放弃了这部分优化空间实际吞吐量会比固定shape低一些。我的建议是如果业务模式是可预测的比如固定跑640x640输入直接用固定shape只有在多路请求分辨率差异大时才考虑动态shape。4.3 多路并发和异步推理Atlas 300V 24G的一个大优势是显存大但光有显存还不够你得把并发能力用起来。我实测的两种常见做法效果都很明显。第一种是用多线程每个线程创建独立的context和模型实例各跑各的推理任务适合多路视频流各跑各模型的场景。第二种是单模型多stream在同一个进程里创建多个stream用异步接口把不同batch的推理提交到不同stream上让卡内的计算单元尽量同时工作。我自己的项目里用多线程绑单模型的方式跑多路视频流24G显存配合异步推理同时处理8路YOLOv5s检测时没有出现显存报错或推理超时。如果是YOLOv5m这种大模型建议先按每路1.5到2G显存预估再决定并发路数。另外别忘了把推理结果的后处理放到独立线程。推理卡的输出只是张量后处理在CPU上做如果串行执行后处理时间会直接拖累整体帧率。我现在的工程结构是采集线程 - 预处理线程 - 推理线程异步 - 后处理线程四级流水线整体吞吐量比串行版本翻了一倍不止。5. 常见问题与排查手册5.1 ATC转换失败ATC转换时报错是Atlas上部署YOLO遇到最多的一类问题。常见错误包括后描述现象可能原因解决方法E10010: soc_version not support指定了错误的soc_versionnpu-smi info查询芯片型号对照CANN文档选择算子不支持ONNX里用了较新的算子改用opset 11重新导出或简化模型输出节点找不到--out_nodes写错名用Netron重新确认复制完整节点名显存不足转换失败模型过大或输出过多减小模型批次或用单batch转换其中soc_version这个问题我印象最深刻。刚开始我拿着一张卡试了好几个版本都在转换时卡住后来才发现我的卡实际芯片型号和网上教程里默认的不一样。按下npu-smi info查看真实型号再对应CANN文档填一次就过了。5.2 推理输出结果不对如果模型转换成功但推理结果明显不对比如检测框乱飞、类别错乱、输出全零第一件事就是查预处理和后处理。我遇到最典型的一次问题输入图片用了BGR格式但模型训练时用的是RGB结果颜色通道反了明明在GPU上跑得好好的YOLO到了Atlas上却把人和椅子检测颠倒了。排查半天发现是预处理漏了通道转换。另一个常见原因是输出解析维度对不上。OM模型的输出shape有时和ONNX模型看起来一样但数据排列细节会有差异。建议先把推理输出打印出来和CPU上跑ONNX的输出对比shape和数值范围。如果数值范围差得很大先查输入是否归一化对了如果shape不对再回头查--out_nodes的指定方式。5.3 显存不足和设备健康检查Atlas 300V 24G虽然显存大但也不是无上限的。跑YOLOv5m、batch 8、1200x1200输入时24G也可能撑不住。这种情况下优先降低batch大小和输入分辨率这两个对显存占用影响最大。部署过程中要学会用npu-smi info实时查看显存占用、芯片温度和功耗。我习惯在程序跑几轮后看一眼如果温度接近85度就应该检查机箱风道或降低负载。昇腾卡的功耗管理机制比较灵敏过热时会主动降频导致推理延迟突然拉高。别等到性能掉了才想起来排查温度。日志排障也是一个重要工具。CANN默认日志级别通常是info当出现复杂报错时可以把日志级别调到debug# 环境变量设置 export ASCEND_GLOBAL_LOG_LEVEL1 export ASCEND_SLOG_PRINT_TO_STDOUT1然后重新跑程序看/var/log/npu/slog/下的日志很多隐藏在表面错误后面的原因会一目了然。6. 我个人对Atlas 300V 24G这颗卡的判断6.1 哪些项目适合选它从我做过的一些项目来看Atlas 300V 24G最适合的场景可以归纳成三个关键词推理负载稳定、功耗和空间受限、业务方对国产化方案有倾向。比如工业质检项目模型训练好了之后基本不更新每天就是源源不断的图片推理这种负载很适合Atlas 300V 24G。又比如园区安防项目需要长时间7x24小时稳定运行低功耗意味着发热小、故障率低对机房运维压力也小。如果你的业务还处于模型频繁迭代、每周都要重新训练的阶段Atlas 300V 24G就不太合适。它是推理卡不是训练卡训练任务还是应该交给GPU或专门的训练集群。6.2 和GPU方案怎么选很多朋友问过我同样预算买Atlas 300V 24G还是买一张中端GPU。这个问题不能简单回答谁强谁弱要从好几个维度看。生态方面GPU有CUDA、TensorRT、ONNX Runtime社区资源丰富遇到问题随便一搜就有答案。Atlas的生态相对封闭一些但昇腾社区和Gitee上的官方样例数量逐年增加只是很多方案还是需要自己踩坑摸索。性能方面Atlas 300V 24G在推理任务上的算力并不弱尤其视频流和检测类任务昇腾芯片内部有专门优化某些场景下单位功耗能效比GPU还好。但在大规模训练、模型迭代试错上GPU显然更灵活。部署方面GPU方案你可以在云端、本地、边缘自由切换模型迁移方便Atlas方案需要专门针对OM格式做适配模型从GPU切过来有一个转换和学习成本。我的个人建议是如果是商业交付、长期稳定运行且客户对国产化、低功耗有明确要求选Atlas 300V 24G没毛病如果是个人学习、快速原型验证或者团队还在快速探索模型方向老老实实用GPU更省心。6.3 给新人的三点建议最后如果你刚拿到Atlas 300V 24G准备部署YOLO我有三个建议想分享。第一先把官方samples跑通再动手改自己的模型。昇腾官方提供了YOLOv5的样例工程先照着文档把样例跑起来确认驱动、固件、CANN、ACL这套链路完全没问题再换成自己的权重和模型排查问题的范围会小很多。第二版本管理要做好记录。驱动版本、固件版本、CANN版本、PyTorch导出参数、ATC转换参数每一个细节都要记下来。我自己的做法是每条命令和版本号写进项目的README这样换环境或给别人交付时照着文档就能复现。第三后处理不要偷懒。Atlas上跑YOLO最容易出差错的地方之一就是模型输出的后处理。建议把后处理代码单独拆成模块用固定的测试图片做断言保证每次模型或输入尺寸变化后后处理逻辑依然正确。我第一次部署时图省事把后处理逻辑硬编码了结果换了输入分辨率后所有检测框全部错位排查耗时比写后处理本身还长。对我来说Atlas 300V 24G是一张需要耐心去“磨合”的卡它不是那种插上去就能让所有模型原地加速的即插即用设备更像一个需要你和它互相适应才能发挥潜力的搭档。我踩过最大的一个坑不是模型本身而是太相信默认参数——把YOLO导出后直接转OM结果推理输出经常对不上。后来老老实实拿着Netron对照节点一步步检查预处理通道顺序才算稳定下来。所以如果你想在Atlas 300V 24G上部署YOLO我的建议很简单先把官方工具链捋顺再动手改模型最后再谈性能优化。看起来慢实际上这才是最快的路线。
返回列表