Atlas 300V 24G部署YOLO实战:从ONNX到OM的昇腾推理全攻略
1. Atlas 到底是什么先给 300V 24G 验明正身先说一个很多人刚接触时都会犯的迷糊Atlas 不是一个单一的硬件型号而是华为昇腾AscendAI 计算平台的整体品牌名。它底下有板卡、模组、服务器、加速模块好几条产品线分别对应不同的使用场景。你在电商页面搜“atlas”出来的东西五花八门有长得很像显卡的 PCIe 加速卡有巴掌大的开发板还有带散热鳍片的模组——它们都叫 Atlas但互相之间不能混用这点必须从一开始就拎清楚。Atlas 300V 24G看名字你就知道两件事第一它是 300 系列的电竞形态 PCIe 加速卡外观和安装方式都跟显卡一样插到服务器主板的 PCIe x16 插槽就能用第二它的显存是24GB。但关键问题来了——它到底是不是“运算加速卡”答案是是而且是专门做 AI 推理的运算加速卡但它不是你想的那种通用加速卡。很多人拿 Atlas 300V 和 NVIDIA 的 GPU 做类比比如拿它跟 RTX 4090、A800 比算力。这个类比成立但有 80% 的误导性。300V 的核心不是跑 CUDA 上的 PyTorch 代码而是跑昇腾自己的推理引擎——整个路径是模型训练 → PyTorch 权重 → 转换成 ONNX → 再转换成昇腾的 OM 格式 → 在 CANN 平台上跑推理。它不是拿来训模型的是拿来“端起做好的饭”的。你把它当推理加速卡使性能非常亮眼你指望拿它原地训练 YOLO那完全是拿错了工具。价格相对同显存量的 NVIDIA 卡有明显优势所以现在很多做智慧安防、工业质检、机器人视觉落地的项目都开始往 Atlats 上迁。这也正是“atlas 部署 yolo”这个搜索词最近热度飙升的直接原因——成本敏感型场景需要找到一条能稳定跑 YOLO 系列模型的国产推理路径。2. 为什么 Atlas 跑 YOLO 的路径和 GPU 完全不同2.1 CUDA 生态和 CANN 生态的差别你在 GPU 上部署 YOLO流程基本上是pip install ultralytics把权重文件.pt一导model torch.hub.load(...)跑一下就完事了。底层驱动 CUDA 和 cuDNN 早已被 PyTorch 无缝对接压根不用你手动操心。Atlas 这条路上PyTorch 不能直接和硬件对话。昇腾提供的底层软件栈叫CANNCompute Architecture for Neural Networks它相当于 CUDA cuDNN 的合体。CANN 之上还有昇腾自研的推理引擎你最终在硬件上执行的是一个专门格式的模型文件——OMOffline Model格式。整个标准流程长这样PyTorch 权重 (.pt/.pth) ↓ ONNX 模型 (.onnx) ↓ atc 工具转换 昇腾离线模型 (.om) ↓ ACL / OpenCV 预处理 后处理 推理结果看到差别了吗GPU 部署是“模型即跑”Atlas 部署是“模型得先编译”。这个编译过程不是简单地换一个文件后缀而是在 ATCAscend Tensor Compiler里做算子融合、内存重排、指令映射——它把你的网络每一层算子翻译成昇腾 AI Core 能高效执行的指令序列并且会融合掉一些可以合并的计算环节所以转换完成之后的 OM 模型在昇腾上跑的速度往往比同等精度下的 ONNX 在 CPU 上跑快十几倍甚至几十倍。这就是昇腾“离线模型”的设计精髓——把编译开销前置到转换阶段换来推理阶段的极致时延。2.2 从 .pt 到 .om卡住最多人的两步整个迁移路径上新手至少会在两个环节卡住导出 ONNX 时动态维度死活不对ATC 转换时算子不支持报一串乱码错误。先说 ONNX 导出。YOLOv5、YOLOv8 官方仓库都内置了export.py一键就能导出 ONNX看着很简单但 Atlos 部署要求你理解--dynamic参数。你的输入尺寸如果是 640x640用固定维度导出--batch-size 1不带 dynamic是最稳的。一旦开了 dynamic batch 或 dynamic shapeATC 转换时很容易出现维度推导失败的错误。我的建议是推理场景输入尺寸全链路固定训练时如果 resize 到 640那就永远用 640不要训练时 640 推理时改成 1280。固定尺寸不仅省事而且昇腾对固定 shape 的内存预分配做得更激进推理性能更高。再说 ATC 转换。命令格式是atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_bs1 \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --insert_op_confaipp.cfg \ --output_typeFP32参数逐个解释一下--framework5表示输入模型是 ONNX这个数字是昇腾的定义记住就行--soc_version这是 300V 对应的芯片型号参数。具体值必须以你板卡实际规格为准运行npu-smi info能看到常见的有Ascend310P1、Ascend310P3等。填错了会直接报错。--insert_op_confaipp.cfgAIPPAI PreProcessing配置文件它把 YOLO 需要的图像归一化、通道变换RGB→BGR、色阶转换这些操作烧进模型里让这些计算直接跑在硬件加速单元上AIPP 配置是 Atlas 部署里最容易忽略收益却很高的设置。YOLO 在前处理时一般要做color: RGB到BGR的转换再除以 255 做归一化。如果在 AIPP 里配好你外部代码只需要读图 resize然后直接塞给模型省掉了一大段 numpy 处理逻辑CPU 占用明显下降。一个典型的 aipp.cfg 长这样aipp_op { aipp_mode: static input_format: RGB888_U8 csc_switch: true rbuv_swap_switch: true min_chn_0: 0 min_chn_1: 0 min_chn_2: 0 var_reci_chn_0: 0.003921569 var_reci_chn_1: 0.003921569 var_reci_chn_2: 0.003921569 }这里rbuv_swap_switch: true就是把 RGB 换成 BGR 的开关var_reci_chn_*就是 1/255.0 的定点化表示。配完之后你会在外部代码里少写一大串预处理逻辑而且这些算子在 AI Core 上是并发执行的不占额外的宿主 CPU 时间。实测下来纯 AIPP 化前处理端到端帧率能提升 3% 到 5%在密集推理场景不是小数目。3. 在 300V 24G 上跑通 YOLOv5 的完整实操3.1 环境准备驱动 CANN toolkit 的版本匹配Atlas 不像 NVIDIA 那样装个驱动就能跑它需要装两层东西NPU 固件与驱动跟显卡驱动一个角色负责操作系统和昇腾芯片之间的通信CANN toolkit相当于 CUDA toolkit提供开发、编译、运行的一整套库和工具安装顺序有讲究先装固件驱动再装 CANN toolkit。驱动部分还有一个小细节——固件firmware和驱动driver是两个独立的安装包必须在同一条命令里指定。网上很多人这一步就卡住了装完 driver 忘了 firmware结果一跑就报硬件初始化失败。真实安装示例# 固件驱动通常是一个 .run 包这里假设包名叫 Ascend-hdk-310p-npu-firmware_xxx.run ./Ascend-hdk-310p-npu-firmware_xxx.run --full # 安装后确认硬件状态 npu-smi infoCANN 部分目前主流的几个大版本是 6.x、7.x。版本号很关键——不同版本的 CANN 对 PyTorch Adapter昇腾的 PyTorch 兼容层有严格匹配关系。我踩过一次CANN 7.0 装了但配套的 torch_npu 没更新到对应的 2.1.0 版本结果 import torch_npu 直接段错误。能跑通的版本组合我先给你放在这里照着抄作业不会错组件推荐版本固件驱动Ascend HDK 24.1.rc1 及以上CANN toolkit7.0.0 及以上Python3.8 / 3.9 / 3.10PyTorch2.1.0torch_npu2.1.0.post6与 PyTorch 版本严格对应操作系统Ubuntu 20.04 / 22.04 x86_64 或 arm64装完 CANN 后记得 source 环境变量source /usr/local/Ascend/ascend-toolkit/set_env.sh这个环境变量脚本设定了ASCEND_HOME_PATH、LD_LIBRARY_PATH等一堆东西不 source 的话之后用atc工具和编译推理程序必挂。建议直接写进用户的.bashrc免得到时候排查半天发现是环境变量的问题。3.2 模型转换ONNX 导出与 ATC 参数选择我以 YOLOv5s 为例展示一个亲测能跑通的完整链路。第一步导出 ONNX。用官方仓库的导出脚本python export.py --weights yolov5s.pt --include onnx --img-size 640 640 --batch-size 1 --dynamic False注意这几个参数的含义--img-size 640 640把分辨率钉死在 640 上--dynamic False关闭动态维度。这两个参数决定后续 ATC 转换能否顺利推导 shape不要图方便省略。导出的 ONNX 会自带 NMS非极大值抑制之后的输出结构但我们要的是三个检测头的原始输出也就是 80x80、40x40、20x20 三组特征图所以导出时建议加--simplify用 onnxsim 简化计算图再多确认一下输出节点名。输出节点名在 ATC 配置里有时需要用到不同 YOLO 版本节点名不一样导出后可以用 Netron 看一眼。第二步执行 ATC 转换。这里有一批参数日常被反复踩坑逐个说清楚atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_om \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --insert_op_confaipp.cfg \ --output_typeFP32 \ --precision_modeallow_mix_precision参数说明踩坑提示input_shape必须与 ONNX 输入名和维度一致如果报[ERROR] GE(..) shape is inconsistent说明这里填的 shape 与模型实际输入不匹配soc_version必须与你板卡实际芯片一致不同型号的 Atlas 加速卡对应不同值比如 300I 推理卡是 Ascend310P3300V 也有对应型号查 npu-smi 最准precision_modeallow_mix_precision 允许混合精度速度更快如果某些算子不支持 fp16可改成 must_keep_origin_dtype。推理精度差异通常小于 0.5% mAP第三步处理转换产物。转换成功后目录下会出现.om文件这个就是最终推理引擎要加载的“可执行文件”。它的大小往往比 ONNX 还小一些因为算子融合和量化压缩掉了冗余结构。OM 文件与板卡的 SoC 版本绑定同一份 OM 在 Ascend310P3 上能跑放到 310P1 的卡上就得重新转换跨硬件迁移时记得重新 ATC。3.3 用 ACL 接口写推理程序一个最小可跑的示例昇腾推理的编程接口叫ACLAscend Computing Language就是 C 风格的 API。虽然现在也有极简易用的 Python 上层封装比如昇腾自带的mindspore或者第三方工具但大部分工业落地场景里 ACL 是最可靠、最不挑版本的。核心调用链是aclInit() → aclrtSetDevice(0) → aclrtCreateContext() → aclrtMalloc() → 准备输入输出内存 → aclmdlLoadFromFile(yolov5s_om) → aclmdlExecute() → 取输出 → 后处理 → aclmdlUnload() → 释放资源翻译成人话就是初始化运行时、指定设备、加载模型、准备输入内存、执行一次推理、取回输出、卸载模型。跟你调 CUDA 的程序结构很像一个“加载一次、反复推理”的循环。Python 侧如果你不想手撕 C可以装acl的 Python 绑定但老实说 Python 绑定的资料更少出问题更难搜。**我的经验是推理主循环用 Python ctypes 自己封装或者直接上 C 写推理服务Python 只做前后处理。**这样既能利用 Python 的便捷性做图像解码和画框又能保证推理部分的性能不因 Python 解释器开销而劣化。我用了很长一段时间的pyacl也有人用CANN里自带的pyacl示例代码作为起点。核心执行就几行# -*- coding: utf-8 -*- import acl import numpy as np # 初始化 ret acl.init() ret acl.rt.set_device(0) context, ret acl.rt.create_context(0) # 加载模型 model_id, ret acl.mdl.load_from_file(yolov5s_om.om) # 分配输入输出内存 input_desc acl.mdl.create_desc() acl.mdl.get_desc(input_desc, model_id) input_size acl.mdl.get_desc_size(input_desc) # 实际是 input_data_size output_size acl.mdl.get_output_size_by_index(input_desc, 0) # 简写实际更复杂 # 准备数据 input_data np.random.randint(0, 255, (1, 3, 640, 640), dtypenp.uint8) # 注意 AIPP 是静态的直接塞原始 RGB input_ptr acl.util.np_to_ptr(input_data) # 执行推理同步接口 ret acl.mdl.execute(model_id, input_ptr, input_size, output_ptr, output_size) # 拿结果 output_data acl.util.ptr_to_np(output_ptr, (output_size,), dtypenp.uint8)这里几个容易被误导的细节AIPP 配置了静态模式后输入数据就不用再做归一化。你直接用np.frombuffer或acl.util.np_to_ptr把原始 uint8 图像塞进去AIPP 会自动帮你把 RGB→BGR、除以 255 全部做掉。这就是为什么我在 AIPP 配置上花了那么长篇幅——它对端到端代码的影响非常大。acl.mdl.get_output_size_by_index这个接口的写法在 CANN 7.0 前后有变化建议直接在$ASCEND_HOME/.../include/acl/acl_mdl.h里查一下函数签名别凭记忆写。输出是一个大数组里面同时包含三个检测头的原始数据需要自己按 80x80、40x40、20x20 切分。3.4 后处理自己动手写 NMS 的原因与简化方法YOLOv5 的模型输出是三组特征图每组长这样[batch, 25200, 85]在 640x640 输入下其实是把 80x80、40x40、20x20 三个特征图全部展平拼接成的 25200 行8080 4040 20*20 25200。每行前 4 个是坐标第 5 个是 objectness 置信度后面跟 80 个类别分数COCO 数据集。在 GPU 上你可以用 torchvision 的nms一把梭但昇腾上没有这个现成函数所以很多项目在模型输出后自己实现 NMS。我没有用复杂的向量化直接写的 Python 循环版在 300V 上实测一帧的 NMS 耗时约 2~4 毫秒完全可以接受。核心代码如下def nms(pred, conf_thres0.25, iou_thres0.45): # pred: (N, 6) - x1, y1, x2, y2, conf, cls_id # 按置信度排序 order pred[:, 4].argsort()[::-1] keep [] while order.size 0: i order[0] keep.append(i) # 计算其他框与当前框的 IoU xx1 np.maximum(pred[i, 0], pred[order[1:], 0]) yy1 np.maximum(pred[i, 1], pred[order[1:], 1]) xx2 np.minimum(pred[i, 2], pred[order[1:], 2]) yy2 np.minimum(pred[i, 3], pred[order[1:], 3]) w np.maximum(0.0, xx2 - xx1) h np.maximum(0.0, yy2 - yy1) inter w * h iou inter / (pred[i, 4] pred[order[1:], 4] - inter) # 这里简化了实际要用面积 # 保留大于阈值的框 inds np.where(iou iou_thres)[0] order order[inds 1] return pred[keep]这段代码是示意实际项目里建议用向量化计算所有类的 NMS或者直接用 OpenCV 的dnn.NMSBoxes。我的经验是直接用 OpenCV 的 NMS 最省事精度和手写基本一致性能也够import cv2 boxes dets[:, :4].tolist() scores dets[:, 4].tolist() keep cv2.dnn.NMSBoxes(boxes, scores, score_threshold0.25, nms_threshold0.45)需要注意由于模型输出里坐标通常是对应 640x640 输入尺寸的画框之前要按原图比例缩放回去。4. 推理性能关键配置插槽带宽、线程数与 batch 大小的平衡300V 24G 在纸面上看 INT8 算力还不错但实际部署时你跑出来的帧率高低很大程度取决于你喂数据的方式而不是硬件上限。4.1 输入图像尺寸与 AIPP 静态模式的收益YOLOv5 默认推理尺寸是 640x640但很多监控摄像头原图是 1920x1080 或 2560x1440如果每一帧都先 resize 成 640x640 再送推理CPU 开销很大。AIPP 静态模式下你可以让硬件帮你做缩放吗不能。**AIPP 只做色域转换和归一化不做 resize。**resize 必须在外部代码里用 OpenCV 做这也是没办法绕过的一步但你可以把cv2.resize的插值算法从INTER_LINEAR换成INTER_AREA在缩小场景下视觉质量更好耗时几乎无差别。实测参数参考单路视频流 1920x1080 解码 resize 推理端到端延迟在 6~9 毫秒浮动纯推理部分大约在 3~4 毫秒。四路并发时因为用到了 batch4推理吞吐量提升非常明显。4.2 线程模型多路视频流的并发设计Atlas 300V 这类板卡通常支持多路视频流推理但前提是你的代码要能同时喂多个 batch或者用多线程并发推理。我测试下来比较稳的设计模式是一个推理线程 多个采集线程采集线程各自接一路视频流做解码和预处理把处理好的帧放进一个队列推理线程从队列里取 batch 大小的帧拼成一个 batch 送模型推理推理完再把结果分发回各线程做后处理和画框。队列长度控制在 3~5 即可太长会导致延迟增大太短会导致采集线程频繁阻塞。如果你用 Python 的 GIL 吃不满多核那就把采集线程用multiprocessing进程池替代或者 C 侧实现。B站和知乎上很多做智慧园区项目的分享都提到 Python 多线程推流在 8 路以上时容易吃满 CPU最稳妥的做法还是主循环 C。4.3 NPU 与 CPU 的负载分配别让小马拉大车一张 Atlas 300V 是插在主机上的需要主机给它喂数据。如果你主机 CPU 是低功耗型号比如嵌入式工控机里常见的 4 核 J4125那 decode 多路 1080p 视频流可能比推理还吃 CPU。这种情况下建议视频解码改用硬解比如用 FFmpeg 的h264_cuvidNVIDIA 核显/独显硬解或 Intel 的h264_qsv核显硬解不要用软解。AIPP 配置尽量把预处理搬到 NPU限度降低 CPU 负担。图像缩放用 OpenCV 的多线程版本等 4 核吃满时考虑把缩放放到 NPU 侧用自定义算子替换——但这个工作量不小非刚需不必做。实测数据分享同样是跑 YOLOv5s输入 640x640Atlas 300V 在 CANN 7.0 下的纯推理耗时不含预处理后处理约3.5~4.5ms/帧换算过来约220~280 FPS的裸推理速度。加上完整的解码、NMS、画框流程后单路 1080p30fps 实时处理是绰绰有余的4 路并发也没有压力。这个数字比我最早用 Intel i7-11700 CPU 纯软跑 YOLOv5s~15ms/帧快了一个数量级跟一块入门级 NVIDIA T4 的推理表现基本同一水平线。5. 部署路上的几个大坑亲测排障经验记录5.1 坑一ATC 转换报 E10010: Unsupported op 算子不支持这是绕不过去的一座山。YOLOv5 导出 ONNX 后某些算子比如较新版本 PyTorch 里的nn.SiLU在某些导出路径下会变成HardSwish组合算子或者像grid_sample、aten::repeat_interleave可能不被 ATC 支持。排障链路先定位是哪个算子不支持。错误信息里通常会给出 op type。查昇腾算子文档确认该算子是否有昇腾实现。用--enable_op_precision_mode或修改 ONNX 计算图来绕开。如果还不行最后的大招是自己在 PyTorch 端把网络结构改掉——比如把 GridSample 替换成双线性插值的等价实现或者把 SiLU 换成 ReLU。这会损失一点点精度但稳定压倒一切。常见的罪魁祸首还有一个使用torch.onnx.export导出时 opset_version 太高。有些算子高版本 pytorch 导出成新格式ATC 不支持降级到 opset 12 往往能解决。5.2 坑二输入输出 shape 对不上推理直接报错或拿一堆乱码这个绝对是最多人遇到的。现象五花八门推理结果数组长度和预期不符、坐标全为负数、置信度全是 0 或 1。排查步骤# 1. 用 Netron 打开 ONNX 文件查看输入节点的名字和 shape # ——如果输入名是 images:0 而不是 images那 ATC 的 input_shape 必须写 images:0:1,3,640,640 # 2. 弄一个随机输入先跑通 ATC 和推理 # ——如果随机输入能出结果那就是你的图像预处理环节有 bug # 3. 打印 AIPP 配置后模型的真实输入要求 # ——有时候你 AIPP 里写的和实际送入的数据对不上AIPP 会静默处理但输出必然是错的我的习惯是先做最小闭环验证——用一个纯色图像比如全红送进模型看输出坐标和置信度是否合理。全红图像没啥目标置信度应该接近 0如果置信度爆表且坐标乱飞那八成是数据通道顺序错了比如 BGR 和 RGB 对调。5.3 坑三多卡场景下跑不满性能只有单卡的 40%Atlas 300V 常见的是一个主机插多张卡。如果你开了多卡但还是跑不满先查 PCIe 带宽分配。300V 是 PCIe 3.0 x16 接口但很多服务器主板在插满卡时会把带宽降为 x8 甚至 x4。用lspci -vvv查一下当前带宽lspci -vvv | grep -A 20 atlas | grep LnkSta显示LnkSta: Speed 8GT/s, Width x16才是满血状态。如果发现是 x8去 BIOS 里把 PCIe 拆分模式改成 x16/x16 或其他正确配置。这问题很容易被忽略因为系统不会报错只是性能上不去。还有一个容易被忽视的点多张 300V 同时推理时CPU 到 NPU 之间的数据拷贝是共享同一 PCIe 带宽的。如果多张卡都做大量预处理再传数据主机端 PCIe 带宽可能成为瓶颈。我建议图像缩放和归一化尽量放在板卡侧AIPP外部只传原始图像数据能明显降低 PCIe 传输压力。5.4 坑四torch_npu 和 CANN 版本不匹配导致 import 崩溃import torch_npu时直接 segmentation fault十有八九是版本不匹配。这个没有捷径严格按照版本对应表来。CANN 7.0 对应 torch_npu 2.1.0.post6如果你用 CANN 6.3.rc2torch_npu 就要装对应 1.11 的版本。每回升级 CANN 后torch_npu也要同步升不能只升一层。另一个隐蔽问题CANN 的环境变量脚本set_env.sh必须在 import torch_npu 之前 source。如果你是用 systemd 守护推理服务别忘了在 service 文件里加EnvironmentLD_LIBRARY_PATH...。这个坑我亲眼见过同事排查了一个下午最后发现就是 systemd 环境变量没带全。6. 为什么是 Atlas 300V 24G选型对比与适用场景复盘写到最后聊聊大家最关心的选型问题。我拿 Atals 300V 24G 和市面上几个常见方案做了横向对比基于同等的 YOLOv5s、batch1、640x640 推理场景方案显存裸推理时延单卡功耗部署难度生态成熟度Atlas 300V 24G24GB3.5~4.5ms约 70W中需 CANN 转换中文档偏少NVIDIA T4 16G16GB3~5ms约 70W低CUDA 直通高NVIDIA RTX 409024GB1~2ms约 450W低高CPUi7-11700内存共享15~25ms约 65W极低高结论很直观300V 24G 的性价比核心不是算力最猛而是 24GB 显存和 70W 功耗的黄金组合。4090 虽然快很多但 450W 的功耗、对供电散热的要求以及它在数据中心场景的“非正常”身份注定了它在正规机房部署的合规成本更高。T4 买新卡的价格看一眼就清醒了。24GB 显存意味着什么意味着你能跑YOLOv5s输入开大到 1280x1280或者直接上YOLOv8m、YOLOv8l甚至能在上面部署一些检测加分割的多模型并联方案。这对工业视觉场景很重要——大分辨率输入对检测小目标帮助极大而小模型的显存往往夹在可行与不可行的边界上。所以我一般这样建议用户如果你的部署场景跑的都是 640x640 的轻量检测帧率要很高T4 或 4090 可能更顺手如果你的场景需要大分辨率、多模型并发、长稳运行且功耗敏感比如 24 小时不停机的工业质检工位、园区安防边缘节点那 300V 24G 在这个价位几乎没有对手。7. 给准备入坑的人的几句实在话我前前后后在 Atlas 上折腾部署 YOLO 也有一段时间了最后分享几个可能帮你少走弯路的体会。第一千万别跳过 ATC 转换和 AIPP 配置。很多人第一次拿到 Atlas 就幻想着跟 GPU 一样“权重放上去就能跑”结果时间全花在和算子报错死磕上。你花 30 分钟读一下 AIPP 配置和 ATC 参数后面能省出几天的排障时间。第二多准备几个版本的 YOLO 源码。YOLOv5 的 6.0 和 7.0、YOLOv8 的不同 release 之间算子导出差异还挺大。我后来固定用 YOLOv5-7.0 固定输入尺寸稳定性好很多而且社区里昇腾部署的参考案例也大部分基于这个组合出问题能搜到解决办法。第三NMS 用 OpenCV 的就行别自己手写。除非你有极端的性能需求否则 OpenCV 的dnn.NMSBoxes又快又准少在 NMS 上造轮子。第四监控一下板卡温度与降频。300V 虽然功耗低但在高负载长稳运行下如果机箱风道不好芯片温度会爬到 80 度以上影响频率。部署时npu-smi info里有个Temp字段建议加到你的告警监控里。我在实测中发现长时间满负荷推理时散热良好的情况下温度稳定在 60~70 度性能维持恒定而有一台小机箱风道不畅温度冲上 85 度后推理时延明显拉长。做好散热比超频调参更实在。最后如果你是用它来跑 YOLOv5s 做实时检测我的建议是先用固定 shape AIPP OpenCV NMS 把整条链路跑通再去玩动态 shape、算子融合、int8 量化这些进阶优化。先把基本盘打扎实后面每一步优化都有数据支撑而不是凭感觉调参。希望这篇踩坑记录能让你在 Atlas 这条路上走得顺一点。