资讯详情

资讯详情

Atlas 300V 24G推理加速卡解读与YOLO部署实战

如果把“atlas 300v 24g 是运算加速卡吗”这个问题扔到任何一个AI技术群里十有八九会吵起来。有人说是推理卡有人说是加速卡还有人直接把它当显卡用结果发现连个显示器接口都没有。我刚拿到这块卡的时候也是一脸懵翻了半天文档才搞清楚它真正的定位。这篇东西我不讲官方PPT上的套话就从一个实际部署过YOLO的人的角度把atlas 300v 24g 是什么、能不能跑YOLO、怎么跑、以及过程中踩过的坑都摊开聊一遍。1. Atlas 300V 24G到底是什么卡1.1 一张卡三种身份先说结论Atlas 300V 24G是华为昇腾旗下的AI推理加速卡官方定位是“面向推理场景的PCIe加速卡”。它不是一个通用计算卡更不是传统意义上的显卡。很多人第一次接触这个卡是被“300V”和“24G”这两个数字吸引的以为24G显存能直接当大显存显卡用这是个常见的误区。这个卡的真实身份有三个层次。第一层它是一块PCIe接口的扩展卡插在服务器的标准PCIe插槽上就能工作不需要专门的整机这点和训练用的Atlas 800训练服务器那种整机形态有本质区别。第二层它是一块异构计算卡板载昇腾AI处理器也就是大家常说的Ascend芯片专门用来跑神经网络推理。第三层它是一块“半高半长”的工业级板卡功耗和散热设计都按服务器机箱的工况来不是给个人PC用的。很多人把它划分到“运算加速卡”这个类别里逻辑上没问题但不够准确。准确的叫法是“AI推理加速卡”它的核心能力集中在深度神经网络的推理阶段而不是训练阶段。这个区别直接决定了它的硬件设计思路显存不小、带宽很高、INT8算力很强但FP32通用算力并不突出也没有视频输出接口不能当游戏显卡用。1.2 规格参数怎么看我建议拿到任何一块加速卡第一步都是去看官方的规格表而不是听别人怎么说。Atlas 300V 24G的关键参数大概是这样参数项典型规格说明形态PCIe 3.0 x16半高半长无外接供电显存24GB HBM2E带宽很高比同容量GDDR方案强不少INT8算力百TOPS级别只看推理任务INT8是关键指标功耗70W左右不需要外接供电PCIe插槽供电即可接口无显示输出纯计算卡不带视频接口架构昇腾AI处理器内置AI Core 向量计算单元这里我要专门说下显存。24GB的HBM2E显存在推理卡里属于比较大的配置这意味着它可以载入参数量比较大的模型或者在单卡上同时跑多个模型实例这对工业场景非常实用。比如用YOLOv5m做多路视频流检测24GB显存能支撑几十路并发推理而不会出现OOM。还有一个容易被忽略的参数是功耗。300V 24G的设计功耗控制在75W以内不需要外接6pin或8pin供电对服务器部署来说非常友好。对比一下动辄两三百瓦的GPU推理卡同样做YOLO推理Atlas的单卡功耗低了一个量级这意味着同样的机房电力预算下能部署更多的卡综合吞吐量反而更高。1.3 为什么会有“是不是运算加速卡”的疑问我仔细看了下这个热搜词的语境提问者大概率是在选型阶段看到“300V 24G”这种命名方式和NVIDIA的A100、V100、T4这类GPU型号放一起对比自然会产生疑惑。“V”在GPU命名里经常代表计算卡比如Tesla V100所以“300V”听起来就像某个计算卡型号。再加上“24G”这种显存标注方式也完全是GPU的叫法所以很多人第一反应是“这是个GPU吧”。实际上昇腾的命名体系和NVIDIA完全不是一回事。Atlas 300V的“300”是系列号指的是面向推理场景的300系列“V”代表是PCIe形态的推理卡24G则是板载显存。它和NVIDIA的定位对比大概是这样的NVIDIA T428GB显存版推理卡功耗70W和Atlas 300V 24G的定位高度重合。NVIDIA A1024GB显存功耗150W性能和功耗都比300V高一个台阶。NVIDIA GTX/RTX游戏卡完全不适用因为没有驱动支持和数据中心特性。看到这个对比你应该能理解为什么“是不是运算加速卡”这个问题会让人困惑了。它的外形像计算卡、功耗像计算卡、接口像计算卡但它其实是专用在AI推理上的加速卡不是通用计算卡。理解这一点后续做部署选型就不会走弯路。2. 用Atlas跑YOLO思路先理清2.1 YOLO模型到底在算什么YOLO全称是You Only Look Once是一种单阶段目标检测算法。它的核心思想是把目标检测当做一个回归问题来处理输入一张图片直接输出所有目标的边界框和类别概率。相比两阶段的Faster R-CNNYOLO没有显式的“候选区域提取”阶段所以检测速度快很多特别适合视频流、实时监控这类推理场景。但YOLO也不是一个简单的模型。以YOLOv5为例它包含了Backbone主干网络、Neck特征融合和Head检测头三大部分。Backbone负责提取图像特征Neck负责融合不同尺度的特征Head负责在每个特征图上预测目标框和类别。整个模型推理一次涉及大量的卷积、BatchNorm、激活函数、上采样操作如果没有专门的硬件加速在CPU上跑一个YOLOv5m模型一张1080P图片可能要几百毫秒甚至更久。推理加速卡干的事情就是把这些重复计算的卷积和矩阵运算用专门的硬件单元来执行。GPU用CUDA核心做这件事昇腾卡用AI Core做这件事。原理都是并行计算但实现方式有差异这也是为什么你不能把GPU的模型文件直接搬到Atlas上跑。2.2 Atlas加速的底层逻辑昇腾AI处理器的核心是AI Core一个AI Core内部包含了多个计算单元比如Cube单元负责矩阵计算、Vector单元负责向量运算、Scalar单元负责标量运算。当你在Atlas上跑YOLO的时候整个模型会被编译成一系列算子任务分发到AI Core上执行。我拿矩阵运算打个比方。一个卷积层本质上就是输入特征图和卷积核之间的矩阵乘加运算。Cube单元对这类运算做了深度定制能在单个时钟周期内完成大规模的矩阵乘法。相比之下通用CPU的指令集没有针对矩阵乘法做专门优化所以效率差距很大。据统计在相同功耗下专用推理卡做INT8推理的吞吐量一般能比通用GPU高出一定比例主要就是因为专门优化了算子。Atlas上跑YOLO模型里的卷积层、池化层会被映射到Cube和Vector单元激活函数、上采样等操作也有对应的算子库支持。昇腾提供了一整套算子库CANN把底层的硬件细节封装成了统一的API开发者不需要直接操作硬件寄存器只要调用API就行。2.3 和NVIDIA GPU比差异在哪很多人在选型Atlas之前都用过GPU跑YOLO我自己也是。GPU和昇腾卡在跑YOLO这件事上差异主要体现在三个方面。第一是模型格式。GPU上跑YOLO最常见的方式是PyTorch CUDA模型文件是.pt或者.onnx运行时由CUDA动态编译和加载算子。Atlas不支持直接跑PyTorch模型它需要把模型转换成昇腾专用的OM格式转换过程由ATCAscend Tensor Compiler工具完成。OM格式相当于一个编译好的二进制里面包含了算子调度信息、内存分配策略等等。第二是算子支持。YOLO模型里用到的算子比如Conv、Relu、MaxPool、Upsample昇腾算子库都有支持但版本不同支持情况可能不一样。如果用了一个库里面没有的算子ATC转换的时候就会报错。这块在后面的常见问题部分我会详细说。第三是数据预处理。GPU方案一般用OpenCV做图像缩放、归一化然后在GPU上做TensorRT加速。Atlas方案里有一个叫DVPP的硬件模块专门负责图像缩放、格式转换、抠图等预处理操作可以释放AI Core的算力让AI Core专心做模型推理。合理使用DVPP整体吞吐量能有非常明显的提升。3. 从零部署YOLOv5到Atlas 300V3.1 环境准备CANN和驱动部署的第一步是装环境这一步最容易劝退新手因为步骤多、版本匹配要求严格。我在这个环节反复折腾了一整天下面把能简化的都帮你整理出来。Atlas 300V 24G的软件栈分为三层驱动、固件、CANN工具包。驱动是内核模块负责让操作系统识别到硬件固件是板卡上的底层控制程序一般由驱动包一并安装CANN是昇腾的计算架构包含算子库、图编译工具ATC、运行时Runtime和推理应用开发接口。安装顺序必须是先装驱动和固件再装CANN。反过来装会报错。我用的是Ubuntu 20.04系统Python 3.8CANN版本是6.3.RC2配套的驱动版本可以在昇腾社区下载中心找到选择对应芯片型号和操作系统版本即可。装好后验证环境是否正常npu-smi info这个命令类似NVIDIA的nvidia-smi能看到卡的温度、显存占用、算力利用率。执行成功而且能看到设备信息说明驱动和固件没问题。接下来设置环境变量。CANN安装完成后需要把toolkit的bin目录加到PATH里把so库目录加到LD_LIBRARY_PATH里。官方提供了设置脚本直接source一下就行source /usr/local/Ascend/ascend-toolkit/set_env.sh我建议把这个source命令写进~/.bashrc否则每次开终端都得手动执行。3.2 模型转换从PyTorch权重到OM模型环境准备好之后第一步不是直接写推理代码而是先把PyTorch训练好的YOLOv5权重转换成OM格式。这个转换动作官方叫ATC转换核心任务是做图编译和算子映射。我用的YOLOv5是官方的6.0版本训练好的权重文件是best.pt。转换流程是先导出ONNX再用ATC把ONNX转成OM。导出ONNX的步骤在YOLOv5的官方仓库里已经有现成的脚本python export.py --weights best.pt --include onnx --opset 11这一步会生成best.onnx文件。有几个细节要留意。一是opset版本建议用11或者12太新的版本昇腾工具链支持可能不到位二是导出时要加上--simplify参数用onnx-simplifier对图结构做简化可以减少一些冗余算子三是YOLOv5的导出脚本会自动做模型推理验证确保导出的ONNX结果和PyTorch一致。ONNX拿到之后用ATC工具转OMatc --modelbest.onnx \ --framework5 \ --outputyolov5s_om \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --output_typeFP32参数含义我给新手解释一下--model输入的ONNX模型路径。--framework框架类型5表示ONNX。--output输出OM文件名。--input_shape指定输入张量的形状。YOLOv5的输入是images形状是NCHW即batch大小、通道数、高、宽。--soc_version指定芯片型号。Atlas 300V 24G对应的soc_version一般是Ascend310P3具体可以用npu-smi info查看芯片型号。--output_type输出精度类型默认FP32。如果模型里有算子在昇腾算子库中不支持ATC会明确报错告诉你哪个算子不支持、在图的哪一层。这时候需要看模型是否用了特殊算子或者尝试更高版本的CANN实在不行就得对模型做算子替换。转换成功后会生成yolov5s_om.om文件这个文件就是Atlas可以直接加载运行的模型。转换这一步是整个流程中最容易出现问题的环节后面第4节我单独讲排错经验。3.3 推理代码实战OM模型拿到手之后写推理代码就是纯粹调用CANN的Python API。昇腾提供了一套名为AscendCLAscend Computing Language的编程接口类似CUDA的运行时API。整体流程是初始化设备、加载模型、准备输入输出内存、执行推理、解析结果。下面是一段最简单的推理代码实现了读一张图片、转成模型输入格式、执行推理、拿到输出import numpy as np import cv2 from ais_bench.infer.interface import InferSession # 初始化推理会话 session InferSession(device_id0, model_pathyolov5s_om.om) # 读取图片并做预处理 img cv2.imread(test.jpg) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img cv2.resize(img, (640, 640)) img img.astype(np.float32) / 255.0 img np.transpose(img, (2, 0, 1))[None] # 执行推理 outputs session.infer(feeds[img]) # 拿到输出 output outputs[0]如果你是用官方昇腾社区提供的ais_bench推理工具上面这段代码基本可以直接跑。但如果你是想在正式项目里用我建议直接基于CANN的pyacl库来写这样对内存管理和模型输入输出控制得更精细。使用pyacl的核心步骤import acl import numpy as np # 初始化 acl.init() ret acl.rt.set_device(0) # 加载模型 model_id, ret acl.mdl.load_from_file(yolov5s_om.om) # 查询模型输入输出维度 input_desc acl.mdl.get_input_desc(model_id) output_desc acl.mdl.get_output_desc(model_id) # 创建数据缓冲区 input_data np.random.randn(1, 3, 640, 640).astype(np.float32) input_ptr acl.util.np_to_ptr(input_data) # 执行推理 output_ptr acl.mdl.execute(model_id, [input_ptr], [output_size])这段代码我简化了很多细节实际开发时还要处理设备内存的申请和释放、输出数据的拷贝等操作。建议刚上手的人先用ais_bench验证模型转换是否正确再考虑用pyacl做二次开发。推理结果拿到之后还需要做后处理也就是把YOLO输出的原始张量解析成检测框、类别和置信度。YOLOv5的检测头输出形状通常是(batch, 25200, 85)其中25200是三个尺度特征图的锚框总数85代表4个边界框坐标、1个目标置信度和80个类别置信度。后处理要做的是置信度过滤、非极大值抑制NMS、坐标映射回原图。这部分代码比较长网上有很多参考实现核心思路不变。3.4 调优让吞吐量再高一点模型能跑通只是第一步实际部署中我们更关心吞吐量和延迟。我在部署时对几个方向做了调整吞吐量提升比较明显。第一个方向是batch size。Atlas 300V 24G显存大单张图推理的时候AI Core利用率往往上不去可以通过设置更大的batch size来提升吞吐量。在ATC转换时指定batch size为4或者8推理时一次性输入4张或者8张图推理总耗时只比单张图稍微多一点但吞吐量接近翻倍。这里有个小细节ATC转换时指定的input_shape里的batch维度必须和推理时传入的数据保持一致。如果模型是用batch 4转换的推理时就必须一次传入4张图。如果动态batch版本可以在不同的batch size之间切换但ATC转换时要用--dynamic-batch参数开启。开启动态batch之后ATC需要在转换时预留不同的batch size对应的内存显存占用会更高但灵活性更好。第二个方向是数据预处理硬件化。刚才提到DVPP模块可以硬件完成图像缩放、格式转换而不是用OpenCV在CPU上做。如果你的瓶颈在CPU预处理好就要考虑把图像resize和颜色转换挪到DVPP上执行。用DVPP做一次1080P图像的resize和格式转换耗时大概在几毫秒级别CPU上做OpenCV的resize可能要十几毫秒在高并发时这个差异非常明显。第三个方向是输出后处理。YOLO的NMS后处理在CPU上做如果检测目标比较多耗时也会成为瓶颈。一些项目会选择直接把网络的输出层改掉把NMS放进模型里或者用AI Core加速NMS。但这样改动量大刚上手时不建议直接搞。更好的做法是先确保前处理和推理本身没有性能浪费再考虑优化后处理。4. 常见问题与排查技巧4.1 ATC转换失败ATC转换失败是所有人都会遇到的第一道坎报错信息五花八门但我整理了一下大致分三类。第一类是模型输入的opset版本问题。ONNX模型里用了较高版本的算子而CANN工具链还不支持这部分就会报Unsupported Op。解决办法是导出ONNX时把opset降到11或者12或者用onnx-simplifier把图简化一遍。我遇到的绝大多数Unsupported Op问题都是在onnx-simplifier简化之后解决的。第二类是输入shape不匹配。ATC转换时指定的input_shape和模型实际输入不一致会报input shape does not match之类的错误。这时候用netron工具打开ONNX模型看看输入端口的准确名称和shape再对着改ATC命令即可。YOLOv5的输入名一般是images但定制过的模型可能叫input.1或者别的名字不能想当然。第三类是内存和资源不足。ATC转换本身是个比较吃内存和CPU资源的过程大模型转换时如果服务器内存不够会出现进程被kill掉的状况。建议转换时关掉其他占用内存的服务或者在一台至少有16GB内存的机器上进行转换。顺便多说一句ATC转换不是在Atlas卡上进行的它是个纯软件编译过程在CPU上完成和显卡是不是插在机器上没有直接关系。4.2 显存和内存相关Atlas 300V 24G虽然显存大但也不是无限使用。经常出现的问题是模型转换时指定的batch size太大导致推理时显存不足报acl.mdl execute failed, error code 507018之类错误。这种情况一般是显存分配失败解决办法是降低batch size或者用--dynamic-batch参数让模型按需分配显存。还有一种情况是内存泄漏。用pyacl做长时间推理时如果每次推理都申请设备内存而不释放显存会慢慢被耗尽。我建议在推理循环里复用内存缓冲区而不是每次都重新申请# 说的直白点这条循环不要写在while True里面 input_data np.random.randn(1, 3, 640, 640).astype(np.float32) input_ptr acl.util.np_to_ptr(input_data) for i in range(1000): session.infer(feeds[input_data]) # 复用input_data这样每次推理都走同一块内存不会造成内存碎片和泄漏。如果发现自己每次推理显存占用都在涨优先检查是不是循环内重复申请了内存。4.3 精度对不上部署YOLO时经常遇到的一个问题OM模型推理的结果和PyTorch推理的结果对不上明明输入同一张图输出的检测框却不一样。这个问题多半出在图像预处理上。PyTorch训练时用的预处理是resize到640x640、归一化到[0,1]、按ImageNet的mean和std做标准化。如果你在Atlas侧推理时预处理流程和训练时不一致精度就一定会漂移。尤其是DVPP做图像缩放时默认的缩放算法可能和OpenCV的INTER_LINEAR不完全一致导致输入数据的像素值和训练时不同。解决办法是要么在推理前用OpenCV在CPU上做预处理保证和训练时一致要么在DVPP配置时指定和训练一致的缩放算法。我的经验是如果对精度要求很高先用CPU OpenCV预处理把整个流程跑通验证精度后面再优化成DVPP。另外一个精度问题出在做INT8量化的时候。ATC默认用FP32精度转换精度损失很小。但如果你为了追求性能用了INT8量化那精度会有一定损失。量化需要在转换时提供校准数据集如果校准数据集和实际场景分布差异大检测准确率会下降得很厉害。这块我的建议是先用FP32模型把业务跑通再考虑量化的收益是否值得。4.4 性能不及预期有些读者可能遇到一种情况ATLAS卡的INT8算力标称很高但实际跑YOLO的帧率却没有想象中高。这里面有几个隐藏因素。第一个因素是模型没有编译到最优。ATC转换时如果模型里有动态shape、动态分支或者图优化空间被约束住了推理性能会打折扣。解决办法是尽量保证模型的输入是固定shape减少图结构中的动态节点。第二个因素是调度开销。模型输入太小的时候比如一张640x640的图模型推理本身可能只要几毫秒但数据从内存拷贝到设备内存、推理结果拷贝回来的时间反而占了大头。解决思路是增大batch size摊薄每次调度的固定开销。第三个因素是CPU瓶颈。前面说过如果数据预处理和后处理都在CPU上跑CPU忙不过来AI Core只能在那等数据。排查的时候可以先用npu-smi info看看卡上AI Core的利用率再用top看看CPU占用。如果AI Core空转、CPU跑满说明瓶颈在数据管道而不是推理本身。遇到性能问题不要急着怪硬件先用工具定位瓶颈是哪个环节再针对性地优化。这条路子在任何推理卡上都适用。5. 回看这个卡的定位到底适合谁用如果把Atlas 300V 24G放到整个AI推理硬件生态里看它的定位其实非常清晰面向边缘计算和数据中心推理场景主打低功耗、高能效比、大显存。适合它的场景有这么几类。一类是智慧园区、智慧交通这类视频分析项目。现场有很多路摄像头需要在边缘侧做实时检测对功耗和稳定性要求高。300V的低功耗和无外接供电设计让它能轻松塞进普通服务器不需要改造机房供电。另一类是算法公司做私有化交付。客户环境五花八门不一定有NVIDIA的卡为了避免版权和供应链风险使用昇腾生态同时兼容训练和推理是比较稳妥的选择。Atlas 300V 24G能部署YOLO系列、OpenPose、OCR等常见模型可以覆盖大多数视觉AI需求。还有一类是高校和研究机构的模型验证场景。买不起动辄几万的GPU训练卡但又要跑AI实验300V的价格和功耗都友好得多。虽然不能训练大模型但做推理验证、算法评估完全够用。如果要说它的短板那就是生态成熟度和GPU生态没法比。社区资料少、踩坑经验要靠自己积累很多在GPU上随手能跑的东西搬到昇腾上就要自己折腾。但换个角度想正因为折腾你才会对模型编译、算子映射、内存管理这些东西理解得更深。我从GPU转到Atlas之后对推理引擎的理解反而提升了一个档次。最后分享一个我自己装机时的小习惯拿到卡先别急着装驱动先用npu-smi info确认板卡能被系统识别再装上CANN写个最简单的resnet50推理demo把整条链路跑通之后再上YOLO这种复杂模型。这样一步步来遇到问题也好定位到底是硬件的问题还是软件的问题。部署推理这行慢就是快。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →