ARTICLE DETAIL

资讯详情

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

昇腾Atlas 300V 24G推理卡跑通YOLO模型的完整实战指南

昇腾Atlas 300V 24G推理卡跑通YOLO模型的完整实战指南 搞到一块Atlas 300V 24G加速卡折腾了一周才把YOLO模型在上面跑通。这卡在二手市场流通量不小价格比同显存的游戏卡便宜不少但坑是真多——网上能查到的教程大多停留在“装个驱动、跑个demo”的层面一上真实模型就各种姿势翻车。这篇文章把我从零开始踩过的坑、验证过能用的流程、还有几个关键参数的调试心得全部整理出来给准备入坑昇腾推理的你省点时间。1. 硬件定位与选型思路先回答那个高频问题Atlas 300V 24G到底是不是运算加速卡是但它跟我们熟悉的GPU加速卡有本质区别。Atlas 300V是华为昇腾310P芯片的PCIe推理加速卡核心定位是AI推理加速不是通用计算卡。它不能像NVIDIA的A100或RTX系列那样跑CUDA通用计算也不能做模型训练勉强能跑但效率极低它的任务非常专一把训练好的模型以最高性价比的方式跑起来。1.1 从芯片到整卡的规格解读Atlas 300V的核心是昇腾310P这颗芯片在昇腾家族里属于偏推理侧的定位。24G指的是板载显存容量DDR4代带宽跟HBM没得比但架不住容量大。整卡INT8算力大概在140TOPS附近这个数字在推理卡里属于中上水平。实际使用时要注意这卡不带主动散热风扇是典型的被动散热设计依赖服务器机箱的风道散热。这意味着它没法像游戏显卡那样随便插在普通台式机上跑必须有一台风道正常的服务器或者工作站。我自己就是吃了这个亏刚开始插在开放式测试平台上跑模型跑个十几分钟就过热降频推理速度直接腰斩。1.2 跟其他推理方案的横向对比对比维度Atlas 300V 24G普通游戏显卡如RTX 3060其他品牌推理卡核心定位AI推理专用图形渲染通用计算推理加速算力精度主打INT8FP32为主INT8为主显存容量24GB8-12GB6-16GB功耗72W左右150-200W70-100W软件生态昇腾CANNCUDA各厂商自家SDK价格二手价极低市场价透明相对较高1.3 什么样的场景适合选它如果你属于下面三类情况之一Atlas 300V 24G就非常值得考虑第一大批量离线推理场景。比如要对一堆历史图片做目标检测对时延不敏感但对吞吐量敏感24G大显存可以一次性塞进去很多图片批量跑。第二视频流并发分析场景。一路1080p视频做YOLO检测显存占用大约1-2G24G容量理论上能撑起十几路并发。第三预算有限的个人开发者。二手市场上这张卡的价格非常友好对于想学习昇腾生态或者做原型验证的开发者来说是门槛最低的入门方式。如果你指望拿它来训练模型我的建议是趁早打消这个念头。它不是干这个用的实测跑一个YOLOv5s训练一个batch size设为8显存占用就超了速度也比同价位GPU慢不少。2. 开发环境搭建与CANN工具链准备拿到卡之后第一件事不是急着跑模型而是把整个软件栈搭好。昇腾的软件体系跟CUDA生态有个很大的不同CUDA是NVIDIA一家统一维护昇腾这边华为做了个半开源的CANN工具链安装流程和版本匹配关系比CUDA复杂得多。2.1 主机系统与驱动版本匹配先说结论我最推荐的组合是Ubuntu 20.04 x86_64 昇腾驱动6.3.0 CANN 6.3.0。当然这个版本组合会随着时间推移不断更新但核心原则不变驱动、固件、CANN三个组件的版本必须严格兼容差一个版本号都可能出幺蛾子。安装之前先确认PCIe设备能被系统识别。插好卡之后先运行lspci | grep -i accelerate看看有没有输出类似Huawei Technologies Co., Ltd. Accelerator card的信息。如果什么都看不到先查主板的Above 4G Decoding开没开这个功能在BIOS里通常默认关闭不打开的话PCIe设备无法使用完整地址空间。驱动安装比较简单华为提供了一个Ascend-hdk-xxx.run包直接运行然后按提示操作即可。安装完成后运行npu-smi info命令验证能看到卡的温度、功耗、算力占用等信息就说明驱动层没问题了。2.2 CANN工具包安装与配置CANN是昇腾计算架构的软件栈总称类似CUDA Toolkit的角色。它包含编译器、运行时、算子库、图优化等模块。安装时我强烈建议只用--install参数装默认组件不要试图自定义裁剪我试过一次只装推理组件结果后面跑模型时缺了算子库调试花了好几个小时。安装完成之后顺手配置环境变量。在/etc/profile或者~/.bashrc里加入下面这几行export ASCEND_TOOLKIT_HOME/usr/local/Ascend/ascend-toolkit/latest export PATH${ASCEND_TOOLKIT_HOME}/bin:${ASCEND_TOOLKIT_HOME}/compiler/ccec_compiler/bin:${PATH} export LD_LIBRARY_PATH${ASCEND_TOOLKIT_HOME}/lib64:${ASCEND_TOOLKIT_HOME}/lib64/plugin/opskernel:${ASCEND_TOOLKIT_HOME}/lib64/plugin/nnengine:${LD_LIBRARY_PATH} export PYTHONPATH${ASCEND_TOOLKIT_HOME}/python/site-packages:${PYTHONPATH}配置好之后记得source一下然后用python3 -c import acl验证Python接口能不能正常导入。这一步能过基本上环境就稳了。2.3 容器化部署有什么坑作为一个喜欢把环境隔离干净的开发控我第一反应是搞Docker来部署。昇腾官方确实提供了带昇腾驱动的容器镜像但必须在宿主机安装好驱动和固件的基础上通过--device/dev/davinci0和--device/dev/davinci_manager把设备映射进容器。还有一个常见的坑是npu-smi info在容器里看不到信息这是因为/usr/local/Ascend/driver目录没有挂载进容器。需要在启动容器时加上-v /usr/local/Ascend/driver:/usr/local/Ascend/driver容器里还要装匹配版本的CANN工具包宿主机上的CANN不会自动继承到容器里。这个坑我踩得很扎实第一次在容器里跑推理脚本报错找不到libascendcl.so查了半天才意识到容器里压根没装CANN。3. YOLO模型转换与离线推理全流程环境搞定之后真正干活的部分来了。我用的是YOLOv5s预训练模型PyTorch官方权重目标是把PyTorch模型转成昇腾的离线模型.om格式然后跑通推理全流程。3.1 为什么一定要转成om格式PyTorch模型不能直接在昇腾设备上跑原因是昇腾310P只执行自家的指令集不执行CUDA指令。所以模型必须经过一个叫ATCAscend Tensor Compiler的离线编译工具转换生成一个针对特定硬件优化过的.om文件。这个om格式有点像TensorRT的engine文件跟具体的硬件和软件版本强相关。同一份模型在Atlas 300V上编译的om换到另一块板卡型号上可能就跑不了或者效率打折。所以换设备或者升级CANN版本之后模型需要重新转换一次。3.2 转换前必须完成的PyTorch模型导出直接拿到一个.pt权重就转是不行的ATC的输入格式是ONNX或者MindSpore模型。我建议走ONNX路线因为PyTorch转ONNX的生态非常成熟报错也容易查。以YOLOv5s为例在官方代码库下执行导出python3 export.py --weights yolov5s.pt --include onnx --opset 11 --simplify这里有两个关键点。第一opset必须设为11CANN对更高版本opset的支持还不够完善我试过opset13转换时报了不支持的算子。第二--simplify参数非常有必要它能用ONNX Simplifier库消除一些冗余结构如果CANN转换时遇到不支持的算子先试试简化原图再转。导出完成之后用onnxsim再跑一遍更稳妥python3 -m onnxsim yolov5s.onnx yolov5s_sim.onnx3.3 ATC转换参数详解与调优经验这一步是整个流程里最容易卡住的地方。ATC工具位于CANN安装目录下命令行参数很多但核心就几个atc --modelyolov5s_sim.onnx \\ --framework5 \\ --outputyolov5s_bs1 \\ --soc_versionAscend310P3 \\ --input_shapeimages:1,3,640,640 \\ --output_typeFP32 \\ --input_formatNCHW逐项解释一下参数含义。--framework5表示输入是ONNX模型这个数字5是固定的不用记其他值。--soc_versionAscend310P3是关键中的关键。我一开始随便填了Ascend310结果编译出来的om在板上死活跑不起来报错提示soc版本不匹配。怎么确定自己的芯片版本运行npu-smi info看芯片型号通常300V对应的是Ascend310P3。--input_shape必须跟ONNX模型的输入节点对齐。YOLOv5的输入名是imagesshape是[1,3,640,640]。batch size设为1就编译一个批次的版本设为4就编译4个批次的版本。有个注意点ATC会把shape固定死转换一次就只能跑这个shape想跑别的shape需要重新编译。--output_typeFP32控制输出的数据类型默认就是FP32这里明确写出来是为了免得后续调试时不知道当前的配置是什么。转换成功的话会看到类似[INFO] ATC run success的输出。如果中途报错最常见的错误是算子不支持。我的建议是不要死磕直接换个模型版本或者尝试更小的输入分辨率YOLOv5s作为经典模型在CANN算子覆盖上算比较完善的了如果它都报算子不支持那八成是导出的ONNX有问题而不是工具链的问题。3.4 让模型输出正确结果的预处理与后处理链路模型转换成功只是一个开始真正头疼的是让模型输出正确的检测结果。YOLOv5在PyTorch里跑的输入是RGB图像经过letterbox缩放归一化到[0,1]区间输出经过NMS后得到检测框。在昇腾上跑前面预处理和后面后处理这块需要自己实现。预处理要注意三点。第一必须要做letterbox缩放而不是直接resize否则检测框坐标会偏移。第二图像通道要转成RGBBGR输入会让结果一团糟。第三数据类型必须是float32像素值归一化到0~1之间。CANN提供了AIPP功能可以把这些预处理操作放到硬件里执行省掉CPU的开销但配置稍微复杂一些我后面单独讲。后处理这块NMS非极大值抑制在CANN算子库里有但实际用下来个人建议在CPU上做反正检测结果的数量不大几百个候选框的NMS耗时在毫秒级没必要为了省这点时间徒增复杂度。下面这段是一个最小可用的Python推理脚本基于CANN的PyTorch适配层框架import torch import numpy as np import torch_npu from models.experimental import attempt_load from utils.general import non_max_suppression # 指定NPU设备 device torch_npu.npu.set_device(0) # 加载om模型 model torch.jit.load(yolov5s_bs1.om, map_locationnpu:0) model.eval() # 读取图像并做预处理 import cv2 img0 cv2.imread(test.jpg) img letterbox(img0, 640, stride32)[0] img img[:, :, ::-1].transpose(2, 0, 1) # BGR转RGB img img.astype(np.float32) / 255.0 img np.ascontiguousarray(img) img torch.from_numpy(img).unsqueeze(0).npu() # 推理 with torch.no_grad(): pred model(img) # NMS后处理 pred non_max_suppression(pred.cpu(), conf_thres0.25, iou_thres0.45) print(pred)这里有个很重要的细节torch.jit.load加载om文件的方式主要是为了兼容PyTorch的调用习惯实际底层还是走的CANN的推理接口。如果遇到torch_npu导入报错先确认一下当前环境是否安装了对应的PyTorch适配层版本。3.5 AIPP配置把预处理塞进硬件上面代码里的预处理是在CPU上做的1000张图片大概会占掉200ms的CPU时间。如果想最大化利用这张推理卡可以把预处理移动到AI Core上执行通过配置AIPP来实现。AIPP的配置写在JSON文件里下面是一个典型配置{ aipp_op: { input_format: RGB888_U8, src_image_size_h: 640, src_image_size_w: 640, crop_params: { new_width: 640, new_height: 640 }, mean: [0, 0, 0], min: [0, 0, 0], var: [0.003921569, 0.003921569, 0.003921569] } }这里var的值是1/255的浮点表示。配置好AIPP之后预处理阶段的输入就直接给原始图像数据就行数据格式是RGB888无需再做归一化。不过我还是要说一句如果预处理逻辑比较复杂比如还包含了letterbox的填充逻辑AIPP的配置会变得很痛苦。我自己的经验是宁可让CPU多做点事也不要在AIPP配置上死磕只有当你的吞吐量指标实在压不下来时再考虑优化这一层。4. 性能调优与排错实践跑通推理只是第一步真正常规项目里更关心的是推理性能。24G大显存能装下多少路视频流、一个batch能塞多少张图、吞吐量怎么样这些问题只有实际压测过才知道。4.1 显存占用与Batch Size的选择我用YOLOv5s做了一组简单的对照实验输入分辨率640x640INT8精度测试不同batch size下的显存占用和单卡吞吐量Batch Size显存占用推理耗时毫秒吞吐量FPS12.1GB185543.2GB3212584.8GB50160167.0GB95168从这个结果能看出几个规律。第一batch size从1提到4吞吐量翻了一倍多这主要是因为AI Core的利用率上来了。但提到8以后再往上吞吐量的增长趋于平缓说明这时候已经接近算力瓶颈了。第二显存占用在batch size等于1的时候就已经有2.1GB这说明模型本身和运行时框架的固定开销占了很大一部分24G显存并不会因为模型小而省下来。我的建议是如果做视频流分析优先保证单路推理的低时延batch size用2到4比较合适如果做离线批量检测追求吞吐量可以试探性地把batch size提到8左右再多就得看具体场景了。4.2 动态分辨率与模型重编译的取舍YOLO模型对输入分辨率并不敏感640x640、1280x1280都能跑。但CANN的ATC编译器在设计上更偏向静态shape一旦编译时固定了输入大小运行时就不能动态变化。如果业务场景里图片分辨率差异很大有两种方案。第一种把所有图片固定缩放到同一尺寸用letterbox补边这最省事也是我推荐的方案。第二种编译多个不同分辨率的om文件运行时根据输入图片动态选择。多版本模型方案听着美好实际用起来非常麻烦。因为推理卡一次只能加载一个模型到显存要切换模型得重新加载耗时几百毫秒到几秒不等对在线服务来说不可接受。所以最靠谱的做法还是老老实实用letterbox统一输入尺寸。4.3 常见报错与对应解法报错信息可能原因排查办法E40011: soc version is invalidsoc版本配置错误用npu-smi查看实际芯片型号核对ATC参数E39999: inner error算子不支持或数据格式异常尝试简化ONNX模型或换fp16精度重新编译aclrtMalloc failed显存分配失败检查是否有残留进程占用显存npu-smi查看显存利用ImportError: libascendcl.soCANN环境变量未配置重新source环境变量文件并确认容器同步了宿主机驱动推理时间暴涨过热降频检查散热风道确认机箱风扇正常运转控制持续满载时长4.4 多路视频流并发方案24G显存跑YOLOv5s模型单路推理模型本身只占2G左右剩下的大部分显存可以用来提升并发能力。实测用batch size等于4的模型同时开4个推理线程每个线程轮流向卡内提交batch推理任务能让卡的算力保持在一个比较饱和的状态。要注意的是昇腾设备支持多进程访问但不建议同一进程内开几十个线程同时调用推理接口。CANN的推理接口本身有线程安全机制但并发量过大时会增加锁竞争。我觉得最合理的架构模式是用一个独立进程管理NPU其他进程通过队列或者HTTP接口向该进程提交推理请求这样既保证了显存管理的统一性又隔离了故障和避免频繁的模型加载。5. 数据准备与模型落地的额外提醒除了推理本身把YOLO模型落地到实际业务中还有两个很现实的环节顺带补充一下。第一个是数据集的准备和转换处理。用YOLO做迁移学习的话如果数据集是VOC或者COCO格式需要先转成YOLO的label格式。转格式这类操作在网络上有现成脚本可以参考这里就不贴了但强烈建议转完用可视化工具抽样画一遍框确认坐标没有错位再开始训练。第二个是需要特别关注的ARM架构服务器适配。很多一体化的边缘服务器用的是鲲鹏ARM处理器CANN在ARM架构上和x86是有明显差异的。好在python接口部分基本一致CMake编译C工程时一些路径和预编译库要确认是aarch64版本。如果发现链接的静态库架构不对编译器报出的错基本都集中在类型不匹配和链接失败上不用慌去CANN安装目录里确认lib64下的so文件架构类型换成对应的lib64_aarch64即可。6. 实操心法总结一块Atlas 300V 24G加速卡把YOLO跑通的完整链路就是这么长。我第一次上手整整花了三天大部分时间都耗在环境配置和模型转换上。现在回头看几个关键点如果一开始就搞清楚能省掉大把时间。第一不要跳过驱动和固件的版本匹配检查系统日志报一些莫名其妙的错误时先怀疑版本兼容问题。第二ATC转换之前务必确认ONNX模型能顺利被第三方runtime加载这能快速排除导出阶段的问题。第三跑不通时不要反复重试先仔细看完整报错日志昇腾工具链的报错信息虽然有时候很绕但真正的原因往往就藏在最后一两行里。第四性能数字别只盯着一路推理的时延多测几轮取平均值动态功耗和热降频对推理速度的影响在长时间任务里表现特别明显。最后再分享一个我个人的习惯把常用的转换命令、版本号和踩过的坑都记录到项目README里。昇腾的坑不是一次踩完就没了过几个月升级一个版本旧问题可能以新的形式重新出现。有一份自己的踩坑记录排查问题能快很多。
返回列表