尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Atlas 300V 24G推理加速卡部署YOLO全流程与避坑指南

Atlas 300V 24G推理加速卡部署YOLO全流程与避坑指南 前几天又有朋友私信问我“Atlas 300V 24G 是运算加速卡吗怎么我插上之后系统里看不出显存部署YOLO还老是报错”这个问题其实问到了点子上。很多人一看到“AI加速卡”“24G”这几个字下意识就把它和显卡画等号然后按显卡的思路去装驱动、调CUDA、跑PyTorch最后卡在第一步。这篇就把Atlas这张卡的定位、部署YOLO的完整链路以及我实际踩过的坑一次性讲清楚给准备入手或者正在折腾的朋友少走点弯路。1. Atlas 300V 24G 到底是什么卡先把这个最常见的疑问拆干净1.1 它是不是“运算加速卡”先看定位先把结论放前面Atlas 300V 24G 属于AI推理加速卡偏视频解析和推理场景不是用来干通用计算的卡。很多人纠结“运算加速卡”这个词是因为商家页面上把“推理卡”“加速卡”“AI计算卡”混着写导致大家默认它能像GPU一样跑CUDA、训练模型、做通用并行计算。实际上Atlas系列的定位非常明确卡型定位典型使用场景Atlas 300I Pro推理卡主打通用AI推理图像分类、目标检测、OCR、语音识别等模型推理Atlas 300V Pro视频解析加速卡主打视频流硬解码推理视频结构化、安防监控、智慧交通等视频分析场景Atlas 300T训练卡主打模型训练深度学习训练、微调Atlas 300V 24G 的“V”就是视频Video方向所以它除了有AI算力之外还带了很强的视频编解码单元。很多人觉得它便宜、显存又大想买来跑训练或者当通用加速卡用结果发现PyTorch根本没法直接调用它这就是第一个大坑。那它算不算“运算加速卡”从广义上讲它能做张量计算能加速AI推理所以叫“运算加速卡”不能说错。但从实际使用角度讲它不是一个通用的GPGPU不能执行CUDA代码也不能直接跑带GPU版本的PyTorch/TensorFlow。它必须通过华为的CANNCompute Architecture for Neural Networks工具链和专门的推理框架去调用。理解了这一点后面的部署思路就顺了。1.2 和NVIDIA GPU的差异为什么很多人把它当成“N卡替代品”是个坑我自己最早也是从CUDA那套生态过来的刚开始接触Atlas时犯了个经验主义错误以为把device(cuda)改成device(npu)就能跑通。结果发现完全不是一回事。差异主要体现在三层底层驱动不一样N卡用的是NVIDIA驱动 CUDA运行时Atlas用的是昇腾驱动 CANN工具包两者完全不兼容不能混装也不能互相替代。模型格式不一样N卡直接吃ONNX、TensorRT、PyTorch导出模型Atlas的推理引擎主要吃.om格式离线模型需要先用ATCAscend Tensor Compiler把模型转换成om格式转换过程中还要指定芯片型号Soc Version。算子生态不一样PyTorch里一个简单的操作在CUDA上可能一个算子就完成了但到了Atlas上可能不支持或者需要替换成几个基础算子。尤其是YOLO系列里的某些自定义算子比如Focus模块、部分C3结构在ATC转换时容易报“不支持”的错误。所以我的建议是如果你想找一张卡替代NVIDIA GPU跑训练那Atlas不是你的选择如果你只是想低成本做大批量推理部署尤其是视频流分析场景那Atlas 300V 24G这个价位和24G大显存确实很香值得折腾。1.3 Atlas系列选型300I、300V、310P到底怎么分再强调一下选型。Atlas卡有很多SKU很多人被名字搞晕。我整理了一个简化版的选型表方便后面部署时对照型号芯片显存算力特点适合场景Atlas 300I ProAscend 310P16GB/24GB通用推理功耗低各类AI模型推理服务Atlas 300V ProAscend 310P24GB视频编解码能力强视频解析、目标检测、多路视频流处理Atlas 300TAscend 91024GB以上训练和推理兼顾模型训练、微调我这次折腾的是Atlas 300V Pro 24G所以文章里的环境都是围绕它来的。它的Soc Version在ATC转换时通常填Ascend310P3具体用npu-smi info查看。如果你手上是别的型号Soc Version要自己确认这个参数填错了转换出来的om模型在卡上根本无法加载。2. 部署环境准备驱动、固件、CANN的版本三角关系2.1 拿到卡之后的第一步不是装驱动而是确认服务器形态Atlas 300V Pro有两个形态一种是PCIe插卡可以直接插到x86/ARM服务器的PCIe插槽上另一种是随Atlas服务器整机出货。如果是PCIe插卡先看服务器主板支不支持然后开机进BIOS查看能否识别到设备。这一步看起来简单但恰恰很多人翻车。有个朋友把卡插上去lspci看不到设备后来发现是PCIe供电不足。Atlas 300V Pro满载功耗不低PCIe插槽供电有限一定要确认是不是需要外接供电线。我的服务器是双路XeonPCIe插槽供电没问题但如果你用普通台式机主板很可能需要额外供电或者更换电源。还有一个容易忽略的点CPU架构。Atlas的驱动和CANN支持x86和ARM鲲鹏但不同架构对应的安装包不一样。下载驱动时如果选错架构装完大概率起不来。查看命令uname -m2.2 驱动、固件和CANN的版本匹配原则Atlas这套环境不像装CUDA那么简单它有三层东西要装固件Firmware、驱动Driver、CANN工具包。我踩过最离谱的坑是驱动和CANN都是新版本但固件没升级结果加载om模型时直接报“Device not ready”。版本匹配的核心原则是以CANN版本为准对应安装配套的驱动和固件版本。华为官方每个CANN版本都会给出一个“驱动固件配套表”不要去网上随便下载最新版驱动一定要按配套表来。我自己最终用的版本组合是仅供参考以你实际下载页面为准组件版本驱动昇腾驱动 23.0.RC3固件昇腾固件 23.0.RC3CANNCANN 7.0.RC3安装顺序是先装固件再装驱动最后装CANN。每一步装完建议重启一次尤其是固件升级后必须重启。安装命令一般是以root身份执行# 固件升级 ./Ascend-hdk-*.run --upgrade # 驱动安装 ./Ascend-hdk-*.run --install # 重启 rebootCANN的安装就是解压后执行./Ascend-cann-toolkit_*.run --install装完之后设置环境变量source /usr/local/Ascend/ascend-toolkit/set_env.sh2.3 装好之后怎么确认设备状态环境装好后先别急着跑模型用几个命令确认设备状态npu-smi info这个命令类似NVIDIA的nvidia-smi能看到卡的状态、温度、内存占用、芯片型号等信息。如果这里看不到卡说明驱动或固件有问题后面什么都别谈。再确认CANN版本cat /usr/local/Ascend/ascend-toolkit/latest/version.cfg如果npu-smi info能看到设备并且CANN版本和驱动配套就可以开始转换模型了。3. YOLO上卡完整链路从PyTorch权重到om离线模型的每一步3.1 总体流程为什么要转成om格式在Atlas上跑YOLO整个链路是PyTorch权重 - ONNX - om离线模型 - ACL推理接口 - 目标检测结果为什么中间要通过ONNX因为在昇腾上ATC转换工具对ONNX的支持最成熟PyTorch直接导出不一定被识别。而最终转成om格式是为了让模型经过算子的融合、内存布局优化、量化等步骤匹配昇腾芯片的运行要求。类似TensorRT把模型转成engine但om是昇腾的原生格式。跑推理时我们不再需要PyTorch环境只需要CANN自带的Python ACLAscend Computing Language接口或者MindX SDK。3.2 YOLOv5权重转ONNX我这里以YOLOv5为例因为目前还是很多人用。先准备好PyTorch环境用官方仓库导出ONNXpython export.py --weights yolov5s.pt --include onnx --opset 11这里有一个关键点opset尽量用11。有些版本默认用opset 13ATC转换时反而容易出问题。导出的ONNX模型里可能包含一些动态维度建议在导出时指定固定shapepython export.py --weights yolov5s.pt --include onnx --opset 11 --batch-size 1 --img-size 640 6403.3 ATC工具转om关键参数解释得到ONNX文件后用ATC命令转om。我的转换命令如下atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s \ --input_shapeimages:1,3,640,640 \ --input_formatNCHW \ --soc_versionAscend310P3 \ --insert_op_confaipp.cfg \ --output_typeFP16逐个参数说一下--framework5表示输入模型是ONNX这里5是ONNX的枚举值别记错4是Caffe1是TensorFlow。--input_shape固定输入尺寸。YOLOv5在PyTorch里如果开了动态shape导出的ONNX输入维度可能是[1,3,-1,-1]ATC转不了所以导出时最好固定640×640。--soc_version必须和实际芯片一致这个最关键。用npu-smi info查到芯片是Ascend 310P对应填Ascend310P3。--insert_op_confaipp.cfg可选但强烈建议加。AIPP可以把图像预处理缩放、归一化、颜色转换放到芯片上做省掉CPU预处理开销。我的aipp.cfg配置参考aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_w: 640 src_image_size_h: 640 crop: false mean: 0 0 0 min: 0 0 0 csc_switch: false }如果你的输入是BGR图片记得把input_format改成BGR888_U8或者在Python端先转成RGB不要搞混。转换完成后会生成一个yolov5s.om文件。看到 “ATC run success” 就说明成功了。3.4 用Python推理接口加载om跑通YOLOom生成后推理有两种主流方式一是用pyaclPython接口的ACL二是用MindX SDK。我用的是纯Python的pyacl接口轻量、可控性强。核心步骤大致如下import numpy as np import acl # 初始化 ret acl.init() ret acl.rt.set_device(0) # 加载模型 model_id acl.mdl.load_from_file(yolov5s.om) # 创建输入输出数据集 input_desc acl.mdl.get_input_desc(model_id) output_desc acl.mdl.get_output_desc(model_id)实际上ACL的接口封装得比较底层用起来比较繁琐而且不同版本API有差异。为了方便我习惯自己封装一个简单的工具类把模型加载、推理、资源释放都包进去。这里只展示最关键的推理调用def inference(model_id, input_data): # 申请设备内存并拷贝输入 input_ptr acl.rt.malloc(input_data.nbytes, 2) acl.rt.memcpy(input_ptr, input_data.nbytes, input_data.tobytes(), 2) # 准备输出 output_size 1024 * 1024 * 4 # 根据模型输出动态设置 output_ptr acl.rt.malloc(output_size, 2) # 执行推理 ret acl.mdl.execute(model_id, [input_ptr], [output_ptr]) # 将输出拷贝回CPU output_data acl.rt.memcpy_d2h(output_size, output_ptr) return output_data注意上面的代码是简化示意实际项目里需要根据模型输入输出的维度动态计算buffer大小避免越界。我的建议是先用npu-smi info监控推理时显存占用确认没有内存泄漏。3.5 后处理和性能验证YOLOv5的om模型输出跟PyTorch不太一样它输出的可能是三个尺度的原始预测特征图也可能已经做了部分解码取决于你导出ONNX时的处理方式。我踩过的一个典型问题是如果直接把PyTorch后处理一起导出ONNXATC转换时可能会报算子不支持如果只导出backbonehead后处理放Python端做性能又会被拖慢。我的做法是只导出YOLOv5的backbonehead后处理NMS、阈值过滤用Python或者Cython实现。主要原因有两点后处理里的非极大值抑制NMS在Atlas上支持得不好强行转换反而容易失败其次Python端做后处理虽然多了些CPU开销但调试方便后续如果性能吃紧可以再针对性地把NMS放到C侧。验证单张图片推理耗时可以用一个简单的循环测试import time import numpy as np img np.random.randint(0, 255, (1, 3, 640, 640), dtypenp.uint8) for _ in range(10): # warmup inference(model_id, img) start time.time() for _ in range(100): inference(model_id, img) end time.time() print(favg inference time: {(end - start) / 100 * 1000:.2f} ms)在我这套Atlas 300V Pro 24G上YOLOv5s 640×640的纯模型推理时间大约在8~12ms也就是80~100帧左右但加上预处理和后处理完整流程一般在15ms左右单路视频流跑到30~50帧问题不大。4. 实际部署中踩过的坑内存、算子、输入尺寸一个都别漏4.1 24G显存却显示只有0G/卡死这是我遇到的问题里最诡异的npu-smi info显示内存占用为0但只要一加载模型系统就报“Out of Memory”。排查了很久发现是没给进程设置设备ID多个进程默认都抢device 0。如果有多个Atlas卡或者系统里还有其他占用芯片的进程就会互相冲突。解决办法是在代码里显式设置设备ret acl.rt.set_device(0) # 根据实际设备号还有另一个原因Atlas 300V Pro 24G的24G显存有一部分是留作视频编解码使用的ATC转换时如果不限制内存池默认会申请一块很大的内存导致显存不足。可以通过环境变量控制内存池大小export ASCEND_RT_VISIBLE_DEVICES0 export HCCL_CONNECT_TIMEOUT104.2 动态shape导致的转模型失败前面提到过ONNX模型如果输入shape是动态的比如[1,3,-1,-1]ATC转换时会报错[ERROR] input shape is dynamic很多人想兼顾不同分辨率的图片但Atlas对动态shape的支持很弱。我的建议是固定输入分辨率比如640×640或1280×1280然后在图片预处理时做letterbox填充。不要想着省这点事动态shape会给你带来更多麻烦。4.3 部分算子不支持的替换思路YOLOv5的C3结构里有大量SiLU激活函数有些旧版本CANN对SiLU的算子支持不太完善转换时会报未知算子。遇到这种情况有两个思路修改导出代码把SiLU替换成等价的x * sigmoid(x)虽然可能多出几个算子但兼容性更好。升级CANN版本新版本对常见检测模型的支持已经比较完整很多算子已经实现优先升级CANN。我在7.0.RC3版本上转YOLOv5s没有遇到算子问题但转YOLOv7时遇到了自定义算子最后的办法就是改导出代码把不支持的模块直接拆开。4.4 CPU后处理反而变成瓶颈可能有人发现一个奇怪现象模型推理本身只要10ms但完整流程却要50ms。我的实测结果显示瓶颈往往在Python后处理上。单帧YOLOv5s的NMS在Python里跑快则10ms慢则30ms完全看目标数量。目标一多比如一个画面里50多个人纯Python后处理直接吃掉大半性能。解决方案有几种用numpy向量化后处理尽量避免Python循环。用Cython重写NMS。使用MindX SDK里的后处理插件它针对昇腾做了优化。我实际用的是numpy向量化改动量最小效果提升也明显。这里分享一个关键思路把每个anchor的输出用矩阵运算同时过滤而不是for循环。比如用np.where(conf threshold)一次性挑出合适的目标再做NMS速度能提升3倍以上。5. 性能调优与稳定性经验让YOLO在Atlas上稳定跑到可用状态5.1 多路视频流场景的Batch策略Atlas 300V Pro 主打多路视频解析因此它的最强场景不是处理单张图片而是同时处理多路视频流。部署YOLO做视频流分析时千万不要一路流单独一个推理线程而应该把多路视频帧合并成一个batch一次推理处理多路。比如4路1080P视频流每路抽帧后缩放到640×640攒够4张图组成一个shape为[4,3,640,640]的输入一次推理完成。这种方式能充分利用Atlas的算力实测吞吐量比单帧逐个推理提升2~3倍。但batch也不是越大越好。batch太大会增加单帧延迟第一次推理要等凑齐batch同时显存消耗也会上升。我试过batch824G显存勉强够用但延迟高了batch4是我的均衡点。5.2 异步推理和内存复用ACL接口支持同步和异步两种推理模式。同步推理代码简单但CPU等待GPU/NPU输出时会浪费很多时间。在视频流场景我强烈建议用异步推理ret acl.mdl.execute_async(model_id, input_ptr, output_ptr, stream_id)异步推理把任务提交到stream上然后在等待期间去做下一帧的预处理。这样预处理的耗时被隐藏一部分整体吞吐能再提升20%左右。内存复用也很关键。每次推理都重新acl.rt.malloc和free会带来明显开销。比较好的做法是在加载模型后一次性申请好输入输出缓冲区推理过程中反复使用同一块内存只更新里面的数据。这样既能减少内存碎片又能避免频繁申请释放导致的性能抖动。5.3 实测数据参考我在实际部署中测试过几种配置结果供参考配置单帧推理耗时单路视频流帧率4路视频流总帧率YOLOv5s 640, 同步推理, Python后处理28ms35 FPS约50 FPSYOLOv5s 640, 异步推理, numpy后处理15ms55 FPS约100 FPSYOLOv5s 640, batch4, 异步推理, numpy后处理12ms/帧80 FPS约160 FPS注意帧率是“模型处理能力”实际还要考虑视频解码、抽帧策略。Atlas 300V Pro自带视频解码单元可以把视频流硬解码成YUV/RGB帧直接送进模型这部分能省不少CPU。如果你只用它的AI推理能力不碰视频解码那24G显存和编解码资源都有点浪费。6. 给准备入手Atlas的朋友几句掏心窝的话我自己折腾Atlas也花了不少时间这边最大的体会就是别把它当GPU用。它是一套独立的技术栈驱动、模型格式、推理接口都和CUDA生态不同刚开始会有一段适应期。如果你原本就是做PyTorch训练、跑CUDA的那短期内换到Atlas会非常别扭建议先确认自己的场景是否真的适合。如果只是做推理部署、有大批量视频流要处理那Atlas 300V 24G这个价位确实能打尤其多路视频并发能力比同价位显卡强不少。还有一个很现实的经验买之前一定确认好Soc Version和CANN版本。很多二手渠道卖的卡固件和驱动版本可能非常老买回来先别急着跑模型先把固件驱动升级到配套版本能省下大量排查时间。我那次“显存显示0G”的问题最终就是重刷固件解决的至今记忆犹新。最后分享一个我一直在用的小技巧把所有部署脚本和版本配套表存到项目仓库里机器重建时照着手册来半小时就能恢复环境。别以为记在脑子里就行Atlas这套环境的版本细节太多有了配套表环境基本不会跑偏。
返回列表