拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Atlas 300V 24G部署YOLOv5实战:推理卡选型、模型转换与调优

Atlas 300V 24G部署YOLOv5实战:推理卡选型、模型转换与调优 最近后台好几个朋友都在问我同一个事Atlas 300V 24G到底能不能跑YOLO它是不是一块“运算加速卡”。这个问题问得很典型因为现在目标检测的落地需求太旺盛了大家手里握着YOLOv5、YOLOv8的模型想找一张便宜、显存又大的推理卡来部署转了一圈就看到了Atlas 300V 24G。我的结论很简单它能跑而且跑得很顺但前提是你得按照它的脾气来部署不能拿它当普通显卡想插上就完事。这篇文章我就用一次完整的YOLOv5部署经历把Atlas 300V 24G这张卡的硬件定位、部署环境、模型转换、推理代码和踩坑记录全过一遍。不管你是正在选型还是手头已经有一张卡却无从下手这篇都能给你一个可以照着做的完整路径。1. 先把Atlas 300V 24G这张卡看清楚1.1 它到底是不是“运算加速卡”和普通显卡差在哪先说结论Atlas 300V 24G是一张标准的AI推理加速卡不是图形显卡。这里想提醒一下很多人一看到“24G”就联想到大显存的游戏卡或通用计算卡实际上它们的逻辑完全不同。普通显卡的计算核心是CUDA Core / Tensor Core走的是通用计算的路线既能渲染图形也能跑CUDA生态的深度学习框架。而Atlas 300V里面是昇腾系列芯片核心叫AI Core是一种面向神经网络算子设计的专用计算单元。它不做图形输出没有显示接口插上机之后你想用它接显示器是没用的它的任务就是不停地把模型推理跑起来把算力花在卷积、矩阵乘法、激活函数这些算子上面。这也意味着软件栈也不一样。CUDA那套在昇腾上行不通你得用CANNAscend CANN Toolkit这套开发套件来调用芯片。一开始会有点不适应但只要理解了它的设计思路上手并不难。1.2 24G显存和算力参数应该怎么读很多朋友看到24G这个数字会很兴奋觉得比很多显卡的8G、12G大得多跑大模型是不是随便跑说实话24G在这个价位确实是核心竞争力但你要知道它是怎么组成的。Atlas 300V Pro用的昇腾310P处理器整卡24GB内存并不是一个单一的大显存池而是多路芯片各自带内存对外统一呈现为24G。这在部署的时候影响不大但你在做内存规划时要心里有数别以为24G像显卡显存那样可以随便被一个进程全占满。算力方面300V系列标称的INT8算力在百TOPS这个量级FP16算力会在几十TFLOPS量级。单看INT8数值是很漂亮的因为推理场景大多数模型都可以量化到INT8尤其YOLO这类检测网络INT8下精度损失通常很小跑起来却比FP16快很多。这也是这张卡用来做YOLO推理的最大价值点。另一个容易被忽略的是功耗。300V 24G这类推理卡的功耗控制得非常好一般几十瓦上下部署在边缘服务器或者普通工作站里非常合适不用像大显卡那样要考虑供电和散热改造。我实测下来卡的整体发热也不高放在标准机箱里用CPU散热风道就够了。1.3 算一笔账一张卡大概能扛几路YOLO推理网上问“Atlas 300V能否部署YOLO”的人本质上想知道的无非是“能跑多快能扛几路视频流”。我直接给一个粗算方法。以YOLOv5s为例输入640x640FP16下跑一帧的模型计算量大约在30GFLOPs左右。如果只看理论FP16算力70TFLOPS大概对应每秒两千多次推理但实际要打折因为预处理、后处理、内存拷贝、IO都会占时间。经验上推理卡的有效吞吐能做到理论值的20%到30%就算不错了也就是每秒几百帧的吞吐量。如果按一路1080P视频25帧/秒来算这张卡跑十几路甚至二十几路YOLOv5s在工程上是有可能的前提是预处理和后处理做好流水线不能一个线程傻傻地逐帧推。若换成YOLOv8s或者带复杂后处理适当降几路也很正常。真正到了生产环境限制往往不是算力卡本身而是你的代码能不能把卡的算力喂饱。2. 部署YOLO前硬件与软件环境这样准备最省心2.1 硬件上机与驱动识别在动手之前先把硬件装好。Atlas 300V插上PCIe槽位后系统里不会像普通显卡那样显示一个“显卡”而是需要装好驱动后通过npu-smi命令来识别。我一般会先执行下面这行命令确认板卡状态npu-smi info这个命令类似于NVIDIA的nvidia-smi能显示板卡数量、芯片温度、AI Core利用率、设备内存占用等信息。装上之后如果查不到先别急着跑模型优先检查驱动重装一下。因为固件和驱动版本不匹配是这类卡最容易出的问题之一我印象中至少有一半的“卡不在线”问题都出在版本搭配上。2.2 软件栈CANN、固件、驱动版本要成套Atlas卡的核心软件栈是CANN它分好几个组件最常用的是CANN Toolkit。下载安装时要注意固件驱动包和CANN Toolkit版本最好成套安装不要各个版本乱搭配。我在项目里一般按这个顺序装先装驱动和固件也就是npudriver和firmware包再装CANN Toolkit比如社区版或者商用版按推荐版本选最后设置环境变量source一下set_env.sh脚本。上面这些装完才算有一个可用的环境。你可以在命令行里试一下atc工具如果有版本输出就说明软件栈基本通了。注意一定要按厂家文档的版本配套表来装。我第一次部署的时候固件和CANN版本差了一个大版本跑转换时各种报错后来全部重装才解决。CANN安装包体积不算小建议提前把网络和磁盘空间准备好。2.3 模型导出ONNX导出时的3个关键设置因为CANN侧不能直接吃PyTorch模型通常要把YOLO模型导出成ONNX再转换成昇腾的OM模型格式。导出的细节直接决定后面能不能转成功。我拿YOLOv5举例导出ONNX时要注意三点第一ONNX的算子集版本英文叫opset要选择一个CANN支持的范围建议取ONNX默认版本里的较新稳定版。很多老教程用了太低的opset结果某些算子转换时报不支持。第二输入尺寸和Shape要固定。YOLO推理一般固定到640x640或者你训练时设置的输入尺寸。有些模板代码会把输入写成动态shape虽然也能转但性能和兼容性会打折。建议导出时就固定成NCHW格式batch先设为1后面需要吞吐再通过工具转换。第三后处理要不要导出。YOLO的模型图里通常包含检测头输出导出时可以把NMS留在外面只导出到三个特征层输出这样模型更纯粹也避免CANN转换时碰到一些不支持的NMS算子。如果代码里已经写好了后处理建议直接导出不含NMS的版本后处理在Host侧自己写。3. 模型转换从ONNX到OM我踩过的参数坑3.1 用ATC工具做模型转换ONNX准备好后下一步使用ATCAscend Tensor Compiler工具把它转换成OM格式。这个工具在CANN Toolkit里自带命令行参数看起来信息量很大但核心就几个。我自己用的转换命令大概是这个样子atc --modelyolov5s.onnx --framework5 --outputyolov5s_bs1 \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --loginfo这里简单解释一下--framework5表示输入模型是ONNX--input_shape定义了输入张量的形状固定为1,3,640,640--soc_version要写成你的芯片型号对应的版本这个可以通过npu-smi info查到不同型号写法不一样--output是输出文件名转换成功后会在同目录生成一个.om文件。转换日志里如果出现“success”或者“saved model”之类的字样就说明成功了。日志级别设为info会输出很多细节遇到问题也方便定位。3.2 静态batch和动态batch怎么选性能才稳很多第一次部署的朋友会顺手把模型导出成动态shape觉着这样灵活这才是性能的大坑。动态shape意味着每一帧输入尺寸可以不同模型在推理的时候要重新做内存规划和算子编排效率明显下降。更推荐的做法是静态batch。比如你想一次推8张图就转成batch为8的模型每次喂满8张图再推理。Atlas 300V在静态shape下对算子和内存调优做得更充分实测帧率会稳定很多。如果确实需要每次推理的图片数量不固定可以用--dynamic-batch-size1,2,4,8这样的参数限定几个档位而不是完全动态。这样卡在几个固定shape之间切换性能和灵活性还算平衡。3.3 后处理放模型外还是模型内我在实际项目中强烈建议NMS和其他后处理逻辑不要放进模型里留在Host侧用CPU处理。原因有两个一是ONNX模型如果包含NMS这种复杂逻辑ATC转换时经常遇到不支持的算子会花大量时间在算子适配和排错上二是推理卡的定位是忠诚地执行模型算子NMS这种逻辑密集的操作放Host侧更灵活比如你想改NMS阈值、切换算法都不用重新转模型。YOLO的输出一般是三个尺度的特征层比如(1, 255, 80, 80)、(1, 255, 40, 40)、(1, 255, 20, 20)拿到这些输出后在Python或C里做解码、过滤、NMS即可。这部分开销很小不会成为瓶颈。4. 推理代码实战怎么让24G显存和AI Core都忙起来4.1 用Python快速验证一个推理闭环部署第一步先用Python把整个链路跑通确认环境、模型、图片读取都没有问题。CANN提供了Python的pyACL接口用法上跟CUDA的Host API有点像要先初始化、设置设备、加载模型然后执行推理。下面这段是我简化后的示例主要参考官方sample帮你理解主流程import acl # 初始化 acl.init() ret acl.rt.set_device(0) context, ret acl.rt.create_context(0) # 加载模型 model_id, ret acl.mdl.load_from_file(yolov5s_bs1.om) # 获取模型输入输出描述 desc acl.mdl.create_desc() acl.mdl.get_desc(desc, model_id) # 准备输入数据以 (1,3,640,640) 为例 input_size 1 * 3 * 640 * 640 * 4 # float32 input_data, ret acl.rt.malloc(input_size, 2) # 2是内存对齐类型 # 把图像数据拷贝进 input_data # 执行推理 output_size acl.mdl.get_output_size_by_index(desc, 0) output_data, ret acl.rt.malloc(output_size, 2) stream, ret acl.rt.create_stream() acl.mdl.execute(model_id, [input_data], [output_data], stream) acl.rt.synchronize_stream(stream) # 取结果拷贝到Python数组 result_bytes, ret acl.rt.memcpy_d2h(output_size, output_data, output_size) # 对 result_bytes 做解析代码里最容易被忽略的是数据预处理。YOLO读取图像后一般要先做resize到640x640再转成RGB或BGR并归一化。CANN本身支持一种叫AIPP的预处理机制就是在模型转换时把图像的缩放、色域转换、均值方差归一化写进配置推理时直接喂原始图像数据省得自己在Host侧逐帧处理。不过我自己用下来的经验是如果要做letterbox等比缩放加填充这种自定义预处理还是建议在Host侧用OpenCV做好再喂给模型因为AIPP对某些填充策略的支持没那么灵活反而更容易出问题。等跑了一个固定预处理流程再考虑要不要往AIPP上挪。4.2 让吞吐上去的小改造内存复用、batch推理、多线程推流跑通第一帧之后就轮到性能调优了。很多初次接触昇腾的朋友问为什么我的Python玩起来速度一般多半是因为还在单线程、单batch地推。如果你想让吞吐接近卡的极限至少要做三件事一是批量推理。前面转换模型时我建议再转一个batch为4或者8的OM文件推理时凑够4张或8张图再执行一次推理。这样算力利用率提升非常明显比单张推理快好几倍。二是内存复用。不要每帧都重新申请内存。输入输出buffer可以在初始化时一次性分配好推理时反复往里写数据避免频繁的内存申请和释放时间能省下不少。在C里尤其明显Python里也要注意。三是多线程/多路流水线。YOLO推理无非是“取帧、预处理、推理、后处理”几个环节。如果是多路视频流可以为每路视频单独开一个线程或使用流水线方式把预处理和后处理并发起来。这样卡上有活干CPU也不会闲等。4.3 跑起来后怎么观察卡的负载和温度装好驱动后可以用npu-smi info实时观察卡的运行状态。跑推理时注意看两个数据AI Core利用率和设备内存占用。如果AI Core利用率一直在90%以上说明调度得不错如果卡上占用很低就得考虑是不是推理请求太小、太碎或者regular预处理在Host侧等IO卡实际上是在空转。还有一个容易忽视的点多张卡或者多芯片并行时要确认调度是否均匀。我在项目里遇到过某一路芯片利用率拉满另外一路完全闲着的情况后面通过把分配任务改成按顺序轮询才解决。5. 部署时的常见问题与排查速查表5.1 从“转模型报错”到“推理没输出”的问题速查部署过程中几乎肯定要遇到问题我整理了一些典型报错直接做成速查表照着排查就行。现象常见原因处理办法ATC转换报不支持某算子ONNX里算子版本太新或包含NMS等复杂算子降低opset版本去掉NMS换官方支持的算子转换时报soc_version错误芯片型号写错或固件驱动不匹配用npu-smi info查看准确型号按文档填加载OM模型失败OM文件和当前CANN版本不兼容用当前版本重新转换推理结果全为0输入数据没拷对或shape不匹配打印输入CPU数据检查确认数据已拷贝到设备内存推理结果类别全错通道顺序问题可能是BGR/RGB搞混了确认预处理和训练时保持一致AI Core利用率低单batch、单线程、大量时间在预处理批量推理多路流水线用AIPP加速预处理内存占用异常高模型后处理或中间结果在Host侧积压及时释放结果buffer控制并发排队深度5.2 精度对不上多半是预处理和通道顺序的问题很多朋友转换完模型推理结果出来偏差很大第一反应是“卡有问题”或“模型转换有问题”。但实际上YOLO模型最容易出精度的坑往往出在预处理环节。最常见的问题是BGR和RGB通道搞混。OpenCV读图默认是BGR而PyTorch训练时通常用RGB输入。如果不做转换直接把OpenCV读到的图喂给模型模型看到的就是B通道当R、R通道当B检测结果自然错乱。我一般会在预处理代码里明确写一行转换做到心里有数。另一个坑是归一化。YOLO训练时通常会对像素除以255或使用mean和std归一化。如果模型转换时用了AIPP的归一化参数而你的预处理代码又手动归一化了一次就会得到双重归一化的结果输出置信度会普遍偏低。这个需要仔细检查一遍。5.3 显存不够、内存泄漏怎么排查24G听起来很大但多路并发时也会出现内存吃紧的错觉。这里要区分清楚设备内存卡上的24G和主机内存host内存是两回事。推理时如果每帧都反复包装数据而不释放旧对象很快主机内存就飙上去了。最简单的方法就是在测试程序里每推理一千帧打印一次npu-smi info中的内存占用观察是否持续增长。如果是持续增长多半是代码里有对象没释放。我通常在C里用RAII管理内存对象Python里则尽量复用大的bytearray缓冲区而不是每帧new新对象。如果确认是设备内存占用高就要考虑是不是同时加载了太多模型或者batch设置太大。比如把batch从1调到8中间计算时的特征图缓存会明显变大。项目里要按实际并发需要来定batch没必要一味追求大。6. 几条实际操作时攒下的心得第一次用昇腾推理卡的人最容易犯的错误就是把NVIDIA那套习惯直接搬过来。其实只要理解了它是一张“专用推理卡”很多技术决策就顺理成章了模型必须转成OM算子要挑它支持得好的预处理能自动化就自动化推理要批量提交不能一次一张。以我自己的项目经验来说Atlas 300V 24G跑YOLO的优势不在于单帧延迟有多极限而是高吞吐场景下性价比和功耗非常能打。如果你要接十几路视频流做实时目标检测这张卡完全扛得住。但在调优之前务必先把batch和流水线做起来否则你会以为它很弱其实是没喂饱。另外一个很实用的小建议生产环境的版本锁定很重要。CANN升级之后原来的OM模型不一定还能直接加载所以一旦验证通过的组合就锁死在部署脚本里不要随便升级。换版本之前先在下线环境把全套流程重新跑一遍再决定。最后如果你准备在同一台机器上部署多个推理服务我建议在架构设计时就考虑视频流、模型、设备之间的分配关系尽量让一路视频流固定走同一个芯片上下文避免频繁切换设备上下文带来的额外开销。这样做下来整个系统的吞吐和排错体验都会好很多。
返回列表