ARTICLE DETAIL

资讯详情

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

Atlas 300V部署YOLO全流程实战:从环境搭建到性能调优的踩坑指南

Atlas 300V部署YOLO全流程实战:从环境搭建到性能调优的踩坑指南 做Atlas部署YOLO这活儿我前前后后折腾了快三周踩过的坑比吃过的盐还多。今天不整那些虚头巴脑的官方文档复读直接把我在Atlas 300V这块卡上部署YOLO的全过程、关键参数、还有那些文档里不会写的坑一次性倒给你们。不管你是刚拿到卡的新手还是在CANN工具链里挣扎的老哥这篇文章应该都能帮你省下几天的瞎折腾时间。1. Atlas 300V硬件选型与架构理解1.1 Atlas 300V究竟是不是运算加速卡先说一个大家最容易搞混的问题。网上搜“Atlas 300V 24G是运算加速卡吗”答案很明确是也不完全是。它确实是一块AI推理加速卡但不是一个通用GPU也不是用来跑训练的。它的全称是Atlas 300V Pro搭载昇腾310P系列芯片24GB的HBM显存官方定位是边缘计算和数据中心推理场景。把它理解成一个“专款专用的加速器”更合适。传统GPU像是一个能干的通用工人啥活都能干但有的时候不够快Atlas 300V更像是一个专门做某一类工序的熟练工只做AI推理这件事尤其是图像分类、目标检测、语义分割这些CV任务效率和功耗比都相当能打。在实际测试里单张Atlas 300V处理YOLOv5s的推理batch size设为1单帧延迟能到5毫秒左右这个数字在边缘设备里非常能打了。判断一块卡是不是运算加速卡绕不开三个指标算力、显存、能效比。Atlas 300V的算力是INT8下140TOPSFP16下大概70TFLOPS显存24GB功耗只有72W左右。对比一下NVIDIA的T4——FP16算力65TFLOPS功耗70W显存16GB——你就知道Atlas 300V这卡在能效比上其实是占了优势的。那块24GB显存更是逆天直接能塞进去大模型或者把YOLO系列模型量化后的多batch模型放进去还不带喘气的。1.2 训练卡与推理卡的区别在哪里搞清楚Atlas 300V的属性还得搞懂昇腾产品线里的另一组逻辑。昇腾芯片主要分两拨训练卡和推理卡。训练卡像是Atlas 800训练服务器里装的昇腾910系列以及Atlas 300T系列T是training这些卡主要干训练算力更高支持混合精度训练。推理卡就是Atlas 300I系列、Atlas 300V系列、Atlas 200I系列这些主打推理场景。区别在哪里训练需要实时计算梯度、更新参数要求高精度FP32/FP16和高通用性推理则只需要前向计算对精度要求没那么严格很多时候INT8量化就够用反而更看重吞吐量、延迟、功耗。Atlas 300V支持INT8推理加速这个特性在部署YOLO的时候帮了大忙。同样的模型INT8量化之后在一个边缘盒子里就能轻松跑到上百FPS这要是放在训练卡上成本直接翻好几倍。这块24GB显存在推理卡里属于什么段位横向看Atlas 300I Pro也是24GBNVIDIA的L4是24GBT4是16GB。显存越大能同时驻留的模型和batch就越大。部署的时候如果你想把YOLOv5l甚至是YOLOv8x量化后扔进去24GB会让你宽裕很多。之前我在16GB的卡上部署YOLOv5s多batch版本batch设到16就爆显存了换到Atlas 300V之后batch直接拉到32还能跑得有说有笑。2. 部署环境准备与工具链全解析2.1 硬件与系统要求Atlas 300V的安装其实更像装一张PCIe加速卡但它有几个前置条件。首先是电源这卡功耗虽然只有72W但PCIe插槽供电可能不够最好用8pin供电线接一下其次主机需要有PCIe 3.0 x16的插槽这代卡虽然兼容PCIe 3.0但插在x8的槽上性能会打折。系统方面官方支持的是Ubuntu 18.04/20.04 x86_64架构以及CentOS系列。我的建议是别折腾Windows指挥棒虽然现在Atlas在Windows上也能用了但生产环境里Ubuntu 20.04最稳。内核版本需要注意不能太新也不能太旧官方驱动适配范围一般在4.15到5.4之间。有个坑如果你用Ubuntu 22.04那套5.15内核装驱动的时候经常会报编译错误建议老老实实用20.04。内存方面因为推理过程中涉及到host和device之间的数据拷贝主机内存建议至少16GB如果是跑大批次推理32GB会更舒服。存储没特别要求但如果你要搞CANN离线模型库预留50GB空间比较稳妥光CANN toolkit解压后就有好几个GB。2.2 驱动与固件安装的完整步骤这是整个部署过程里最容易让人崩溃的环节。Atlas 300V需要装两部分东西NPU驱动driver和固件firmware这两者必须配套版本对不上就会各种玄学报错。具体的安装步骤如下第一步检查操作系统环境核心是用uname -r查看内核版本确认在支持范围内。第二步下载对应版本的Ascend HDK硬件开发套件解压后会看到Ascend-cann-toolkit、Ascend-cann-nnae、Ascend-cann-nnrt等包还有专门的driver包和firmware包。注意驱动和固件的安装有顺序要求先driver后firmware反过来装会直接报设备不存在。第三步以root权限运行安装脚本驱动安装后需要重启机器然后执行npu-smi info命令验证。这里有个小技巧如果重启后npu-smi能看到卡的信息但状态显示“online”后面有个小括号写着“cann版本不匹配”别慌说明CANN toolkit还没装好驱动本身已经没问题了。安装过程常见的报错是头文件缺失多半是内核头文件没装apt install linux-headers-$(uname -r)来一发就行。还有编译工具链必须齐全gcc、g、make一个都不能少。2.3 CANN工具链配置驱动和固件只是让硬件通电真正让Atlas跑起来算力的是CANNCompute Architecture for Neural Networks可以理解为昇腾的“CUDA”。CANN不是单一工具它是个全家桶包括CANN Toolkit核心工具ATC模型转换、算子编译、推理运行时都在这里头。CANN NNAE神经网络加速引擎训练侧的工具链。CANN NNRt纯推理运行时部署在目标环境时只需要这个。安装的时候如果只是做推理部署装NNRt就够了全套用不上但是如果你有模型转换的需求就得装Toolkit。两者可以共存但要注意用户权限一般都需要source /usr/local/Ascend/ascend-toolkit/set_env.sh来设置环境变量。我建议把这行加到/etc/profile或者~/.bashrc里不然每次开终端都要重新source一遍很烦。还要强调一下用户组的问题。装完之后运行推理程序的用户必须加入HwHiAiUser这个用户组否则调用设备权限会报“Device open failed”。这算是CANN系列里最经典的权限坑之一好多人折腾了半天结果只是忘了加组。3. YOLO模型从PyTorch到OM离线模型的完整转换3.1 为什么需要转换模型格式做推理部署第一步就是把训练好的PyTorch模型转换成昇腾专属的.om离线模型。为什么要转因为Atlas芯片的加速和海思异构架构强绑定需要把网络结构、算子、权重打包编译成专用格式才能调度NPU硬件。同样的道理CUDA生态里也有TensorRT的.engine文件就是把模型提前编译好推理时才不用临时拼算子。把.om理解成Atlas版本的TensorRT engine就行。转换有两种路径直接用PyTorch模型转或者先导成ONNX再转。实测下来别绕弯子直接用ONNX中转最省心。PyTorch转ONNX只需要几行代码而且ONNX在ATC工具有更好的算子兼容性转换报错的时候还能定位到具体算子。3.2 PyTorch导出ONNX实操导出ONNX这一步在普通显卡上就能完成不需要NPU。核心代码非常简单import torch model torch.load(yolov5s.pt, map_locationcpu)[model].float() model.eval() dummy_input torch.randn(1, 3, 640, 640) torch.onnx.export(model, dummy_input, yolov5s.onnx, opset_version11, input_names[images], output_names[output]) print(ONNX export done.)这里有几个关键参数需要注意。opset_version用11最稳妥太新的opset在ATC工具里可能不被支持input_names和output_names要按照你后续推理代码里的约定来定义我习惯把输入叫images输出叫output。如果导出YOLOv8PyTorch导出的ONNX会有多个输出节点分别是不同层的检测头别慌后面转OM的时候可以统一处理或者重新定义一个只输出最终结果的模型。导出过程中最容易出的问题就是模型里的动态控制流比如YOLOv5里基于目标数量动态生成的anchor一旦走上动态分支ONNX导出就会报错。这时要把模型里的utils方法替换成静态版本或者直接用yolov5官方仓库里自带的export.py它会自动处理好这些。3.3 使用ATC工具转OM模型这是整个部署流程的重头戏之一。ATCAscend Tensor Compiler是CANN里负责模型转换的工具常见用法是atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_bs1 \ --soc_versionAscend310P3 \ --input_shapeimages:1,3,640,640 \ --input_formatNCHW \ --output_typeFP16 \ --insert_op_confaipp.cfg每个参数都别漏看。framework5表示输入的是ONNX模型soc_version必须写对Atlas 300V对应的是Ascend310P3写错的话ATC直接说不支持该芯片类型input_shape这里我固定了batch为1如果你后续推理要用batch4这里就必须对应的改成4一旦OM模型编译好batch就不能再改了这是和TensorRT不同的一点。还有个重要参数是insert_op_conf这个用来配置AIPPAI Preprocessing可以把图片缩放、归一化、色域转换这些预处理直接下沉到NPU里做省去在CPU上写预处理的时间。举个例子aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_w: 640 src_image_size_h: 640 crop: false csc_switch: true rbuv_swap_switch: false mean_value: 0.0 0.0 0.0 var_reci: 0.00392156862745098 0.00392156862745098 0.00392156862745098 }这段配置表示输入RGB图像每个像素除以255归一化。用上AIPP之后主机端就不用再做一次归一化省掉了大量CPU占用推理吞吐能提升20%以上。不过要注意的是AIPP配置的输入尺寸和模型要求的输入尺寸必须一致否则会报错。转换完成后会生成yolov5s_bs1.om文件这就是Atlas能直接跑的模型了。用atc工具还有一个好处是转换日志非常详细如果某个算子不支持它会直接指出来是哪个算子、在哪个维度上不支持。不过日志量大到离谱建议加--logerror参数只把报错信息留下不然你能盯着好几万行日志发呆。4. 推理代码实现与性能调优4.1 基于PyACL的推理主流程模型转换只是第一步真正跑起来还得写推理代码。CANN提供了Python的API——pyACL可以用纯Python开发推理流程不用去碰C/C对算法工程师非常友好。核心流程分五步初始化设备、加载模型、准备输入输出、执行推理、处理结果。下面是一个最简的推理代码结构import acl import numpy as np # 初始化 ret acl.init() ret acl.rt.set_device(0) # 加载模型 model_id acl.mdl.load_from_file(yolov5s_bs1.om) model_desc acl.mdl.create_desc() ret acl.mdl.get_desc(model_desc, model_id) # 获取输入输出尺寸 input_size acl.mdl.get_num_inputs(model_desc) output_size acl.mdl.get_num_outputs(model_desc) # 申请device内存 input_data np.random.randn(1, 3, 640, 640).astype(np.float16) input_buffer acl.rt.malloc(input_data.nbytes, 2) # 拷贝数据到device ret acl.rt.memcpy(input_buffer, input_data.nbytes, input_data.tobytes(), input_data.nbytes, acl.rt.MEMCPY_HOST_TO_DEVICE) # 执行推理 output_buffer acl.rt.malloc(100000, 2) ret acl.mdl.execute(model_id, [input_buffer], [output_buffer]) # 拷贝结果回host output_data np.zeros(100000, dtypenp.float16) ret acl.rt.memcpy(output_data.tobytes(), output_data.nbytes, output_buffer, output_data.nbytes, acl.rt.MEMCPY_DEVICE_TO_HOST)这里有几个细节我要单独拎出来讲。第一个是数据类型因为模型用FP16编译的输入数组必须转成float16如果你给float32NPU会报数据类型错误。第二个是内存申请acl.rt.malloc的第二个参数是内存类型2表示普通内存也可以申请成0表示页面锁定内存锁定内存的host-device拷贝速度会更快。第三个是输出buffer大小因为YOLO的输出层尺寸不确定最简单的方式是直接申请一个大bufferptz直接拿结果后续再做后处理。不过生产环境里没人用这么朴素的写法因为每次推理都实时malloc、拷贝、释放性能非常差。正确姿势是初始化阶段一次性申请好device内存之后每次推理只是往这块内存里覆盖数据推理结果也是读同一块内存避免反复的内存申请和释放。4.2 后处理从原始输出到检测框YOLO的原始输出不是直接的检测框而是大量的预测值需要经过解码、过滤、NMS才能得到最终的边界框。这个后处理是推理链路里最容易写错也最影响性能的一环。经过ATC转换的YOLOv5 ONNX模型输出shape通常是[1, 25200, 85]——25200是三个检测层所有anchor的总数85是4个坐标x_center, y_center, w, h加1个confidence加80个类别概率。YOLOv8的格式是[1, 84, 8400]这里需要乘转换以后结果不一样要先print一下输出维度再写后处理。后处理的经典步骤是把模型输出从device内存拷回host转成numpy数组。先做confidence过滤低于阈值比如0.25的直接扔掉能省下一大截计算量。对剩下的框做坐标解码把x_center、y_center、w、h转成x_min、y_min、x_max、y_max。做类别筛选每个框取最大类别得分作为它的类别。最后跑NMS非极大值抑制把重叠的框去掉。CANN有个专门的接口acl.nn.nms可以调用NPU加速NMS但用起来比较绕通常直接在CPU上跑cv2.dnn.NMSBoxes就够了后处理耗时能压到3毫秒以内。有个优化的点如果你用的是batch1的om模型解码的代码要支持batch维度注意别把batch和通道搞混。我刚开始写的时候直接用[1, 25200, 85]写死后来换batch4的模型时就各种数组越界折腾了半天。4.3 性能优化关键参数与实测数据同样的模型在不同的配置下性能能差出好几倍。影响Atlas推理性能的因素主要有这几个模型输入尺寸、batch大小、AIPP的启用与否、是否开启多线程、模型本身的量化精度。我测试了几种常见配置数据如下表模型配置输入尺寸数据类型batch单帧延迟(ms)吞吐量(FPS)YOLOv5s OM640x640FP1616.8147YOLOv5s OM640x640FP1645.2192YOLOv5s OM AIPP640x640FP1644.1244YOLOv5s INT8量化640x640INT843.2312在这里面最能立竿见影的优化是打开AIPP因为归一化和缩放从CPU搬到了NPU省掉host侧大量时间。其次是batch的调整batch从1提到4延迟反而更低因为NPU的并行度被喂饱了资源的利用率上去了。batch继续加可能会有收益但过了某个点延迟会涨每个模型都有自己最舒服的batch值。INT8量化是压轴好戏量化后的模型推理速度几乎是FP16的两倍而且精度损失在COCO数据集上大概只有2-3个mAP点。如果你做的是工业检测这类对精度要求不那么苛刻的场景无脑上INT8就对了。量化通常有几种方式训练后量化、校准量化其中校准量化需要在NPU上跑一批校准数据来找合适的量化阈值。CANN里有个配套工具叫amct专门干这个事。多线程方面的优化要小心。CANN本身支持多stream并发但Pytroch里跑多个进程每个进程都初始化一个上下文某些版本会有线程安全的问题表现是偶尔崩或者内存泄漏。稳妥的方案是启动一个推理服务进程内部用C或者Python的线程池并发执行但每次推理的输入和输出buffer要分开不能共用同一块内存否则数据会串。5. 常见问题与排查技巧实录5.1 驱动加载失败与设备不可见这是部署Atlas遇到最多的问题具体表现是npu-smi info看不到卡或者提示“No device found、NPU is not present”。排查路径按照顺序来第一步检查PCIe设备是否被识别用lspci | grep -i process如果能看到Processing accelerators或者类似的设备类型说明硬件被系统认到了。第二步确认驱动模块是否加载成功执行lsmod | grep drv_pcie看看有没有昇腾相关的内核模块。如果模块没加载多半是驱动安装时有报错回头仔细看不完整的安装日志。第三步如果驱动加载了但npu-smi依然看不到设备那是固件的问题。最常见的场景是驱动和固件版本不匹配比如驱动是新版固件是旧版。解决方案是去官网把对应的固件找出来重新刷一遍刷固件前记得先把驱动装好再刷顺序别反。还有一个很隐蔽的坑BIOS里的ACSAccess Control Services开启时虚拟机环境可能直通过不了设备导致设备枚举异常。如果是虚拟机里用还需要检查SR-IOV相关的配置直通模式下那套虚拟化开关必须打开。5.2 模型转换报错与算子不支持ATC转模型的报错大多集中在算子不支持、维度推导失败、权重类型不匹配这三种。算子不支持是最常见的。比如YOLOv5里的Focus层在某些CANN版本不支持direct导出。解决方案是把Focus层手动展开为slice和concat操作或者换成等价的卷积加步长操作。但这种会的难度比较大我一般直接用官方onnx模型导出脚本它已经处理好了这些兼容性问题。维度推导失败经常出现在模型里用了动态shape的情况下。比如输入尺寸不是固定值或者用了Python的乘法拼接张量ATC推导维度时会直接执行不下去。解决方法就是把输入shape固定或者把模型里的动态拼接逻辑改成静态的不要用Python的list乘法用torch.cat和tile这类算子。权重类型不匹配的坑藏在PyTorch里如果你的模型是用FP32训练的导出的ONNX权重是FP32但ATC工具默认的输入类型是FP16转换时权重自动转成FP16了。一般情况下不影响精度但如果你在转的过程中手动指定了output_typeFP16模型精度可能掉一点。解决办法是把output_type改成默认或者插入一个cast节点把权重转成FP16再继续。任何一次ATC转换失败都要先把错误日志最后几十行翻一遍详细的报错基本都在最后的报错栈里前面那一堆warning直接无视。5.3 推理性能不如预期时的排查方向性能没跑起来先别急着骂硬件90%是配置问题。我的排查清单如下第一看是不是在CPU上做了太多事。预处理、后处理、数据拷贝有没有全部压到NPU端如果发现CPU占用率拉满先把AIPP打开、把后处理里的循环改向量化。第二看batch设置合理不合理。用npu-smi info看NPU利用率如果利用率只有20%说明模型太小而batch太小NPU在空转把batch提高利用率就能上到60%以上。第三看是否有数据拷贝瓶颈。host到device的拷贝走的是PCIe带宽虽然Atlas 300V是PCIe 3.0 x16理论带宽约16GB/s但如果用普通mallocmemcpy而不是页面锁定内存实测带宽可能只有2GB/s直接拉垮整体性能。这个问题在图像高分辨率输入时尤为明显。第四检查模型是否真的用上了NPU的专用算子。用msprof性能剖析工具抓一遍推理的耗时分布如果发现某个算子的耗时占了大头而且明显是CPU端模拟的common算子在跑就要考虑手动调算子、合算子或者换更合适的模型结构。5.4 24GB显存管理技巧24GB显存看起来很大但用起来也有自己的门道。NPU显存和主机内存是隔离的模型加载时会把权重全量放进显存推理时的输入输出buffer也放显存里。如果模型加buffer超过了24GB会直接申请失败。但如果用得太少又有浪费。有几个管理技巧模型加载后调用acl.mdl.get_desc可以拿到模型占用的显存大小做好统计心里有数。推理线程多的时候每个线程都要有一份输入输出buffer显存占用是成倍增长的。例如batch4的输入buffer4*3*640*640*2字节大约9.2MB输出buffer大约25200*85*2字节约4.2MB一个线程总共才十几MB这还非常宽裕。但如果你开了多模型并发就要精打细算。用acl.rt.set_mem_overload可以设置显存超限策略默认是拒绝分配但可以改成允许用swap临时分担这个在我跑多个模型并发时不建议开启因为swap会拉高延迟。6. 一些写代码时容易忽略的细节6.1 输入输出的数据类型要保持绝对一致这个问题我在前面提过但值得单独拉出来敲黑板。Atlas模型转换时指定了output_typeFP16那么推理时从device读回来的输出数据就是FP16格式。后处理代码里必须先把FP16转成FP32再继续算坐标否则用numpy直接跑NMS会精度爆炸。反过来输入数据也必须和模型对齐。如果ATC转换时没指定输入类型默认是FP16那么host端传入数据就要提前用astype(np.float16)转好再拷贝。有次我把float32的数据直接塞进去atc转出来的模型还照常跑但出来的框全部偏移折腾了一晚上才发现是类型没对齐。6.2 图像缩放方式要和训练时保持一致YOLO训练时通常用的是letterbox缩放也就是保持长宽比把图像等比缩放到640x640剩余部分用灰色填充。如果推理时直接用resize把图片拉伸到640x640检测精度会掉一截尤其是目标物体的长宽比比较极端的时候。后处理还原坐标时也要记得把letterbox产生的偏移扣掉。我写过一个笨办法在预处理时把原始图像尺寸、缩放比例、pad偏移量都存下来后处理时乘回去def letterbox(img, new_shape(640, 640)): shape img.shape[:2] r min(new_shape[0] / shape[0], new_shape[1] / shape[1]) new_unpad (int(round(shape[1] * r)), int(round(shape[0] * r))) dw, dh new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1] dw, dh dw // 2, dh // 2 img cv2.resize(img, new_unpad, interpolationcv2.INTER_LINEAR) top, bottom dh, dh new_shape[0] - new_unpad[1] left, right dw, dw new_shape[1] - new_unpad[0] img cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value(114, 114, 114)) return img, r, dw, dh推理完拿到模型输出的归一化坐标后要先用pad偏移和缩放比例还原到原图坐标公式是x_orig (x_model - dw) / r y_orig (y_model - dh) / r这一步如果弄错了方向框的位置会整体偏测出来mAP惨不忍睹感觉像是模型精度下降其实是坐标还原写反了。6.3 工程化部署时建议用进程隔离而不是线程最后分享一个工程实践上的建议。如果你要把Atlas推理集成到一个Web服务里比如用Flask或者FastAPI千万别图省事在请求线程里直接调acl推理接口。原因很简单CANN的上下文和线程绑定多线程模式下要处理非常多的上下文切换而且初始化只有第一次跑慢第二次如果线程池里线程换了一批就得重新初始化。我实际踩过的坑是先用FastAPI起了8个worker线程每个线程都调acl.rt.set_device和acl.mdl.load_from_file结果跑到第20个请求就报设备被占用最后才发现每个线程要维护自己的stream和context不能共用device。正确的方案是单独启一个推理进程它自己独占NPU设备只暴露一个HTTP或者gRPC接口主服务往这个服务发推理请求用消息队列做解耦。这样既避免了线程安全问题也方便做批处理——来一个请求攒一个batch攒到4个或者超时100毫秒再一起送NPU吞吐能再涨一波。把模型推理当成独立的“算力中间件”来拆分是整个系统能稳定地跑下去的关键所在。7. 关于Atlas工具链和社区的一些大实话用Atlas这套东西跟用CUDA生态的体验确实不一样。CUDA生态文档丰富、社区人多、报错一搜就是一篇Stack OverflowCANN这边文档更新很快但有些细节文档里写的和实际行为就对不上比如有一个算子我在两个CANN版本里转同一个模型居然一个版本支持一个版本不支持气的我直接把版本钉死在一版再也没动过。我的建议是一旦选定CANN版本并跑通了流程生产环境里就不要再随意升级驱动、固件、CANN任何一个组件版本组合这个东西在昇腾生态里非常玄学一个组件的升级可能顺带改变了另一个组件的行为。踩过这个坑之后我现在每台机器上都写了一个环境信息文件记录NPU驱动版本、固件版本、CANN版本、Python版本方便出bug之后还原现场。社区方面昇腾社区论坛和一些技术微信群真的有价值。有些问题你搜遍全网找不到在群里一问管理直接甩给你一个工具包或者补丁。遇到卡住超过一天的问题不管有没有解决先去社区发帖描述一遍环境信息和报错日志这比自己瞎折腾效率高得多。还有一点CANN的版本和PyTorch的版本绑定关系很微妙。CANN提供了torch_npu插件可以让PyTorch直接用上NPU但前提是PyTorch版本和CANN版本完美匹配。如果你只是做推理部署没必要上torch_npu这套大轮子直接在host端用PyTorch做预处理把数据喂给OM模型已经足够了。等你想在昇腾上fine-tune模型的时候再考虑torch_npu的事情也不迟。8. 最后再分享一个调模型的好办法如果你正好卡在转出来的OM模型检测效果不对上我推荐一个逐步排查法先用CANN的比对工具accuracy_compare把ONNX模型的推理输出和OM模型的推理输出逐层比对看差异是从哪一层开始放大的。这个方法我第一次用的时候救了大命——最后发现是AIPP配置里mean_value和var_reci写反了导致输入数据分布完全不对模型输出自然烂成一团。排查工具定位到第一层卷积的输出差异巨大顺着这个线索才找到病根。工具链这东西看起来麻烦但用顺了之后你会觉得它的设计逻辑还是自洽的。在整个Atlas部署过程中我最大的感触是动手前先把流程想清楚尤其是模型转换和硬件匹配这些关键环节能帮你省下大把的试错时间。希望这篇流水账能给你们省几天的时间。
返回列表