ARTICLE DETAIL

资讯详情

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

Atlas 300V 24G实战:从CANN环境到YOLOv5模型推理部署全流程

Atlas 300V 24G实战:从CANN环境到YOLOv5模型推理部署全流程 做AI推理落地这行这几年绕不开昇腾Atlas。我第一次拿到Atlas 300V 24G的时候心里其实挺打鼓的因为网上关于它的资料大多是产品规格页真正讲怎么上手跑模型的文章屈指可数。当时我手头正好有一个YOLOv5检测任务要部署索性就拿这块卡开刀从装驱动到CANN配环境从PT模型转ONNX再转OM再到用PyACL写推理代码整个过程踩了不少坑也攒下一套可以复用的经验。这篇文章我就用自己实操的视角把Atlas 300V 24G到底能干什么、怎么才能把YOLO跑起来原原本本讲清楚。不管你是刚接触昇腾生态还是已经在用但被各种报错卡住应该都能从中找到有用的东西。1. Atlas 300V 24G到底是一张什么卡1.1 从规格看定位它不是GPU是专用推理加速卡回到热搜词里那个问题Atlas 300V 24G是运算加速卡吗答案是肯定的但它不是GPU那种通用计算卡而是一张面向AI推理场景的专用加速卡。它用的是昇腾310P芯片板载24GB显存官方标称INT8算力在140 TOPS左右FP16算力也能到70 TFLOPS附近功耗却只有大概70多瓦。这个功耗水平意味着普通服务器里的PCIe插槽配合散热设计就能压住不需要像大GPU那样动辄几百瓦的供电和散热改造。很多人第一次听到“24G”会觉得显存挺大是不是能当训练卡用这就是理解偏差的开始。2400V的大显存主要给推理场景的“多路视频帧缓存”和“大batch数据滞留”准备的不是用来装训练过程中的激活值和梯度。昇腾310P芯片本身设计时就把矩阵运算、卷积这些算子做了深度定制训练常用的自动微分、动态shape算子支持比较弱。换句话说这张卡的灵魂是“把训练好的模型高效地跑起来”而不是从零开始训练模型。我自己的理解框架是这样GPU像是一个能文能武的多面手既能渲染图形也能跑AI而Atlas 300V 24G更像是一条专用的高速公路路修得很宽很直但只允许特定类型的车推理模型在上面跑。你要把它当成“低配GPU”来用并行编程那套思维在昇腾上不一定转得过来但你要是按“专用推理引擎”来思考它会给你比较惊喜的性价比。1.2 它和T4、3090这类卡比优势在哪做推理部署选硬件绕不开和NVIDIA的产品做比较。我拿最常见的T4和RTX 3090来给一个直观对比项目Atlas 300V 24GNVIDIA T4NVIDIA RTX 3090芯片定位昇腾310P推理卡通用推理卡消费级/工作站显卡显存24GB16GB24GB典型功耗72W左右70W350W推理算力标注INT8 140 TOPSFP32 8.1 TFLOPS / INT8 65 TOPSFP32 35.6 TFLOPS视频硬解码支持H.264/H.265支持较弱生态成熟度昇腾CANN持续增长CUDA非常成熟CUDA非常成熟这张表不是让你看谁数字大而是看单位。Atlas标的是INT8 TOPSGPU标的是FP32 TFLOPS两者衡量的精度、计算模式都不一样直接对比就是关公战秦琼。做部署选型时真正要看的是你那个具体模型在这张卡上的单帧延迟和吞吐量。我实测下来同一份YOLOv5s模型640x640输入Atlas 300V 24G单卡纯推理延迟大概是8毫秒上下具体数值和CANN版本、驱动版本、芯片频率都有关系但量级上已经能支撑比较实时性的业务。还有一个很容易被忽略的点Atlas 300V 24G的视频编解码能力。像安防、交通这类场景输入源是视频流传统方案要先做硬解码再把帧数据搬到GPU显存里。Atlas把硬解码和推理放在同一张卡上视频流可以直接解码进设备内存省掉一次PCIe拷贝。这个优势在长时间跑视频结构化时非常明显也是我后来在项目里坚持用Atlas的一个重要原因。2. 为什么选Atlas来落地YOLO2.1 YOLO业务的真实痛点多路视频流、大显存、低功耗YOLO这个模型因为检测速度快、精度够用在工业界是部署量最大的目标检测模型之一。但部署YOLO的时候光看单帧推理速度是不够的还得看整个系统的运转成本。比如一个园区安防项目几十路摄像头要同时做实时检测这时候每路视频都占用一路解码通道每帧图像都要经过“解码、预处理、推理、后处理”这条链路。如果卡上没有硬解码能力就得靠CPU软解CPU打起摆子来延迟和稳定性都会出问题。Atlas 300V 24G恰好把这条路打通了。24GB的大显存可以缓存多路视频帧数据配合硬件解码器可以在一张卡上并行跑多路YOLO检测任务。我见过不少团队用GPU做类似方案效果是挺好但硬件成本、机柜空间、功耗都上来了。Atlas单卡功耗低一台服务器可以插多张卡单位机架密度下的算力成本相当能打。另外还有一点是国产化适配。现在很多政企项目在硬件选型上有信创要求昇腾Atlas在这块就有天然优势。我接触过的不少集成商都是先看准了这个趋势才开始研究和部署昇腾平台的。如果你做的项目将来要过等保、要过国产化验收那提前接触昇腾生态绝对不是什么坏事。2.2 昇腾部署YOLO的技术栈长什么样刚接触Atlas的人最容易被一堆名词搞晕CANN、AscendCL、ATC、OM、MindX SDK。我一开始也是后来慢慢理清楚之后其实可以用一张分层的逻辑来理解最底层是硬件Atlas 300V 24G里面是昇腾310P芯片。再往上是CANNCompute Architecture for Neural Networks这是昇腾的计算架构地位相当于NVIDIA的CUDA。在CANN之上有ATCAscend Tensor Compiler负责把训练好的模型转换成昇腾的离线模型OMOffline Model。这个转换过程类似TensorRT的模型优化会做算子融合、内存重排、精度选择。应用开发时我们用AscendCLACL接口官方也提供Python的pyACL。想更快上手的还有MindX SDK可以编排推理流水线。YOLO模型的部署路径比较标准PyTorch训练好权重先导出为ONNX再用ATC把ONNX转成OM最后在推理代码里使用pyACL加载OM并执行推理。整个过程可以理解为“模型搬家”把PyTorch动态图环境里的模型搬到昇腾这个专用推理引擎上。需要注意ONNX转换这一步非常关键因为ATC不认识PyTorch的.pt文件ONNX模型的算子和结构就直接决定了后面转换能不能成功。3. 环境准备先把驱动和CANN理顺3.1 硬件安装与系统检查Atlas 300V 24G是一张PCIe接口的加速卡安装物理上没那么复杂但有几个细节要注意。首先是供电虽然板卡功耗不高但建议还是用服务器里带辅助供电的PCIe插槽别随便插在带宽不够的老主板上。插好之后开机进系统先用lspci确认系统能不能认到卡lspci | grep -i ascend如果能输出类似“Huawei Ascend Device”的设备信息说明硬件层面已经识别到了。接着需要安装NPU驱动和固件这步很关键驱动和固件的版本必须匹配我遇到过一次只装了驱动没装固件结果npu-smi能看到卡但一创建Context就卡死。后来把固件也刷了一遍问题才消失。驱动和固件一般打包在同一个Ascend-hdk-*.run文件里安装命令大同小异./Ascend-hdk-*.run --install安装完成后用官方提供的npu-smi工具检查卡的状态npu-smi info看到芯片温度、功耗、显存占用都正常加载出来说明硬件和驱动这关过了。顺便说一句Ubuntu 20.04和22.04是我用得最顺的宿主系统CentOS那边兼容性我也试过但总感觉文档和社区问题集中在前者新手上路建议直接上Ubuntu。3.2 CANN工具链安装与版本匹配驱动搞定之后还需要装CANN。CANN的作用是把上层应用和NPU硬件连接起来就像是CUDA Toolkit之于GPU里面包含了运行库、开发工具链、算子库等。这里我要重点强调版本匹配问题CANN版本、驱动版本、固件版本必须是配套的乱搭版本是新手最常见的翻车原因。从华为官网上能下载到Ascend-cann-toolkit_*.run安装包不同版本对应不同的驱动版本。我在部署时用过的比较稳的组合是CANN 7.0.RC1配对应版本的HDK固件官方文档里会给出配套表建议严格按照那个表来。安装姿势比较标准./Ascend-cann-toolkit_*.run --install --install-for-all装完之后环境变量这个坑也很致命。CANN的库文件、工具链路径都要通过环境变量注入每次开新终端都需要source一下source /usr/local/Ascend/ascend-toolkit/set_env.sh我把这行写进了/etc/profile免得每次手动敲。验证CANN是否正常可以用一个小命令看能不能加载到版本信息atc --version能看到CANN版本号输出说明ATC工具已经可用了。走到这一步才算把Atlas 300V 24G的软件地基打好后面所有模型转换和推理都是站在CANN这层之上的。4. 核心环节把YOLO模型转换成OM模型4.1 用yolov5官方脚本导出ONNX在昇腾上跑YOLO第一步不是直接转OM而是先把PyTorch模型导出成ONNX。这里我强烈建议用yolov5官方仓库自带的export脚本能减少很多不必要的麻烦。命令大概是python export.py --weights yolov5s.pt --include onnx --opset 11有几个细节要留意。第一opset别选太高我一般固定用11因为ATC对高版本ONNX中的一些新算子支持还不完整opset 11是最稳妥的区间。第二导出时会把模型里的NMS后处理剥离掉YOLO的NMS逻辑我们上层的numpy代码来做这样模型转换时更干净。第三导出完成后建议用ONNX Runtime做一次推理验证确保输出形状是预期的[1, 25200, 85]以yolov5s 640x640为例25200是80x8040x4020x20三个尺度预测框总和85是4个坐标加1个置信度加80个类别。这一步如果不对后面对齐输出描述非常抓狂。如果导出时遇到onnxsim相关的报错多半是simplify依赖没装可以跳过simplify参数或者单独安装onnxsim。整体来说导出ONNX是整个链路里最简单的一步也是最容易被忽视的一步转换后顺手验证一下能省后面不少事。4.2 用ATC把ONNX转成OMONNX模型在手之后就轮到ATC登场了。ATC工具是昇腾的模型转换器输入ONNX、Caffe、MindSpore等格式的模型输出昇腾离线模型OM。转换命令如下atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_bs1 \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P \ --input_formatNCHW \ --output_typeFP16 \ --logerror参数一个一个说。framework5表示输入是ONNX这是ATC里约定好的编号。input_shape必须和导出ONNX时的输入名和形状保持一致YOLOv5的输入名默认是images。soc_version要和你手里芯片的型号匹配Atlas 300V 24G对应的通常是Ascend310P系列有些版本需要写成Ascend310P3具体可以atc --help查看当前支持的版本列表。output_typeFP16的意思是权重和中间计算用半精度FP16存储在推理任务里精度损失很小但转换后模型体积能小一半推理速度也会更快。转换成功后会生成yolov5s_bs1.om文件控制台会打印类似“ATC run success”的提示。这时候再用atc --model... --output_typeFP16其实还可以做精度校验细节就不展开了。有一点要说的是如果转换时报出某个算子不支持的错误不要急着怀疑人生先去看看到底是哪个算子不支持再回到ONNX导出处改改模型结构或换opset版本大概率能解决。我遇到过一个常见的Split算子异常就是通过调整opset版本解决的。4.3 batch和分辨率怎么定很多人转换时会纠结要不要支持动态batch、动态分辨率我的建议是能固定就固定。ATC可以支持--dynamic_batch_size1,2,4,8这类动态配置但动态shape会带来额外的内存重排和性能损耗在推理场景里反而削弱了专用硬件简洁高效的优势。实操中我一般固定分辨率比如640x640。如果线上流量变化大那就转两个模型一个bs1、一个bs4业务侧按负载切换。24GB显存跑YOLOv5s这种小模型bs4甚至bs8都绰绰有余显存占用非常宽裕。这样既避免了动态shape的性能损失实现时也简单很多。5. 用PyACL写推理代码把检测真正跑起来5.1 初始化Device、Context、Stream的套路模型转换完成接下来就写推理程序。昇腾的编程模型和CUDA非常类似Device对应物理卡号Context是计算的上下文容器Stream是排队执行的任务流。用pyACL写第一步就是初始化这三件套import acl acl.init() # 指定使用0号设备一般是一张卡 ret acl.rt.set_device(0) # 创建Context应用的所有资源都挂在这个上下文里 context, ret acl.rt.create_context(0) # 创建Stream后续推理任务都提交到这个流里 stream, ret acl.rt.create_stream()这套代码基本是固定模板。需要注意昇腾的设备ID和服务器上的物理卡号不一定是一一对应多卡机器上建议先用npu-smi确认一下设备编号。Context和Stream的生命周期管理也很重要程序退出时记得调用acl.rt.destroy_stream和acl.rt.reset_device否则下一轮跑任务时容易被残留资源坑到。5.2 加载OM模型准备输入输出执行推理初始化完成后加载OM模型并准备推理的输入输出# 加载OM模型拿到模型ID model_id, ret acl.mdl.load_from_file(yolov5s_bs1.om) # 创建模型描述符用来查询输入输出的shape和大小 model_desc, ret acl.mdl.create_desc() ret acl.mdl.get_desc(model_desc, model_id) # 读取模型输入输出的尺寸信息 input_size acl.mdl.get_input_size_by_index(model_desc, 0) output_size acl.mdl.get_output_size_by_index(model_desc, 0)在真正推理前图像数据要先做好预处理。YOLOv5训练时用的是RGB通道、归一化到0到1的数据所以读取图片后要按这个流程处理读取图像、resize到640x640、BGR转RGB、除以255.0、再转成NCHW布局。最后通过acl.util.np_to_ptr把numpy数组的地址传给模型输入缓冲区import numpy as np input_data np.ascontiguousarray(img_normalized).astype(np.float16) ptr, ret acl.util.np_to_ptr(input_data)执行推理用的是acl.mdl.execute它会阻塞等待推理完成# 模型输入输出需要用acl.rt.malloc分配的设备内存 # 这里简化示意真实代码还要结合数据缓存复用 ret acl.mdl.execute(model_id, input_ptr, input_size, output_ptr, output_size)推理完成后把输出数据取回到numpy数组。这里我要特别提醒OM模型的输出不一定是你理想中的一个[1, 25200, 85]大Tensor。由于ATC转换时做了算子融合和内存优化输出可能被拆成多个Tensor也可能排列顺序有变化。千万别靠猜一定要遍历模型描述符里的输出个数、每个输出的形状和大小再逐个读取。我踩坑最深的就是这里第一次跑出来的结果全是乱码排查了好久才发现自己把输出缓冲区的顺序搞反了。5.3 后处理置信度过滤、NMS和性能优化模型推理出来的是原始的预测结果需要后处理才能得到目标框。后处理逻辑和原版YOLOv5一致先把输出整理成二维矩阵每一行是[x_center, y_center, width, height, obj_conf, class_scores...]然后按类别做置信度过滤再做NMS。# 简化版后处理伪代码 boxes [] scores [] for det in predictions: obj_conf det[4] class_scores det[5:] class_id np.argmax(class_scores) score obj_conf * class_scores[class_id] if score 0.25: boxes.append(xywh_to_xyxy(det[:4])) scores.append(score) keep nms(np.array(boxes), np.array(scores), iou_threshold0.45)NMS这里用CPU端的numpy实现或者OpenCV的dnn.NMSBoxes都可以因为每帧数据量并不大CPU侧跑NMS不会成为瓶颈。这个设计也是在模型转换时特意把NMS剥离出来的原因一方面让OM模型更简洁另一方面后处理逻辑替换更方便以后想换NMS算法或者加类别过滤逻辑都不用重新转模型。性能优化方面有几个实操经验。输入输出缓冲区可以只分配一次跑batch推理时反复复用不要每帧都重新acl.rt.malloc和拷贝推理尽量用execute_async异步提交到Stream上配合多线程处理多路视频流吞吐量能明显提升。我见过一个小伙伴在单路视频上反复同步推理卡得不行改成异步加多stream之后同样一张卡能扛好几路1080p视频。真要用好Atlas 300V 24G异步编程这关必须过。6. 常见问题与排查技巧实录6.1 一张速查表典型报错和应对方法结合我自己的实操和身边同事的血泪教训整理一个高频问题速查表现象可能原因解决办法ATC转换报错EZ3002提示算子不支持ONNX模型里包含了ATC无法映射的算子检查是哪个算子回导出侧调整opset或替换算子也可以试试--precision_mode参数运行时报aclrtMalloc失败显存不足或未释放旧资源查看npu-smi显存占用关闭其他进程代码里确保device内存释放路径完整推理结果全为0或形状不对忽略了OM模型输出的实际形状和顺序遍历模型描述符读取每个输出的dims和size按描述符解析程序一跑就卡死无输出驱动固件版本不匹配重新刷对应版本的固件用npu-smi确认状态性能明显低于预期用了同步推理、没有复用buffer或者动态shape改用异步Stream固定batch和分辨率做内存复用长时间运行温度过高降频散热不足或卡间间距太小加强机箱风道适当限制多实例并发数这张表里最常遇到的是第一项算子不支持。YOLOv5本身的结构不算复杂大多数情况通过调整opset或者简化导出就能绕过去。如果真的遇到ATC无法处理的算子那就老老实实回到网络设计层面规避比如把一些自定义操作移到后处理里而不要硬焊在模型结构里。6.2 我的排查方法日志、状态与工具三板斧真到了排查问题的时候我最常用的一套流程是这样。第一板斧是开日志昇腾提供了比较详细的运行日志设置环境变量ASCEND_GLOBAL_LOG_LEVEL1可以打开debug级别的日志输出报错原因十有八九能在日志里找到。第二板斧是看状态用npu-smi info确认芯片当前温度、功耗、算力占用尤其是长时间运行后的降频问题只有通过这个工具才能看出来。第三板斧是跑benchmark昇腾社区有ais_bench这类推理性能测试工具可以绕开业务代码直接用OM模型压测帮你区分性能瓶颈到底在模型侧还是业务代码侧。有一次我排查一个“推理偶尔很慢”的问题客户端代码死活找不到原因后来用ais_bench单独跑模型发现延迟整体是稳定的才意识到是业务侧频繁申请释放内存导致的碎片化问题。把buffer改成复用之后问题立刻消失。这个教训让我明白了部署调试这件事工具链一定要先自己玩熟别在业务代码里瞎猜。提示安装完CANN后官方文档里都会给出快速上手的样例强烈建议先把这些例程跑通一遍再开始自己的模型。例程跑通说明环境没问题例程跑不通多半是环境问题这时候排查自己的代码没有意义。7. 一些真实的体会与收尾建议如果只看参数表Atlas 300V 24G给人感觉像“一块便宜的GPU”但真正用起来你会发现它的设计逻辑和GPU完全是两条路线。GPU的单机生态太成熟了凡事都能靠庞大的社区和经验贴解决昇腾这边虽然文档也在快速补齐但更多时候需要自己看日志、看算子、看工具链。这个过程确实有学习成本可一旦把CANN这套体系摸熟了后面换模型、换场景都顺很多。我对这块卡的综合评价是特别适合视频流场景下的YOLO类模型推理。24GB显存提供了很高的内存天花板硬件解码能力又直接吃掉了多路视频流的处理成本整机功耗和采购价格都比较可控。如果项目有国产化要求或者你想超低功耗跑多路实时检测Atlas 300V 24G是值得放在选型表里的重要选项。最后再分享一个自己的小经验所有部署在上生产之前先确定好固定的输入分辨率和batch策略然后把NMS彻底剥离到模型外部内存缓冲区做一次性分配异步Stream尽早用起来。这四个原则做到位Atlas的稳定性和性能基本就不会差到哪去。安心折腾吧把环境跑通之后这块卡的性价比确实能让人真香。
返回列表