ARTICLE DETAIL

资讯详情

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

昇腾Atlas 300V 24G部署YOLO推理加速卡实战

昇腾Atlas 300V 24G部署YOLO推理加速卡实战 这两年我一直在折腾 AI 推理部署从 GPU 到各类边缘计算盒子都过了不少手。如果你最近开始关注华为昇腾这套生态估计会跟我当初一样冒出三个问题Atlas 300V 24G 到底算不算运算加速卡它能不能拿来跑 YOLO在上面部署 YOLO 要折腾多久这篇就把我这里跑通的整套思路、步骤和踩过的坑一次说清楚给真正打算在 atlas 上部署 yolo 的人一份可以直接抄作业的参考。先说结论Atlas 300V 24G 是运算加速卡但准确点说它是专门为 AI 推理场景设计的加速卡不是用来替代通用 GPGPU 跑科学计算那种。把 YOLO 网络从 ONNX 转成 OM 离线模型之后在 atlas 上做推理性能和功耗都挺能打的。这篇文章适合两类人一类是刚接触昇腾、对 Atlas 产品线还不熟悉的入门者另一类是已经拿到卡、正准备把 YOLO 模型迁移上去但不知道从哪里下手的部署工程师。1. 项目概述atlas 到底是什么平台1.1 先回答热词Atlas 300V 24G 是运算加速卡吗直接给答案它是运算加速卡但在华为昇腾的官方定位里更准确的叫法是“AI 推理加速卡”。这类卡跟训练卡不太一样强调的是推理场景下的吞吐量和时延而不是像训练卡那样去算大范围的梯度更新。所以你看它的产品规格也能发现Atlas 300V 24G 用的是 PCIe 接口被动散热单卡功耗控制在常规服务器能接受的范围这让它非常适合在既有服务器里直接插卡扩展算力。这里有个容易混淆的地方Atlas 整个产品家族很大包括 200 系列的开发套件、300 系列的加速卡、500 系列的小站、800 系列的服务器等。Atlas 300V 24G 属于 300 系列里的加速卡形态特别适合做图像类模型的推理。你可以把它理解成一张“专吃 AI 推理”的加速卡给它模型、给它图片它还你识别结果。那它有没有通用计算能力也能跑一些通用算子但如果你指望像 CUDA 那样写任意并行程序那生态和支持程度都跟 GPU 没法比。所以我的建议是把 Atlas 300V 24G 定位于“推理专用加速卡”而不是通用计算卡。它的 24GB 显存对应的是大一点的模型、更高的分辨率、以及更长的 batch 吞吐我实际跑 YOLOv5 和 YOLOv8 迁移过来的模型完全够用。1.2 为什么用 atlas 部署 yolo选型背后的盘算你可能会问YOLO 在 GPU 上部署不香吗为什么要在 atlas 上折腾这个问题问得很有价值。部署选型永远是平衡题性能、功耗、成本、生态、供应链。首先Atlas 300V 24G 在同等价位的 GPGPU 里推理性价比并不差。GPU 如果只做推理其实大量算力和显存带宽是浪费的很多场景用专业推理卡反而更划算。24GB 显存也意味着你能跑一些带大输入分辨率、长序列的模型。我做目标检测时常用的 YOLOv5s、YOLOv7-tiny模型转换完之后跑起来单路视频流每秒处理帧率相当可观而且整卡功耗比一张动辄几百瓦的 GPU 低不少。其次国产化替代和自主可控是个现实趋势很多项目招标和交付里明确要求支持国产 AI 加速硬件。作为搞部署的人提前把 atlas 这套工具链跑熟相当于给自己多攒一条技术路线。虽然昇腾生态相比 CUDA 生态还有差距但它的 CANN 架构、MindX SDK 工具链该有的东西都在文档也在快速补齐。另外atlas 部署 yolo 有一个好处因为整条链路上模型转换要做算子适配你会被迫把模型结构、输入输出、预处理细节都摸一遍。这个“被迫”的过程反而帮你把目标检测模型的整个推理链路理解得更透。1.3 atlas 产品线里哪些卡适合跑 yoloAtlas 300 系列里常见的有 Atlas 300I Pro、Atlas 300V Pro、Atlas 300V 等型号。我这里说的是带 24GB 显存的 300V 版本它属于昇腾 310P 系列芯片是为推理设计的。同系列的卡在芯片架构上相近主要差异在显存容量、功耗、视频编解码能力和适用服务器类型。如果你手头是 300I Pro别慌部署 yolo 的流程几乎一样只是 soc_version 和显存大小不同转换模型时需要对应调整。如果你用的是 Atlas 300V 24G那就直接按我下文步骤来大部分命令直接可用。如果拿不准自己的卡对应哪个 soc_version建议先装好驱动并运行npu-smi info确认卡的类型再对照官方 支持的 soc 列表这一步比什么都重要。2. atlas 部署 yolo 的完整前置准备2.1 硬件环境与系统要求部署前先检查硬件。我用的是一台普通 x86 服务器插一张 Atlas 300V 24G。要注意的是这种加速卡对 PCIe 通道数量有一定要求插在主板的 PCIe x16 或 x8 槽位上比较稳妥如果你同时插多张卡还要留意散热空间和电源功率。单卡功耗我实测并不高但服务器电源留出余量始终是好事。系统方面Ubuntu 20.04/22.04 我都在客户环境里遇到过整体兼容性可以。宿主机内核建议保持相对新的稳定版本旧的 4.x 内核可能对驱动支持不友好。另外服务器 BIOS 里最好把 Above 4G Decoding 打开这对 PCIe 设备访问大显存很重要。装驱动之前先用 lspci 检查系统能不能正确识别到卡如果 lspci 已经能看到“Huawei Technologies”相关设备说明硬件层面基本没问题。2.2 CANN 软件栈与工具链华为昇腾的软件栈简单拆解由下往上大约四层驱动固件、CANN华为计算架构、推理执行引擎、应用代码。CANN 对标的其实就是 CUDA。CANN 里面包含了运行、算子、图编译等组件其中你在部署 yolo 时最常用的两个东西ATC 工具模型转换和 ACL推理接口都来自它。安装的时候注意区分“开发环境”和“运行环境”。用于模型转换和写推理代码的机器需要装完整的 toolkit如果只是生产环境跑推理可以只装 nnae 运行包。我建议第一次接触的人直接装完整 toolkit省得后面缺组件。从官网下载对应 CPU 架构的安装包注意 x86_64 和 aarch64 版本不能混下载完成后按文档执行即可。安装完一定要 source 它的 set_env.shsource /usr/local/Ascend/ascend-toolkit/set_env.sh这句我每次写教程都强调是因为十个有问题的人里至少有三个是忘了 source 环境变量。不 source后面的 atc、npu-smi 指令大概率直接报 command not found你说冤不冤。2.3 最小验证npu-smi 与驱动自检装完驱动固件和 CANN 后先别急着转模型。第一步先确认设备能被系统正常访问命令就是npu-smi info。正常情况会显示芯片信息、显存、驱动版本、温度等如果显示 device 不可用或者 ERT 出错多半是驱动固件没装好或者需要重启机器。第二步随便准备一个小 ONNX 模型用 atc 转一次试试。不需要太大一个简单分类模型、甚至一个 10 层以内的小网络都行。这一步成功说明你的 CANN 环境和 soc_version 配置是通的。很多人一上来直接拿 YOLO 完整模型转报错了也分不清是自己命令问题、模型算子问题还是环境问题。先小后大排查效率会高很多。我实际操作里习惯把常用环境变量写进启动脚本export ASCEND_HOME/usr/local/Ascend/ascend-toolkit/latest source $ASCEND_HOME/bin/setenv.bash不同版本可能脚本名稍有不同但思路一样把环境准备好是部署 yolo 路上最简单的“成功关键因素”。3. 实操从 yolo 模型到 atlas 推理全流程3.1 准备 YOLO 模型并导出 ONNX我用的是 YOLOv5s 作为示例因为它的权重容易获取导出 ONNX 的流程也简单。无论你是自己的训练权重还是官方预训练权重第一步都是导出 ONNX。YOLOv5 仓库里自带了 export.pypython export.py --weights yolov5s.pt --img 640 --batch 1 --include onnx --opset 11注意几个细节第一--img要和后面推理时的尺寸保持一致我常用 640第二--batch 1先转单 batch等流程通了再考虑动态 batch 或多 batch第三--opset 11以上太低的 onnx opset 可能不支持某些算子转换。导出之后用onnxsim简单优化一下会更友好不过这一步不是必须。重点是你要清楚导出后的模型输出是什么。YOLOv5 的导出模型可能包含 decode 后处理也可能只是原始 head 输出视版本和参数而定。我建议你导出后用官方推理跑一遍比对做到心里有数。到 atlas 这边我倾向保留原始头输出把 decode 和 NMS 留在业务代码里这样出问题时每一步都能独立排查。3.2 ATC 工具把 ONNX 转成 OM 模型这是 atlas 部署 yolo 最关键的一步。ATC 工具会把你的 ONNX 计算图拆解成昇腾 NPU 能高效执行的算子序列最终生成 OM 离线模型。基础命令如下atc --modelyolov5s.onnx --framework5 --outputyolov5s_bs1 \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3几个参数逐个说。--framework5表示输入是 ONNX--input_shape必须和导出的模型输入完全一致--soc_version是重头戏不同型号的卡要填不同的值填错了直接报错。具体你的卡该填什么前面说过用npu-smi info查卡类型再对官方文档确认。如果模型里有 ATC 不支持的算子报错会明确告诉你。解决办法通常是换个模型版本、修改导出代码、或者升级 CANN 到更高版本。YOLOv5 比较主流昇腾社区适配做得不错基本只要环境版本对都能顺利转出来。转成功后目录下会生成.om文件这就是能直接在 atlas 上跑的模型。3.3 AIPP 与图像预处理策略在 atlas 上跑 yolo预处理有两套路线一个是在 CPU 端用 Python/OpenCV 处理成模型需要的 shape 后拷贝给 NPU另一个是配置 AIPP把缩放、减均值、除以 255 这些操作用硬件加速的方式嵌到模型输入里。我的建议是首次跑通时先用第一条路线把流程验证稳定再考虑用 AIPP 省 CPU。常见 AIPP 配置如下一个简单的静态预处理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] var_reci_chn: [0.00392156863, 0.00392156863, 0.00392156863] }这里核心是var_reci_chn把 0~255 的输入缩放到 0.0~1.0对应 PyTorch/YOLO 里的归一化策略。使用 AIPP 时给模型传的输入就可以是 U8 图像数据不再需要额外做 float32 的转换。但注意不要搞混 channel 顺序YOLOv5 训练时用的是 RGB如果 AIPP 里顺序填成 BGR结果会很离谱。3.4 编写推理代码并跑通单张图片模型和预处理准备好后就可以写推理代码。底层 ACl 接口的调用逻辑大概分几步初始化 ACL、绑定设备、加载模型、创建输入输出数据、执行推理、解析结果。这里用伪代码展示核心流程具体 API 写法建议直接参考昇腾官方 samples 仓库里 Python 版本import acl # 1. 初始化 acl.init() # 2. 指定设备 device_id 0 acl.rt.set_device(device_id) # 3. 创建 context context acl.rt.create_context(device_id) # 4. 加载模型 model_id acl.mdl.load_from_file(yolov5s_bs1.om) # 5. 准备输入假设输入是 1,3,640,640, float32 # 把预处理好的数据拷贝到 device 内存 # 6. 执行推理 acl.mdl.execute(model_id, input_data, output_data) # 7. 解析输出做 decode NMS # 8. 清理和释放资源如果你不想从零写直接找昇腾社区里的 ACLLite 封装示例它已经把模型加载、图像预处理、推理结果整理好了改改路径就能跑。我第一次跑 yolo 就是基于 ACLLite 的省了很多底层调试精力。官方 samples 仓库已经带了 YOLOV3/YOLOV5 相关的适配代码这个起点很合适。3.5 性能观测让数字说话跑通只是第一步部署要的是性能。atlas 上最直接的观测工具就是npu-smi info它会显示芯片利用率、显存占用、温度和功耗。我在实际测试时会写一个循环脚本持续跑推理同时后台间隔记录 npu-smi 输出观察利用率是否稳定在较高水位。如果利用率只有百分之十几那大概率是预处理或结果解析成了瓶颈而不是 NPU 本身跑不快。此外 CANN 提供了 profiling 工具可以定位到算子的耗时明细。但我的经验是目标检测这类场景与其先抠算子性能不如先把 CPU 端的图像缩放、归一化优化好。特别多路视频输入时CPU 预处理往往会先顶不住。这也是前面我做性能优化时最先踩到的坑模型推理可能才 10 毫秒预处理加后处理反而花了 20 毫秒。4. 踩坑实录atlas 部署 yolo 常见问题排查4.1 快速排错对照表现象可能原因解决方法atc 报 soc_version 错误填的芯片型号跟实际卡不匹配运行 npu-smi info查卡型号后对照官方文档确认atc 不支持某算子CANN 版本较老或算子未适配升级 CANN换导出参数拆分成多个子图转出来的 OM 推理结果全为 0模型输入和 AIPP 预处理不一致检查归一化、通道顺序、letterbox 填充逻辑Python 调用 acl 库失败没有 source set_env.sh或环境变量缺失检查环境初始化脚本推理帧率特别低CPU 预处理/后处理瓶颈开启多线程预处理或把预处理下沉到 AIPP/设备端exec 报内存不足显存不够或者 model 输出 buffer 太小减少 batch、调整分辨率或检查输入输出尺寸4.2 重点坑一soc_version 填错这个坑我印象太深了。第一次部署 atlas拿到一张卡就去问文档想当然填了一个 soc_version结果 atc 报错提示设备不支持。后来用npu-smi info看到了实际型号再到官方支持的 soc 列表里找才明白不同型号的卡对应的算子上限、语义都不一样。最稳妥的做法先查卡再对着官方列表逐字抄写 soc_version别凭记忆填。4.3 重点坑二预处理和训练时不一致YOLO 类模型对输入数据分布很敏感。模型训练时做的是 RGB 输入、除以 255 归一化到 [0,1]如果你在 atlas 上部署时AIPP 配的均值、缩放系数不对或者把 RGB 当成了 BGR推理精度就会断崖式下降。这种问题最难查因为 model 能正常推理lot 的框也能给出来就是精度不对。我排查时的经验是先用一张固定图片做单图测试把 CPU 预处理方式从简单到复杂逐级切换对比 Python 端和 atlas 端的输出很快就能定位是哪一层预处理不一致。4.4 重点坑三decode 后处理到底在哪做YOLO 模型的输出到底包不包含 decode是新手最容易懵的地方。不同仓库、不同导出方式出来的 ONNX 输出差异很大。有的输出直接是 (1, 25200, 85)坐标已经是 xywh有的是三个 head 的原始张量需要你自己解码并做 NMS。如果你把后处理逻辑假设错了结果自然不对。我建议在导出 ONNX 后先用 Python 端做一次推理把输出张量打印出来再对照 YOLO 源码里的 decode 逻辑确认。这一步几分钟却能帮你少走一晚上的弯路。4.5 避坑技巧补充除了以上三个大坑还有几个小细节值得注意。第一多卡机器上运行时要显式指定使用哪张卡否则可能默认访问 device 0当你的人却在看 device 1 的利用率容易误判第二CANN 版本和驱动版本尽量配套不要一个最新一个老版本我遇到过因为驱动版本旧导致算子执行结果不对第三模型的 NMS 阈值和置信度阈值尽量迁移到业务代码里用 Python 处理方便后续调整先不要在转模型时固化。5. 写在最后关于 atlas 的一些真实体感文章写到这主体流程已经完整从验证 Atlas 300V 24G 是不是加速卡到环境准备、模型转换、推理代码、性能观察、问题排查这一条链路挺长但每一步都能逼你更懂底层。个人体感是atlas 部署 yolo 这类成熟的检测网络技术门槛并不高主要成本在于对工具链不熟悉导致的反复试错。我最后再多说一句先把流程跑通再谈性能优化。第一次做部署的人总会想着一步到位把 AIPP、多线程、profiling、动态 batch 全上齐。结果一出问题都不知道是哪一环出的错。我自己的节奏是先用最简单的 Python 预处理、单 batch、静态分辨率把端到端跑通确认精度和性能基线之后再逐项加优化。每一步的改动都可以独立回滚排查也方便。这个内容后续还可以继续扩展的方向挺多比如多路视频流接入、atlas 上的 yolov8 适配、用 MindX SDK 做拖拽式推理流水线以及 batch 推理的吞吐调优。看这篇内容反映如何后面有时间我再把 yolov8 适配和 MindX SDK 部署的实操细节也整理出来继续聊。
返回列表