ARTICLE DETAIL

资讯详情

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

Atlas 300V Pro 24G AI推理加速卡YOLO部署实战:从ONNX到om全流程

Atlas 300V Pro 24G AI推理加速卡YOLO部署实战:从ONNX到om全流程 1. Atlas 300V 24G的身份问题它到底算不算运算加速卡先说结论算但不是你脑子里默认的那种显卡。很多人第一次拿到Atlas 300V Pro 24G的时候第一反应是这玩意儿能不能打游戏、能不能硬解视频甚至有人把它和普通独立显卡混为一谈然后发现驱动装不上、显示输出没有就开始怀疑是不是卡坏了。我之前也踩过类似认知误区这卡根本不是干那个的它是专门的AI推理加速卡面向数据中心和边缘场景的服务器级推理负载设计目标是跑YOLO这类深度学习模型做张量计算。1.1 Atlas在不同语境下指的是什么Atlas这个词在搜索的时候会撞出好多完全不同的东西有数据库产品、有机器人品牌甚至还有人名。但在当前AI硬件圈子里大多数人搜Atlas 300V 24G才是目标也就是昇腾Ascend系列里的Atlas加速卡产品线。这个产品线覆盖了从训练到推理的各个形态比如Atlas 800/900系列训练服务器、Atlas 300系列推理卡、Atlas 200系列开发者套件还有Atlas 200 DK这种带载板的嵌入式开发板。所以当有人问atlas 300v 24g 是运算加速卡吗真正想确认的其实是这个24GB内存的板卡是不是一个能在服务器里做AI计算加速的硬件答案是肯定的而且严格来说是AI推理加速卡和NVIDIA T4、A10这类产品定位类似。它不能输出画面不能当GPU跑图形渲染也不适合做大模型训练它专注的是把已经训练好的模型高效地跑起来尤其是目标检测、图像分类、语义分割这类计算机视觉模型。1.2 Atlas 300V Pro 24G的规格拆解计算核心昇腾AI处理器具体来说搭载了多个AI Core支持FP16、INT8等精度计算显存配置24GB LPDDR4X带宽约204GB/s算力参数INT8算力可达140 TOPSFP16算力约70 TFLOPS级别不同型号有差异功耗设计TDP约75W无外接供电PCIe插槽取电形态规格半高半长单槽PCIe卡标准PCIE 3.0 x16接口编码能力部分型号集成DVPP硬件模块支持JPEG解码、视频解码H.264/H.265单看这组参数你会发现它和游戏显卡完全是两个物种功耗被卡死在75W没有显示输出接口也没有DirectX/Vulkan这类图形API支持。24GB这个数字确实扎眼但它用的是LPDDR4X颗粒追求的是容量、成本和功耗的均衡而不是游戏卡那种动辄几百GB/s的高带宽GDDR6/6X。对推理任务来说204GB/s带宽跑YOLO这种计算密集但权重体积不大的模型完全够用。1.3 加速卡和显卡的分界线到底在哪我见过不少人拿NVIDIA的卡能做AI所以AI卡就是显卡来推断这是不对的。RTX 4090能跑AI是因为CUDA生态把通用计算做进去但Atlas 300V从硬件架构上就没有图形渲染管线和显示控制器所有数据通路都是围绕矩阵乘法和向量运算设计的。你可以把Atlas理解为一块专精AI数学计算的加速器它做的事是接受输入张量经过卷积、全连接、激活等算子计算输出结果张量。它不需要把像素渲染到屏幕上也不需要跑CUDA程序它跑的是CANNCompute Architecture for Neural Networks框架下的算子。所以如果有人再问atlas 300v 24g 是运算加速卡吗你可以很笃定地告诉他是的是AI推理加速卡核心价值就是低功耗、大内存、高并发跑深度学习模型YOLO部署只是它最典型的一个应用。2. 为什么我选择Atlas 300V Pro跑YOLO而不是继续用GPU说实话前几年做视觉项目我闭着眼睛都会选NVIDIA的卡CUDA生态太成熟了什么模型装进去就能跑。直到有次给一个边缘计算盒子做方案选型整机功耗被限制在100W以内还要求能在0-70℃环境稳定运行RTX 3060这种卡直接出局了我这才认真研究起Atlas系列。2.1 功耗、形态与部署成本的现实对比用一张表看会更直观对比项Atlas 300V Pro 24GRTX 3060NVIDIA T4功耗75W170W70W内存/显存24GB LPDDR4X12GB GDDR616GB GDDR6算力INT8140 TOPS约70 TOPS需换算130 TOPS含稀疏显示输出无有无半高半长是否是宽温环境适配较好一般一般75W意味着什么一个350W的电源就能带起来普通工控机或者塔式服务器不用换电源和散热。同等算力下如果换NVIDIA阵营至少要上T4或者L4价格和供货都是问题。做商业项目有一个很朴素的道理整体拥有成本越低方案越可能落地。Atlas 300V Pro 24G在2019年刚出的时候价格并不低但近两年在零售渠道和二手市场的价格已经降到相当有竞争力的水平24GB大内存用来跑批量推理特别合适。2.2 YOLO这类模型的部署模式批量推理多于单帧要求很多人忽略了一个事实工业场景下的YOLO部署绝大多数是离线批量推理不是实时的单帧视频流。比如工厂质检线上一天几万张图片拍下来都是堆积成批处理的。Atlas 300V Pro的推理模式天然适合这种你可以把batch size调到8甚至16一次性喂给NPU。它的AI Core架构对并行计算的分批处理效率很高24GB的容量又保证了大batch下不会OOM这是对比那些只有8GB显存GPU最直观的优势。2.3 生态工具的差距没有想象中大担心没有CUDA就跑不了模型这种顾虑我一开始也有但实际操作下来发现CANN的工具链并没有想象中难用。它提供了一套类似TensorRT工作的流程把PyTorch导出的ONNX模型通过ATCAscend Tensor Compiler工具转换成昇腾自己的om格式然后通过AscendCL接口类似CUDA Runtime加载执行。对于YOLOv5/YOLOv8这类主流目标检测模型官方文档和开源社区已经有不少现成案例照着改改就能跑通。后面我会把完整的部署流程写出来你可以直接照着做。3. 基于CANN工具链的YOLO部署全流程从ONNX到om推理部署环境这块最稳妥的做法是找一台x86服务器装Ubuntu 20.04/22.04 LTS系统。驱动和固件的版本匹配问题特别容易让人卡住建议严格按照官网的版本配套表来安装不要贪新也不要混搭。我自己用过CANN 7.0.0搭配配套驱动整个过程比较稳后面所有命令都基于这个组合。3.1 环境安装的几个关键点操作系统Ubuntu 20.04 x86_64内核版本5.4默认即可驱动安装使用Ascend HDK安装包安装后运行npu-smi info如果能显示卡的信息驱动就装好了CANN工具包安装完驱动后再装CANN toolkit。注意设置环境变量比如/usr/local/Ascend/ascend-toolkit/set_env.sh每次开终端都要source一下建议写进.bashrcPython环境装Python 3.8或3.9PyTorch装CPU版本就够因为迁移到昇腾之后训练推理都走NPU不需要GPU版的PyTorch以CANN 7.0.0为例设置环境变量的命令大致是source /usr/local/Ascend/ascend-toolkit/set_env.sh export ASCEND_DEVICE_ID0 export PYTHONPATH/usr/local/Ascend/ascend-toolkit/latest/pyACL/lib/python3.9/site-packages/acl:$PYTHONPATH注意检查npu-smi信息里的芯片型号不同型号的Soc版本对应不同的编译参数比如Ascend 310P3和Ascend 310P1在ATC转换时的soc_version写的不一样写错会报错或转出来的模型无法加载。3.2 模型转换PyTorch权重到om的完整链路我这里用YOLOv5s作为例子YOLOv8也是几乎一样的流程。第一步是准备好ONNX模型在PyTorch环境里导出python export.py --weights yolov5s.pt --include onnx --opset 13 --batch-size 1这里有个很容易踩的坑导出ONNX时最好设置batch-size为1然后依赖Atlas那边的动态shape功能来处理不同输入尺寸。虽然有动态batch的配置方法但初次跑通先固定batch-size1能少走不少弯路。第二步是观察模型的输入输出结构。YOLOv5导出后可能已经被优化有时候输出层会合并成一个大张量这时候用Netease或常见的脚本查看ONNX节点的输入输出确认输入名是不是images输出是不是三维度的[1, 25200, 85]这些都是后面写ATC命令时要用到的参数。第三步写ATC转换命令atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_bs1 \ --soc_versionAscend310P3 \ --input_shapeimages:1,3,640,640 \ --input_formatNCHW \ --output_typeFP32 \ --insert_op_confaipp.cfg \ --enable_small_channel1其中--framework5代表ONNX--soc_version要根据实际芯片选Ascend310P3是300V Pro常见的--insert_op_conf用于配置AIPP预处理后面会详细说。转换完成会生成yolov5s_bs1.om文件如果这一步顺利通过整个项目的70%就算完成了。3.3 用AscendCL写一个最简单的推理脚本为了演示核心逻辑我用Python版本的pyACL接口写一个demo调用acl.mdl.execute做推理import acl import numpy as np from PIL import Image # 初始化 acl.init() ret acl.rt.set_device(0) context, ret acl.rt.create_context(0) # 加载模型 model_path byolov5s_bs1.om model_id, ret acl.mdl.load_from_file(model_path) print(load model ret:, ret) # 准备输入输出 input_desc acl.mdl.get_input_desc(model_id) output_desc acl.mdl.get_output_desc(model_id) input_size 1 * 3 * 640 * 640 output_size 1 * 25200 * 85 input_data np.random.randn(input_size).astype(np.float32) output_data np.zeros(output_size, dtypenp.float32) # 申请device内存 input_ptr acl.util.np_to_ptr(input_data) output_ptr, ret acl.rt.malloc(output_size * 4, 2) # 执行推理 dim [1, 3, 640, 640] ret acl.mdl.execute(model_id, input_ptr, 1, output_ptr, output_size * 4) print(execute ret:, ret)这个demo只是为了演示接口调用方式真做项目的时候直接用官方推荐的ACLLite库或者MindX SDK已经封装好了图像解码、缩放、AIPP这些工具不用重复造轮子。3.4 图像预处理和后处理不能偷懒YOLO的推理精度有很大一部分取决于预处理是不是和训练时一致。很多人转换om后掉点mAP下降就骂NPU不行其实90%的情况是预处理和后处理细节没对齐letterbox把原图等比缩放后补边到640x640补边的RGB值要设置成训练时的填充色比如在COCO上很多模型用的是114归一化除以255后是否还要做mean/std通道归一化YOLOv5导出onnx时如果带了预处理节点ATC阶段和推理阶段就不要重复归一化输出decodeYOLO原始输出是相对于特征图网格的坐标偏移不是最终边界框需要在后处理时做decode、置信度过滤、NMS最容易出错的地方就是缩放比例和paddings不对称。比如一张1280x720的图片等比缩放到640x360然后上下各填140像素的边填的是114而不是0。写代码时不要直接用OpenCV的resize按固定尺寸做一定要先算scale和pad再copyMakeBorder。4. 部署中真正卡脖子的几个环节ATC算子兼容、AIPP与后处理TensorRT转模型偶尔也会遇到不支持的层但CUDA生态的兜底方案多。昇腾这边ATC把ONNX转成om时最头疼的就是遇到不支持的算子日志报错还比较含蓄新手很容易看半天看不懂。这一节把几个真正的难点说透。4.1 ATC转换失败时的排查链路报错五花八门常见的有两类一类是算子不支持典型的日志像[ERROR] FMK:2024... Unsupported op XXX。遇到这种第一选择不是手工写算子插件而是先看一下官方文档里的算子支持列表大多数情况下能通过改模型结构绕开比如把某个不支持的激活函数替换成等价的组合。第二种常见情况是ONNX版本和ATC的解析器不兼容PyTorch 2.x导出ONNX往往是opset 17AT C当前的解析器可能还没完全跟上最稳妥的做法是导出时显式指定opset 13或14。还有一类是shape推导失败日志里会出现input shape not supported之类。多数是因为模型中某个动态shape节点没被正确推导解决方法是把动态维度固定下来或者在ATC命令行里显式指定--dynamic_input类的参数。新手阶段我建议不要开动态shape固定640x640跑通后再研究动态。4.2 AIPP组件把预处理搬进NPU的巧妙设计AIPP是Atlas卡很实用也很有特色的一部分它能在硬件层面完成图像缩放、裁剪、颜色空间转换、归一化等预处理操作而且数据不用先从NPU拷到CPU再处理而是推理前自动完成能省不少耗时。举个例子配置文件aipp.cfg可以写成aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_w: 640 src_image_size_h: 640 csc_switch: true rbuv_swap_switch: false miniu: 1 mean: [0, 0, 0] var: [0.003921568627451, 0.003921568627451, 0.003921568627451] }mean是0var是1/255这样正好和YOLOv5训练时候的归一化方式一致输入图像在送入网络之前就已经完成了像素归一化。注意这里RGB888_U8指的是输入格式如果你的摄像头给的是BGR或者YUV420需要相应改掉不然出来的结果一定会错乱。如果预处理里有比较特殊的操作比如归一化系数不是1/255还可以改成aipp_mode: dynamic在推理时动态传参。不过能用static完成就别上dynamic配置越简单调试越容易。4.3 后处理里NMS环节的取舍YOLO推理完输出的是[1, 25200, 85]的原始张量85 4个坐标 1个置信度 80个类别概率。后续要做的是过滤低置信度框比如置信度低于0.25的不要类别分数过滤每个框取最大类别的分数如果小于阈值就舍去NMS同类别的框进行非极大值抑制坐标映射把输出网格坐标按缩放比例映射回原图NMS可以在CPU上用OpenCV的dnn模块也可以自己写torch或者numpy版本。实测下来对单张图片来说CPU做NMS消耗的时间大概是2-5毫秒对于整体20-30毫秒的推理延迟来说占比不高。其实没有必要去折腾在NPU上做NMS除非你是做超高帧率的视频流单路画面永远到不了那个瓶颈。有一个很实际的优化点是Atlas上跑的是固定尺寸的输入NMS时提前把框过滤严格点能明显降低后续处理压力。比如两阶段过滤先用0.5的低阈值粗筛再用0.8的阈值做NMS有效降低框的数量处理速度会快很多。5. 实测效果与调优经验不同YOLO模型在300V Pro上的真实表现说了这么多原理最后还是要落到数据上。我自己在Atlas 300V Pro 24G上跑的几组测试供大家参考。5.1 单卡吞吐量和延迟实测YOLOv5s输入640x640FP16batch1单帧延迟约8-12ms换算成FPS大约80-100YOLOv5s输入640x640INT8batch1单帧延迟约6-8msFPS约125-150YOLOv8s输入640x640FP16batch1单帧延迟约12-18msFPS约55-80YOLOv5s输入640x640INT8batch16总耗时约60-80ms折算单帧3.75-5ms数据说明一个现象batch越大单帧耗时越低。因为Atlas处理大batch时能把AI Core的利用率拉上去。做了小项目如果吞吐量不够第一件事不是去换更强的卡而是试试加大batch。同时注意FP16和INT8的精度差异实测mAP大概掉0.5到1个百分点。如果你的业务对精度没有那么敏感比如只做人流计数、区域入侵检测INT8配合batch4以上性价比会非常亮眼。5.2 多路视频流推流场景的配置思路如果是做摄像头视频流分析比如20路1080P实时检测不要直接对20路分别跑模型那样浪费算力。应该先把20路视频解码成帧抽帧策略比如每2秒抽1帧看业务需求然后把抽取的帧合并成batch统一送NPU推理。这样你的部署架构就是拉流解码使用FFmpeg或自研解码模块输出YUV或RGB帧抽帧调度每路视频每2秒挑一帧放入消息队列推理worker从队列里攒够8帧后组成一个batch做AIPP预处理后送入NPU结果回传推理完成后把检测框信息和原图时间戳绑定再做业务判断这样一个Atlas 300V Pro 24G就能轻松支撑20路以上的1080P实时检测延迟小于500ms资源占用很低。整卡功耗依然在75W附近对一个中大型安防系统来说这个能耗成本非常理想。5.3 值得尝试的调优方向动态batch使用ATC时配置动态batch--dynamic_batch_size1,2,4,8,16就可以在运行时根据队列积压量自动选择合适batch兼顾延迟和吞吐动态分辨率如果业务中图像尺寸杂乱可以配置几个常见分辨率档位推理时按档位传入避免letterbox时比例失真的信息损失多模型并行Atlas 300V可以同时加载多个om模型像YOLO负责检测再叠加一个简单的分类模型做属性识别两个模型用不同stream跑互不干扰自研插件算子如果有个别高度定制化的算子找不到支持可以按CANN的Ascend C接口开发自定义算子难度不低但官方教程做得比较全值得啃一下另外非常推荐大家用MindX SDK做原型验证它把解码、缩放、推理、后处理封装成了插件用pipline配置的方式串联起来比直接写AscendCL省力很多。先把pipline跑通再根据性能需求把热点替换成自己写的C/C或Python算的ASCENDCL模块开发效率和产品性能两头都有。6. 最后分享一个小技巧用npu-smi和msprof两个工具排查性能瓶颈调优阶段靠直觉猜是不可靠的要数据驱动。这里说两个我用的最多的工具。npu-smi info可以实时查看AI Core利用率、内存占用和温度。如果推理时AI Core利用率一直很低比如不到30%说明模型太小或者batch太小单位时间喂给NPU的数据量不够这时候加大batch往往立竿见影。如果利用率很高但帧率还是上不去就要看是不是其他环节卡住了比如AIPP的等待时间。msprof是昇腾的性能剖析工具可以对整条推理链路做时间戳分析。用法大致是msprof --applicationpython test.py --output./prof_out跑完会在输出目录里生成各个API的耗时明细。我最常关注的是acl.mdl.execute这个接口的时间如果这个值稳定且很小但整链路延迟很高那问题大概率出在预处理或后处理再去针对性优化。按这个思路排查了几次之后我对Atlas 300V Pro的底细算是摸透了它并不是什么玄学工具本质就是一块专注推理的矩阵运算芯片。只要把模型转换、数据格式、batch策略这三件事搞对YOLO部署跑起来又稳又省电。踩过几次坑之后我现在遇到中小规模的视觉推理项目反而会优先评估Atlas 300V Pro而不是盲目上电竞显卡这个习惯已经帮我在不少预算敏感的项目里省了大钱。
返回列表