ARTICLE DETAIL

资讯详情

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

Atlas 300V 24G推理加速卡部署YOLO实战:从环境到调优全攻略

Atlas 300V 24G推理加速卡部署YOLO实战:从环境到调优全攻略 1. 先回答热搜问题Atlas 300V 24G到底是一张什么卡后台一直有人在问Atlas 300V 24G 是运算加速卡吗这个问题的答案其实没那么简单。我最初见到这个型号时也犹豫了一下因为单看24G显存这个规格很容易把它和常见的训练卡混为一谈。真要回答这个问题得先把昇腾产品线的逻辑理清楚。1.1 从运算加速卡这个疑问说起Atlas 300V 24G是华为昇腾生态里的一张推理加速卡核心芯片是昇腾310P系列处理器我的判断依据是三点第一它的产品命名里带V对标的是Atlas 300I Pro这类推理卡而不是Atlas 800T训练卡系列第二24GB显存这个容量在推理卡里完全够用但和训练卡动辄40GB以上的显存布局思路明显不同第三从昇腾社区和配套文档里的定位来看这款卡主打的是视频分析、目标检测、OCR这类推理负载。为什么有人会问它是不是运算加速卡因为Atlas系列下还有Atlas 300T那个才是正儿八经的训练卡。300V从型号上看只差一个字母定位完全不同。如果你拿它去跑训练虽然也能跑通但效率不会好看。反过来如果你只做推理部署用训练卡反而浪费算力和预算。拿我自己手头这张Atlas 300V 24G来看规格大概是这样芯片昇腾310P集成AI Core数量比上一代有提升显存24GB类型是LPDDR4X算力INT8大概在140TOPS上下FP16大概在70TFLOPS左右功耗最大功耗75W左右不需要外接供电接口PCIe 4.0 x16从这些参数能看出什么这张卡的定位非常清楚在75W的功耗墙内把INT8推理性能做到极致。它不需要外接供电插上就能用这对于机房改造、边缘节点升级来说非常友好。很多老服务器电源余量不大加一张450W的训练卡可能要换电源换线但300V这种卡基本没这些顾虑。1.2 昇腾AI处理器的基本架构要深入理解Atlas 300V 24G能干什么不能只看显存大小得了解昇腾310P的内部结构。昇腾AI处理器的计算核心叫AI Core每个AI Core里又有Cube单元负责矩阵运算、Vector单元负责向量运算还有Scalar单元处理标量指令。310P这一代最明显的变化是AI Core数量的增加。相比310310P的AI Core数量翻倍所以INT8算力才能从22TOPS一路拉到140TOPS级别。这个提升对YOLO这类目标检测模型特别关键因为YOLO系列模型的骨干网络里有大量卷积算子是矩阵运算正好是Cube单元的强项。另一个值得关注的是昇腾的达芬奇架构设计思路。它和GPU不一样的地方在于GPU是一个核处理多种任务靠大量线程并行来堆算力而昇腾是把AI Core分成不同类型Cube管矩阵、Vector管向量各司其职。这种架构在跑CNN模型时效率很高因为CNN里的算子类型相对固定调度器的压力小芯片利用率自然就上去了。但也正因为这个架构特点昇腾对算子的实现质量非常敏感。PyTorch里的torch.nn.functional.interpolate放到GPU上就是一行代码的事但在昇腾上如果CANN版本不支持这个算子的高效实现性能就会明显下滑。我后面会详细讲模型部署时遇到的算子问题。1.3 训练卡和推理卡的逻辑分野聊到这儿就不得不展开说说训练卡和推理卡的本质区别。训练过程需要前向传播和反向传播都跑梯度要回传、权重要更新这些操作对算力、显存带宽、甚至卡间通信的要求都非常高。推理过程就简单多了输入是固定尺寸的图片输出是检测框和类别整个过程是单向的不需要回传梯度。所以推理卡的设计思路是抠功耗能被动散热就不加风扇能75W解决就不做到200W抠成本不需要高带宽的HBM显存用LPDDR4X就够了抠精度INT8量化后的推理精度损失控制在1%以内就可以接受抠延迟单张图推理时间要做到几十毫秒以内Atlas 300V 24G就是按照这套思路设计的。如果你非要拿推理卡去跑训练也不是不行但AI Core的利用率会很低因为训练时的算子类型远多于推理很多算子CPU兜底不是昇腾的强项。反过来你要是在训练卡上做推理精度和速度确实有保障但成本和功耗浪费太多。所以回到那个热搜问题是的Atlas 300V 24G是一张运算加速卡但它是一张推理加速卡不是训练加速卡。在训练场景下选它不合适在推理场景下选它非常合适尤其是YOLO系列的部署。2. 为什么 YOLO 和 Atlas 300V 24G 是绝配说了这么多硬件规格现在聊点实际的。为什么瞄准atlas部署yolo这个话题的人这么多因为我个人认为YOLO系列和Atlas 300V 24G的匹配度在当下的AI推理场景里几乎是最佳组合之一。原因有三YOLO模型本身的算子结构非常适合昇腾的达芬奇架构Atlas 300V的INT8算力能把YOLO的推理延迟压到很低24GB显存能装下不小的batch这对多路视频流分析场景非常关键。2.1 YOLO系列模型的硬件需求分析以YOLOv5s为例模型文件大概14MB参数量700多万FLOPs在16G左右。这个体量的模型在Atlas 300V 24G上跑INT8量化后的推理单张图延迟能做到10毫秒以内。什么概念一个标准的IPC摄像头是25帧/秒换算下来每帧间隔40毫秒单张卡推理一张图只要10毫秒意味着一个核就能处理4路视频流。YOLOv8s的体量稍微大一点参数量1100万FLOPs到了28G左右但Atlas 300V 24G依然吃得下。用多路视频分析场景举例一个典型的智慧园区项目可能有上百路摄像头如果用GPU方案得配好几张卡每张卡几百瓦功耗还得设计散热方案。换成Atlas 300V 24G一张卡75W一台服务器插上四张几百路视频流的推理需求轻松应对功耗和空间都省了一大截。不过相比模型参数几个算子在昇腾上的表现更值得关注。YOLO系列里最关键的三个算子是卷积、上采样和拼接。卷积就不说了Cube单元的看家本领上采样里的F.interpolate在昇腾上有专门的优化实现通过AIPP在模型外处理也行拼接操作在CANN里有专属的融合优化多个feature map的拼接不会产生内存拷贝开销。这三个算子只要用的CANN版本支持性能基本能跑满。2.2 INT8量化推理性能翻倍的关键为什么总有人强调在Atlas 300V 24G上部署YOLO要做INT8量化因为昇腾的算力指标最大的就是INT8那档FP16只有INT8的一半。如果你直接用FP16精度部署YOLOv5sAI Core的矩阵计算单元其实只发挥了一半功力。做了INT8量化之后算力直接翻倍延迟能再压一半。但INT8量化不是无脑转转换过程中有一个很关键的环节叫校准。校准的目的是统计模型中间层激活值的分布范围然后根据这个范围决定每个tensor的缩放因子。选哪些图片做校准我一般从训练集里抽500到1000张覆盖不同场景的图让各层激活值的分布尽量和真实推理时的分布一致。选少了量化后的精度掉得厉害选偏了某个类别的检测率可能会崩。我在实际项目中碰到过一种情况用YOLOv5s检测行人和车辆做了INT8量化后车子的检测率掉了8%仔细排查发现是校准集里夜间场景太少导致某些层的激活值分布没有覆盖到暗光环境。换成包含夜间图片的校准集重新量化后精度损失降到了1%以内。对精度敏感的场景可以参考下面的对比权衡延迟优先场景直接上INT8精度损失通常在1%到3%换来的是接近翻倍的推理性能精度优先场景先用FP16跑一遍确认精度再对精度敏感的层做混合精度折中方案用CANN的AMCT工具做量化感知训练把量化误差在训练阶段就补偿掉2.3 显存24G在推理场景的实际意义24GB显存拿来做推理够不够很多人被训练场景显存越大越好的思路带偏了觉得24G偏小。但推理场景的显存消耗逻辑完全不同。推理时显存主要消耗在三个地方模型权重YOLOv5s的FP16权重只有28MBINT8更小甚至可以忽略不计中间激活值推理时不用存梯度激活值用完就释放1MB到4MB之间的占用输入输出缓冲模型输入图片的预处理buffer解码后的YUV数据几张图加起来不到100MB所以一个YOLOv5s模型在昇腾上推理单路推理的显存占用可能只有几百MB。24GB能干什么我说的保守一点同一张卡上可以同时加载十几个不同的模型实例每个模型还能配不同的输入分辨率按需调度。这在多算法场景里非常实用——一个摄像头要跑人脸检测、车牌识别、烟火检测一张卡全搞定不用为每个算法单独配卡。还有一点容易被忽略大显存意味着能上大batch。单张图推理延迟10毫秒但如果你把8张图拼成一个batch喂进去总耗时可能只要40毫秒平均每张图5毫秒吞吐直接翻倍。Atlas 300V 24G有24GB显存跑YOLOv5s这种小模型batch设到8甚至16都不会爆显存。3. 在 Atlas 300V 24G 上部署 YOLO 的完整实操流程到正题了。我来完整走一遍从零开始把YOLOv5部署到Atlas 300V 24G上的过程。先说明环境服务器是x86架构操作系统Ubuntu 20.04Atlas 300V 24G插在PCIe x16插槽上宿主机已经装好npu-smi驱动。整个流程分四步环境准备、模型转换、推理代码编写、性能验证。3.1 环境准备驱动和CANN工具链安装Atlas 300V 24G的上手第一步是装驱动和固件然后是CANN工具包。昇腾的软件栈层级从上到下是应用层MindX、PyTorch适配层、CANN昇腾计算架构、驱动固件。驱动是操作系统和硬件之间的桥梁CANN是开发推理应用要用的核心工具包。驱动安装没什么好说的昇腾官网下载对应版本的Ascend-hdk包按README一步步来就行。需要注意的一个点是驱动版本和CANN版本有对应关系不是随便组合都能用。我一开始图省事驱动装的是最新版CANN装的也是最新版结果某个算子行为异常回退版本后才恢复。建议安装前先查一下官方的版本配套表锁定一组经过验证的版本组合。CANN装完之后要做几件事验证环境用npu-smi info看卡是否被识别温度、功耗、显存使用是否正常用source /usr/local/Ascend/ascend-toolkit/set_env.sh设置环境变量跑一个简单的示例工程确认推理链路通不通环境变量这块有个细节LD_LIBRARY_PATH要包含CANN的lib64目录PYTHONPATH要包含CANN的python/site-packages目录。如果这两条忘了设后面跑Python推理时大概率会遇到import acl直接报错找不到模块的问题。3.2 模型准备从PyTorch导出ONNX我用的是YOLOv5官方仓库的模型训练好的best.pt权重文件第一步要把它转成ONNX格式。导出的关键参数是--opset建议指定为11或12这两个版本的算子集在CANN上支持最全。我之前试过用opset 17导出转换到om时一个Slice算子不支持折腾了半天才定位到问题。导出命令大概是这样python export.py --weights best.pt --include onnx --opset 12 --batch-size 1这里有个非常重要的细节导出的batch-size最好固定成1。很多人在这一步忽略了这个参数导致导出的ONNX模型带了动态维度。动态维度在GPU上跑没问题但到了昇腾上CANN对动态shape的处理还比较谨慎是支持的但性能和稳定性都要打折扣。如果你确定推理时不会动态调整batch直接固定成1可以避免大量后续问题。export.py导出的ONNX模型还包含了一些辅助输出节点比如YOLOv5的Detect层导出后是一堆Sigmoid、Add、Mul算子组合。这些算子在转换时如果某个算子不支持整个转换就失败了。所以更靠谱的做法是只保留backbone加head的输出把后处理留给Python端处理后面讲模型转换时会细说。3.3 模型转换ONNX到OM昇腾上跑推理前模型要转成OM格式。转换工具叫atc全称Ascend Tensor Compiler。用命令行就能完成转换再配合一个aipp配置文件来设置图像预处理的参数。先看最基本的转换命令atc --modelyolov5s.onnx --framework5 --outputyolov5s --soc_versionAscend310P3 --input_shapeimages:1,3,640,640 --insert_op_confaipp.cfg注意几个参数--soc_version填的是Ascend310P3要和你的实际芯片型号匹配。可以用npu-smi info查看具体型号--input_shape和导出ONNX时保持一致都是固定1batch、3通道、640x640--insert_op_conf指定AIPP配置文件这个文件决定了输入图片如何做预处理AIPP配置是昇腾部署的一个关键点值得仔细看aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_w: 640 src_image_size_h: 640 crop: true load_start_pos_w: 0 load_start_pos_h: 0 resize: true csc_switch: true mean_chn_0: 0 mean_chn_1: 0 mean_chn_2: 0 var_reci_chn_0: 0.003921569 var_reci_chn_1: 0.003921569 var_reci_chn_2: 0.003921569 }这段配置的意思是输入图片是RGB888格式尺寸640x640模型预处理器会对图片做缩放、颜色空间转换然后按1/255做归一化。注意这里mean_chn全是0var_reci_chn是1/255对应的是YOLOv5官方代码里的归一化方式。如果你训练模型时用了不同的归一化参数这里的值要对应修改改错了精度会出问题而且出问题的方式很隐蔽——模型能跑但检测结果乱飘。AIPP把图片的缩放、归一化这些操作从CPU搬到了AI Core上做省掉了Python端大批量的numpy预处理推理延迟能再压掉几个毫秒。这也是昇腾部署比GPU部署性能更优的一个隐藏优势。转换完成后会生成一个.om文件这个文件就是最终要在Atlas 300V 24G上加载推理的模型格式。3.4 推理代码编写ACL vs MindX在昇腾上调用OM模型推理有两条路直接用ACLAscend Computing Language接口或者用MindX推理框架封装好的API。两条路各有适用场景下面是我在实际项目中的取舍。ACL接口更底层控制力最强适合需要精细优化性能的场景。但它的入门门槛偏高要自己管理设备、上下文、模型加载、输入输出内存申请这些事。一个最小可运行的ACL推理代码至少上百行而且很多接口的参数说明文档写得比较简略新手容易踩坑。MindX推理框架在ACL之上做了一层封装提供了一套更简洁的API。比如用MindX加载OM模型做推理核心代码可以压缩到这么短from mindx import Model import numpy as np model Model(model_pathyolov5s.om) input_tensor np.random.randn(1, 3, 640, 640).astype(np.float32) result model.infer([input_tensor])当然这里省略了图片读取、解码、resize这些前置操作。实际上MindX也提供了cv预处理的封装可以把图像处理流水线串起来。我的建议是如果你追求项目快落地优先用MindX如果你是在做性能调优最终还是要去看ACL。因为MindX封装之后一些底层的buffer复用、stream管理手段就不好用了。3.5 推理后的后处理逻辑YOLOv5的模型输出不是最终的检测框而是一堆原始的预测值。即使你已经在模型转换时通过AIPP把图像预处理塞进了模型后处理仍然要自己在Python端做。模型输出是一个1, 25200, 85的tensor其中25200是3个尺度上的anchor数量总和640x640输入下85是4个坐标 1个置信度 80个类别。后处理要做的事解析所有anchor的坐标、置信度、类别得分过滤掉置信度低于阈值的框用NMS非极大值抑制去掉重叠度高的框关键是NMS这一步有坑如果直接在Python里用纯for循环处理25200个框单张图的NMS可能要20毫秒以上比模型推理本身还慢。正确的做法是先用阈值过滤把候选框数量降下来一般从25200降到几百个然后再用PyTorch的torchvision.ops.nms或者向量化的numpy操作来做NMS这样可以把后处理压到2到3毫秒。如果你想把后处理做到极致还可以用C重新实现后处理逻辑并通过pybind11暴露给Python调用。我之前在一个项目中用这种方法把后处理压到了0.5毫秒以内。不过在大多数场景下Python后处理搭配上面说的过滤流程已经够用了。4. 实测中的深层问题与排查思路部署流程跑通只是第一步真正让人头大的是各种奇奇怪怪的问题。这一节我把我实际踩过的坑、排查思路完整写出来每个问题背后都有明确的逻辑链希望对你有帮助。4.1 算子不支持与转换失败Atlas部署YOLO最典型的问题就是ATC转换时报算子不支持的错。经典报错长这样[ERROR] FMK:2024-01-15-14:30:22.051: Model has a problem: op:Slice, type: Slice, unsupported by hardware.遇到这种问题第一个反应不应该是换模型结构而是先确认CANN版本。昇腾社区迭代速度很快很多算子在新版本CANN里已经支持了网上搜到的问题可能是几个月前的旧版本报的错。先升级CANN到最新稳定版再重新转换很多问题会自己消失。如果升级了版本还是不支持那就得考虑算子替换。比如Slice算子不支持可以用StridedSlice、Split或者几个Crop组合替代。在PyTorch导出ONNX之前先用torch.onnx.export把模型结构里的算子手动替换一遍再导出一般就能绕过去。还有一个思路是修改ONNX的opset版本。前面提到的--opset 12就是为了兼容性做的选择。越高的opset支持的算子越多但昇腾支持度反而不一定好。我做过一个简单测试同一份YOLOv5模型opset 11和opset 12能顺利转换opset 13就开始报某些算子不支持。建议就锁定在11或12不要好奇去尝试更高的版本。4.2 AIPP配置错误导致的精度问题这是一个比较容易踩坑又非常隐蔽的问题。AIPP配置影响的是输入图片的预处理方式如果和训练时的预处理不一致模型推理精度会明显下降但不会报错——因为整个链路是通的只是结果不对。比如YOLOv5官方训练时用的归一化方式是像素值除以255如果你的AIPP配置里var_reci_chn写成了0.5那等于把输入像素值缩放到[-1,1]区间模型输入分布和训练时完全不一致检测框会乱飘或完全检测不到目标。排查这类问题的方法很直接先用同一个输入图片分别跑PyTorch CPU推理和Atlas推理对比中间层特征图差异。具体做法是在PyTorch里跑一次正常推理把骨干网络某一层的输出保存下来然后在Atlas上做同样的输入拿到该层的输出做对比。差异超过几个百分点就说明预处理链路有问题重点检查AIPP配置。还有一种情况是输入图片本身就不是RGB888格式。有些摄像头输出BGR格式但AIPP里写了RGB888_U8颜色通道就对调了检测结果会变得非常诡异——人脸的框跑到背景上车子的框出现在天空里。排查方式是直接保存Atlas端预处理后的图片看一眼颜色对不对一目了然。4.3 输入尺寸动态与多路并发动态shape的支持一直是昇腾部署中的重点话题。YOLOv5在GPU上可以自由输入任意尺寸但Atlas上如果输入尺寸不固定--input_shape就要写成动态形式比如--input_shapeimages:-1,3,-1,-1 --dynamic_dims640,640;1280,720;1920,1080动态shape不是不能用但要付出的代价是CANN会在每次输入尺寸变化时做一次重优化期间推理性能会掉而且延迟抖动明显。所以我的建议是在Atlas上部署YOLO尽量固定输入分辨率。多路视频流场景也简单所有视频源在进入模型前统一resize到640x640省下的性能远比resize多出来的开销大。多路并发则是Atlas 300V 24G的另一个主战场。24GB显存、多核AI Core它的设计目标就是同时处理多路视频流。实现多路并发有两条路用多进程方式每个进程加载一个模型实例互不干扰用单进程多Stream的方式在ACE上跑多个推理流我推荐的方案是折中的用2到4个进程每个进程绑定一个AI Core每个进程内部再用Stream并发处理多路视频。Atlas 300V 24G上有几个AI Core我记不清确切数字但实测用4个进程、每进程4路并发总共16路1080p视频流单路延迟能保持在30毫秒以内FPS稳定在300往上。多路并发最需要注意的坑是显存碎片问题。推理模型加载后不只是权重要占显存输入输出buffer的申请和释放也会在显存上留下碎片。长时间运行后显存碎片会导致新模型的加载失败报错信息往往是out of memory但显存明明够用。解决办法是启动时预先申请好一批固定的输入输出buffer推理时反复复用而不是每次都申请释放。MindX框架内部已经做了一部分buffer复用但如果你直接写ACL代码这块要自己处理。4.4 性能调优从30毫秒到8毫秒分享一个我最近做的YOLOv8性能调优案例。初始状态用MindX默认配置跑YOLOv8s单张图延迟30毫秒经过几轮调优后压到8毫秒。整个过程中做了四件事第一把图像解码从CPU端挪到DVPP。昇腾的DVPP硬件模块支持JPEG硬解码解码速度比CPU软解快好几倍。原来CPU解码一张1080p的图要15毫秒DVPP硬解只要3毫秒。第二用AIPP把resize和归一化融合到模型里。原来是CPU端resize再到模型端归一化两个阶段各有开销统一交给AIPP后这部分耗时几乎降到了零。第三把后处理里的NMS从Python实现换成torchvision.ops.nms。原来的for循环实现25200个候选框要30多毫秒换了向量化实现后降到了2毫秒。第四设置batch为4把4路视频帧拼成batch推理。单张图推理10毫秒batch4推理才30毫秒平均每张图7.5毫秒。调优顺序的建议是先检查CPU端预处理是否占用过高再确认模型转换时AIPP配置有没有生效然后才是模型本身的性能瓶颈分析。很多人的思维惯性是直接去调模型但其实预处理和后处理往往才是性能的主要瓶颈。这一点在Atlas上尤其明显因为模型推理已经被ASIC加速过了但CPU端的处理链路人人都容易忽略。5. Atlas 300V 24G 与其他方案的横向对比及选型建议聊到这个程度最后来做一个选型层面的对比。毕竟很多人拿到这个热搜其实是在纠结我到底该选哪张卡。对比维度主要看这几个定位训练卡 vs 推理卡 vs 通用加速卡算力形态INT8 vs FP16 vs FP32功耗部署环境能接受多大的功耗生态和现有技术栈的匹配度Atlas 300V 24G、NVIDIA T4、NVIDIA L4这三张卡经常被放在一起比较维度Atlas 300V 24GNVIDIA T4NVIDIA L4定位推理卡推理卡推理卡INT8算力140TOPS130TOPS242TOPS显存24GB LPDDR4X16GB GDDR624GB GDDR6功耗75W70W72W软件生态CANN/MindXCUDA/TensorRTCUDA/TensorRT从硬件规格上看L4在INT8算力上有优势T4因为发布早、普及率高生态资料最丰富。Atlas 300V 24G的优势是24GB大显存加75W低功耗。但选型不能只看规格表更多要看你的实际场景如果你是在已有的CUDA技术栈里做增量选T4或者L4会更顺——模型转换工具链、加速库都是现成的如果你是从零搭建推理平台并且未来有国产化、信创需求那Atlas的性价比和长期合规价值就体现出来了如果项目对功耗和空间要求极苛刻Atlas 300V 24G在75W内做到140TOPS的INT8算力这一点确实能打单纯从部署YOLO这个角度看三张卡都能胜任。但要注意一个生态细节如果你选择Atlas系列整个部署链路都要迁移到昇腾的软件栈上前期投入的学习成本还是不小的。CANN的文档质量和CUDA相比还有差距很多问题要靠社区和官方工单来解决。我的建议是先在官网上搞清楚你的部署环境属于哪一类纯新项目可以认真考虑Atlas但要把学习周期算进项目排期GPU存量项目迁移要评估模型转换的成本YOLO系列相对容易转但其他模型不一定对延迟极度敏感的项目比如自动驾驶、工业质检Atlas经过调优后延迟表现足够好但要花时间做深度性能优化我个人在实际项目中的体会是Atlas 300V 24G的性能上限绝对不低关键看你对CANN的熟悉程度。跑通一个Demo用MindX框架半天就能搞定但要真的把它调到位还是需要静下心来啃一啃底层文档的。上面写的这些都是实打实踩过的坑和验证过的方法如果你正在做类似的YOLO部署项目照着这个思路走能少走不少弯路。
返回列表