尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Atlas 300V 24G推理卡上YOLO模型部署与调优

Atlas 300V 24G推理卡上YOLO模型部署与调优 拿到一张 Atlas 300V 24G 的时候很多人心里的第一个疑问和我当时一模一样这到底是不是一块“运算加速卡”网上搜到的资料总是把它挂在昇腾、NPU、推理卡这些名词下面看得人云里雾里。我直接给结论它确实是一块运算加速卡但和 NVIDIA 那种把训练、推理一锅端的 GPU 不一样Atlas 300V 24G 是一张纯推理方向的 AI 加速卡最典型、最常用的用途就是把你已经训练好的模型——尤其是 YOLO 这类目标检测模型——以很高的性价比跑起来做线上推理。这篇文章我就围绕“Atlas 300V 24G YOLO 部署”这个组合展开把硬件定位、选型逻辑、部署全流程、性能调优和踩坑记录一次讲清楚。想过用昇腾卡做目标检测部署的朋友不管是做边缘盒子、视频分析服务器还是工业质检的推理节点这篇文章都值得你花十分钟看完至少能帮你少走一半弯路。1. Atlas 300V 24G 到底是什么卡1.1 一张 24GB 显存的 AI 推理加速卡先纠正一个最常见的误区。很多人看到“24G”第一反应是“这卡显存不小能跑训练吧”其实不行。Atlas 300V 24G 按照昇腾的产品定位属于推理加速卡不是训练卡。它上面的芯片是昇腾 310P这颗芯片本身就是面向推理场景设计的INT8 算力能到 140 TOPS 左右FP16 算力大约 70 TFLOPS功耗却只有 70W 上下。这里的关键词是“推理”。意思就是模型训练阶段基本不指望它但在模型训练完之后把训练好的权重文件部署上去做实际的识别、检测、分类这才是它的主场。拿它跑了整整两周 YOLOv5s 和 YOLOv8s 之后我的感受是这卡的定位非常清晰就是一颗“专职干活的芯”把目标检测这类推理任务做到极致的性价比。那 24GB 显存到底有什么意义很多刚接触昇腾生态的朋友会拿它和显卡的显存做类比。Atlas 300V 24G 这 24GB 是板载的内存专门给模型推理时存放权重、中间特征图和输入输出数据用的。像 YOLOv8s 这种规模的模型权重文件也就 20MB 出头单张 640x640 的输入图像在内存里占 1.2MB 左右看起来 24GB 大得离谱对吧但实际推理时模型内部的中间激活张量会成倍放大。我之前实测过在 batch size 拉到 32、输入分辨率 1280x1280 的时候YOLOv5s 在 Atlas 300V 上单次推理的内存占用能轻松超过 2GB。所以 24GB 的意义不是让你跑更大的模型而是让你能开更大的 batch、同时加载更多路模型或者跑更高分辨率的输入实现真正的多路并发推理。1.2 它和 GPU、普通加速卡的区别如果把 Atlas 300V 24G 和 N 家的 GPU 放在一起比你会发现一个很有意思的差异GPU 是“通才”训练、推理、渲染、科学计算什么都能干功耗和价格也跟着水涨船高而 Atlas 300V 是“专才”它只为神经网络推理优化硬件上把很多通用计算单元砍掉了换来了更低的功耗和更聚焦的算力。举个我实际工作中的例子。之前要给一个视频分析项目做推理节点需要同时跑 8 路 1080p 视频流每路视频都要做 YOLOv5 目标检测。用一块普通的消费级 GPU 当然也能跑但整机功耗、散热和成本都得重新算账。Atlas 300V 24G 的整卡功耗只有 70W 左右而且卡上集成了硬件视频解码能力H.264/H.265 硬解不用占 CPU视频流直接进卡解码完直接推理整个流水线的资源开销低得多。这个设计思路就是典型的“推理场景专用硬件”。另外要提一下Atlas 300V 不是一张“无脑堆算力”的卡。它不支持像 CUDA 那样通用的编程模型你没法随便写一段通用计算代码丢上去跑。它的开发完全围绕昇腾的 CANN 工具链展开模型的输入输出格式、算子的适配、内存的管理都有自己的一套规则。这也意味着上手门槛比 GPU 高一点点但一旦摸清了流程部署效率反而很高因为 CANN 对常用视觉模型的支持已经相当成熟。1.3 硬件规格细节值得关注的几个点具体规格我这里列一个表是我实际用下来后觉得最需要关注的几个参数参数数值说明芯片昇腾 310P推理专用 NPU非训练芯片内存24GB板载内存可容纳大 batch 和多路并发INT8 算力约 140 TOPS推理时的主要算力来源FP16 算力约 70 TFLOPS精度要求高时的推理精度选择卡功耗约 70W整卡功耗散热压力小接口PCIe 3.0 x16大部分服务器主板可直接插视频解码支持 H.264/H.265 硬解码视频流推理场景很有用这里特别想说一下视频解码这个能力。很多人一开始没意识到它的价值直到你真正做视频流的实时检测才发现16 路视频流如果用 CPU 软解CPU 直接被打满还轮不到 NPU 干活呢。Atlas 300V 卡上硬件解码把这一步揽过去了而且解码后的数据可以直接送进推理单元省掉了一次 PCIe 传输。这个特性在做视频分析平台的时候是实打实的性能保障。2. 为什么选择 Atlas 300V 跑 YOLO2.1 YOLO 部署在推理卡上的真实场景YOLO 系列是目标检测领域用得最广的模型之一从 YOLOv5 到 YOLOv8再到今年的 YOLOv10几乎成了工业视觉落地的事实标准。它之所以火不是因为精度在所有模型里最高而是因为它在精度和速度之间的平衡点找得特别好。尤其是 YOLOv5s、YOLOv8s 这种轻量版本在边缘设备上跑得非常流畅。Atlas 300V 24G 这种推理卡正好就是冲着 YOLO 这类模型来的。我实际接触到的几个落地场景非常典型智慧园区的人流统计与入侵检测实时分析监控摄像头画面工厂产线的缺陷检测产品过 CCD 拍照后用 YOLO 识别瑕疵交通场景的车牌识别、车型分类在路口边缘机房做实时推理直播平台的内容审核用 YOLO 快速定位违规目标。这些场景有一个共同特点模型是固定的、训练好的推理请求并发量很大对单帧延迟有要求但对功耗和成本非常敏感。Atlas 300V 24G 在这种场景下的优势很明显算力集中、功耗低、板载 24GB 内存适合多路并发单卡能顶住的路数比之前用 CPU 推理的方案翻了好几倍。2.2 Atlas 300V 打 YOLO 的优势我先说结论这套组合最大的优势不是跑得比谁都快而是单位功耗下的有效算力很能打。我用 YOLOv8s 做过对比测试。同样的模型、同样的输入分辨率 640x640在一台只插 Atlas 300V 24G 的服务器上不做任何花哨优化FP16 精度下单帧延迟可以稳定压在 10 毫秒以内。如果把 batch size 拉起来配合 CANN 的异步推理接口整卡吞吐量跑到几百 FPS 是没什么悬念的。在我这台双路至强服务器上原来用 CPU 做 YOLOv8s 推理单路 1080p 视频大概只能跑到 15 FPS 左右换成 Atlas 300V 之后单卡可以轻松扛起 8 路以上视频流的实时检测这个提升幅度非常直观。另一个隐性优势是内存带宽和并发能力。24GB 的板载内存让整卡可以同时承载多个模型实例。我试过在一张 Atlas 300V 上同时加载 YOLOv5s 和 YOLOv8s 两个模型跑不同的检测任务互不干扰。在项目里如果有多模型需求比如先检测行人再检测车辆一张卡就能搞定不需要再去买第二张卡。2.3 选型时要避开的坑说完优势也得泼点冷水。选 Atlas 300V 之前有几个问题你最好想清楚第一生态和 CUDA 不是一回事。你之前用 PyTorch CUDA 写的推理脚本不能直接在这个卡上跑。所有模型必须先转换成昇腾的离线模型格式推理代码要重写。这个转换和适配过程是需要花时间学习的建议先在小项目上跑通再上生产。第二模型能不能转成功取决于算子支持情况。YOLOv5、YOLOv8 这种主流模型CANN 的支持已经很好了基本可以一键转换。但如果你用的是比较冷门的模型或者加了自定义算子转换时可能就会卡住。我后面会专门讲这个问题。第三量化和精度问题。Atlas 300V 的 INT8 算力虽然非常强但把模型量化到 INT8 是有精度损失的。如果你的业务对精度极其敏感比如医疗影像分析建议老老实实用 FP16不要为了冲 FPS 盲目开 INT8。第四驱动程序对 Linux 内核版本有要求。装驱动前一定要查昇腾官方兼容性列表不然遇到驱动编译失败或者加载失败排查起来非常折磨人。这块我在后面踩坑部分会详细说。3. 部署 YOLO 的完整实操流程3.1 环境准备驱动、固件与 CANNAtlas 300V 的软件栈主要由三部分组成NPU 驱动、固件、CANN 工具包。三层之间版本有对应关系少了哪个都会出问题。这一步是整个部署过程中最枯燥但也最关键的环节。我用的环境是 Ubuntu 20.04内核版本 5.4。安装顺序建议是先装驱动再装固件最后装 CANN 工具包。驱动安装一般是这样的流程# 下载对应的驱动包例如 Ascend-hdk-310p-npu-driver_x.x.x_linux-aarch64.run 或 x86_64 版本 ./Ascend-hdk-310p-npu-driver_6.2.0_linux-x86_64.run --full这里有个容易犯的错误有些朋友图省事驱动用默认参数装完就直接跑也不确认是否成功。驱动装完以后一定执行一次npu-smi info能看到卡的信息才算真的装好。如果执行报错八成是驱动和内核版本不匹配或者依赖的 DKMS 没编译成功。CANN 工具包的安装比较简单官方给的是自解压安装包./Ascend-cann-toolkit_6.2.0_linux-x86_64.run --install安装完成后需要把环境变量加进~/.bashrcsource /usr/local/Ascend/ascend-toolkit/set_env.sh这一步千万别省不加环境变量的话后面的atc、msame工具全都调用不起来命令行会告诉你找不到命令。我在环境准备阶段总结出一个经验版本对齐最重要。装之前先到昇腾社区查一下当前最新驱动对应哪个版本的 CANN避免装出“驱动版本太老、CANN 版本太新”这种组合。我第一次部署时就踩了这个坑后面花了半天才查明白非常折腾。3.2 模型准备YOLO 权重导出 ONNX这一步是所有后序操作的基础。无论你是从官方仓库拉来的 YOLOv5s 权重还是自己训练出来的模型最终都要先导出成 ONNX 格式才能进入昇腾的模型转换环节。以 YOLOv5s 为例官方仓库里已经有导出脚本一行命令就能完成python export.py --weights yolov5s.pt --include onnx --img 640 --batch 1需要注意一个细节导出 ONNX 时最好固定 batch size 为 1。虽然昇腾 ATC 工具支持动态 batch但动态 shape 会引入额外的性能损耗而且某些版本的 CANN 对动态 shape 的支持并不完善。如果业务上确实需要不同 batch 的推理我建议导出两个 ONNX 文件一个 batch1 应对实时单帧请求一个 batch8 或 batch16 应对高吞吐批量推理。YOLOv8 也一样yolo export modelyolov8s.pt formatonnx imgsz640 batch1导出完成后用 Netron 打开 ONNX 文件主要确认一下输入节点的名称和输出节点的数量。YOLOv5 的输出一般是三个尺度的检测头对应三个输出节点格式类似于 (1, 25200, 85)。YOLOv8 的输出则是一个较大的多维数组格式是 (1, 84, 8400)其中 84 是 4 个框坐标加 80 个类别得分8400 是所有尺度上的候选框总数。这些输出格式需要记清楚因为后面写推理代码和后处理时要用到。3.3 使用 ATC 将 ONNX 转为 OM 离线模型ONNX 只是“中间产物”昇腾 NPU 真正能直接加载的模型文件格式是.om。转换工具叫atc全称是 Ascend Tensor Compiler。我以 YOLOv5s 为例一条典型的 ATC 转换命令长这样atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_bs1 \ --soc_versionAscend310P3 \ --input_shapeimages:1,3,640,640 \ --out_nodesConv_0:0;Conv_1:0;Conv_2:0 \ --logerror几个关键参数解释一下--framework5表示输入的是 ONNX 模型--soc_versionAscend310P3是芯片型号Atlas 300V 走的是昇腾 310P具体是 P1 还是 P3用之前最好查一下手上的卡--input_shape必须和导出的 ONNX 输入维度一致--out_nodes指定输出节点可以从 Netron 里查到输出层的名字--logerror让日志只输出错误信息避免刷屏。如果你用的是 YOLOv8但 ATC 转换时遇到算子不支持的问题别急很多情况下是输出的后处理算子太复杂了。一个常见的技巧是导出 ONNX 时把后处理部分比如 NMS放到模型外面ONNX 只保留主干网络和检测头输出后处理全部在推理代码里用 CPU 完成。这样模型转换轻松很多而且实际性能影响很小。转换完成后确认生成.om文件可以用工具看一下模型信息omg --modelyolov5s_bs1.om --print_model这一步能快速检查输出节点和档位信息是否正确。我的习惯是每次转换完都看一下输出节点的 shape如果 shape 和预期不符多半是 ONNX 导出阶段就出了问题。3.4 AscendCL 推理代码实现模型转换成功之后整个部署的核心就到了推理代码这一环。昇腾提供的是 AscendCLACL推理接口和 CUDA 的 runtime API 有些类似但 API 风格完全是昇腾自己的。实现一次完整推理的基本流程是初始化 ACL 环境指定工作设备创建上下文加载.om模型文件拿到 modelID为输入输出分配内存创建数据集把预处理好的图像数据拷贝到输入内存执行推理从输出内存拿回结果做后处理。我用 C 写一个从加载模型到执行推理的骨架代码#include acl/acl.h #include iostream int main() { // 1. 初始化 aclInit(nullptr); int32_t deviceId 0; aclrtSetDevice(deviceId); aclrtContext context; aclrtCreateContext(context, deviceId); // 2. 加载模型 uint32_t modelId; aclmdlLoadFromFile(yolov5s_bs1.om, modelId); // 3. 获取输入输出信息 size_t inputSize aclmdlGetInputSizeByIndex(modelId, 0); size_t outputSize aclmdlGetOutputSizeByIndex(modelId, 0); // 4. 申请设备内存 void *inputBuf, *outputBuf; aclrtMalloc(inputBuf, inputSize, ACL_MEM_MALLOC_NORMAL_ONLY); aclrtMalloc(outputBuf, outputSize, ACL_MEM_MALLOC_NORMAL_ONLY); // 5. 构造输入输出数据集 aclmdlDataset *inputDataset aclmdlCreateDataset(); aclDataBuffer *inputData aclCreateDataBuffer(inputBuf, inputSize); aclmdlAddDatasetBuffer(inputDataset, inputData); aclmdlDataset *outputDataset aclmdlCreateDataset(); aclDataBuffer *outputData aclCreateDataBuffer(outputBuf, outputSize); aclmdlAddDatasetBuffer(outputDataset, outputData); // 6. 假设这里已把处理好的图像数据拷贝到 inputBuf // memcpy(inputBuf, imageData, imageDataSize); // 7. 执行推理 aclmdlExecute(modelId, inputDataset, outputDataset); // 8. 从 outputBuf 解析结果 // 这里是 YOLO 后处理的入口 // 9. 释放资源 aclDestroyDataBuffer(inputData); aclDestroyDataBuffer(outputData); aclmdlDestroyDataset(inputDataset); aclmdlDestroyDataset(outputDataset); aclrtFree(inputBuf); aclrtFree(outputBuf); aclmdlUnload(modelId); aclrtDestroyContext(context); aclrtResetDevice(deviceId); aclFinalize(); return 0; }这段代码比较“骨架化”但核心流程已经很清楚了。真正在生产环境里还要考虑多线程、异步推理、内存复用这些优化点。我后面会专门讲。我喜欢 AscendCL 的一点是它把“模型加载和推理”做成了非常清晰的几个 API不像 CUDA 里还要管 kernel 启动参数、grid 和 block 的配置。对于做应用层开发的我来说这个抽象层级刚刚好不用碰底层的算子调度又能精确控制内存和推理流程。如果你想快速验证模型能不能跑通而不想写一整套 C 代码昇腾的 CANN 工具包里还带了一个推理工具叫msame可以直接加载模型并跑推理msame --model yolov5s_bs1.om --input ./input_data.bin --output ./output它有一个好处就是能直接统计模型推理耗时非常适合做快速 benchmark。我部署初期都是先用msame确认模型和输入格式是否正确再去写正式的推理代码。4. 性能验证与实际调优4.1 吞吐与延迟的数值参考模型跑通之后紧接着的问题就是性能到底怎么样这里我以 YOLOv5s 和 YOLOv8s 为例给出我实际测试的数据供大家参考。需要说明的是性能结果受输入分辨率、模型版本、硬件配置和软件栈版本影响很大以下数字是我在特定环境下的表现不代表极限值模型输入分辨率精度单帧延迟batch1理论吞吐batch32YOLOv5s640x640FP16约 5-8 ms400 FPSYOLOv5s640x640INT8约 3-5 ms600 FPSYOLOv8s640x640FP16约 7-11 ms300 FPSYOLOv8s1280x1280FP16约 25-35 ms80 FPS注意看到 1280x1280 这里输入分辨率提升到 4 倍但推理耗时并没有严格按 4 倍增长因为算力瓶颈和内存带宽的分布不是线性关系。这也说明如果你的场景对检出精度要求高适当提高输入分辨率性能代价是可以接受的。我的建议是生产环境里优先考虑批量推理而不是单帧调优。做视频流检测时把多个视频帧攒成 batch 一起推理吞吐量提升非常明显。4.2 batch、stream、内存碎片化调优在 Atlas 300V 上跑 YOLO有几个调优方向是最直接有效的。第一个方向是 batch size。单帧推理时NPU 的算力利用往往不够充分很多计算单元是闲着等数据的。我实测下来batch 从 1 拉到 8总耗时只增加了 2 倍但处理的数据量是 8 倍单位帧的推理成本大幅下降。如果你做的是批量图片检测或者离线视频分析优先拉大 batch。但 batch 不是越大越好超过 32 之后受内存带宽和 NPU 内部缓存的限制收益会明显递减。第二个方向是 Stream 异步推理。AscendCL 支持创建多个 Stream每个 Stream 可以独立执行推理任务。可以把不同的推理请求分配到不同的 Stream 上配合多线程让 CPU 端的数据预处理、NPU 端的推理、后处理流水线并行起来整体吞吐能再上一个台阶。我简单描述一下做法aclrtStream stream; aclrtCreateStream(stream); aclmdlExecuteAsync(modelId, inputDataset, outputDataset, stream); aclrtSynchronizeStream(stream);用异步接口之后CPU 不用傻等 NPU 算完可以先去做下一帧的预处理。这种“数据流流水线”的设计在视频分析场景里特别实用。第三个方向是内存复用。反复aclrtMalloc和aclrtFree会导致内存碎片长期跑下来可能会出现“明明还有内存却分配失败”的诡异问题。我在长时间跑服务时遇到过几次。解决办法是启动时统一申请多块固定的输入输出内存推理时轮流使用不做频繁的动态分配。4.3 后处理优化的经验YOLO 的推理输出只是一个原始的张量数据还需要经过解码框坐标、阈值过滤、NMS 去重这几个后处理步骤才能真正得到检测结果。很多刚上手昇腾的朋友把注意力都放在模型转换和推理上忽略了后处理优化结果整体 FPS 被后处理拉低不少。以 YOLOv5s 为例ONNX 输出是 (1, 25200, 85)25200 个候选框每个框 85 个值。遍历 25200 个候选框再做 NMS纯 Python 实现在 CPU 上可能要 10 到 20 毫秒比 NPU 推理本身还慢非常离谱。我自己的优化思路有几条第一候选框过滤前置。NMS 之前先用置信度阈值过滤掉绝大多数低分框。比如置信度阈值设为 0.25往往能滤掉 80% 以上的候选框NMS 的计算量就小了很多。第二后处理用手写 C 或者向量化实现。同样的遍历和 NMS 逻辑C 比 Python 快 5 到 10 倍。如果项目的后处理逻辑主要用 Python 写可以试试用 Numpy 做向量化操作也能显著提速。第三尽量用 FP16 的输出做后处理。如果模型跑的是 FP16输出类型是 FP16转换到 FP32 再处理会引入额外开销。处理框架里直接支持 FP16 数组能省掉一次转换。我见过有团队把 NMS 换成 TensorRT 里那种高效的 GPU NMS 实现来加速在 Atlas 300V 上没那么方便因为 CANN 对自研算子支持的门槛稍高。所以我的建议是先检查后处理的耗时占比这是很多情况下被忽略的“隐藏瓶颈”。5. 常见问题与排查心得5.1 驱动与 CANN 版本不匹配这是我部署 Atlas 300V 以来遇到频率最高的一类问题。现象很典型CANN 工具装好了npu-smi info也能看到卡但执行 ATC 转换模型时直接报错说设备不存在或者初始化失败或者是运行推理程序时报ACL_ERROR_RT_PARAM_INVALID。排查方法也不难。先看驱动版本和 CANN 版本是否在兼容列表里。在昇腾社区里能找到官方兼容矩阵装之前一定要核对。我踩过一次坑驱动是老版本 5.1CANN 装的是 7.0两个版本跨度太大接口已经不兼容了所有命令都能执行但全都失败。最后把两个版本统一到同一时期的版本问题立刻消失。判断驱动是否正常还有一个快速命令npu-smi info如果输出里能正常显示卡的温度、算力、内存占用说明驱动基本没问题。5.2 转换报错与算子适配问题ATC 转换是另一个高频报错区。刚开始转 YOLOv5s 时遇到了E10001之类的报错码表明某个算子无法找到对应实现。这类问题的原因很直接ONNX 模型里用到了 CANN 当前版本不支持的算子。排查思路是这样先打开错误日志看具体是哪个算子报错atc --modelyolov5s.onnx --framework5 ... --logdebug从日志里找到算子名比如NonMaxSuppression这种后处理算子在昇腾的离线转换里常常是坑。最简单的处理方案就是让 ONNX 模型不要包含这个算子把后处理挪出来。如果问题出在主干网络里的某个算子那可能要单独查一下昇腾社区是否有对应的超过方案或者考虑更新 CANN 版本。YOLOv8 的转换过程中我遇到的典型问题是某些版本的 ONNX 输出格式变动导致 ATC 解析输出节点时失败。解决办法是导出 ONNX 后先用 Netron 人工确认输出节点再在 ATC 命令里显式指定--out_nodes。5.3 显存占用异常与模型加载失败Atlas 300V 有 24GB 内存但实际开发中我遇到过模型加载失败、提示内存不足的情况而且不是一次性申请超大模型时发生的反而是服务跑了好几天之后突然出现。这类问题八成是内存碎片化或者之前加载的模型没有释放。排查方法是用npu-smi info看内存占用如果内存已经吃满说明有模型实例没有被正常 unload。在写服务端代码时我非常建议在模型加载和释放的地方加上日志记录每次aclmdlLoadFromFile和aclmdlUnload的调用时机。定位到泄漏点之后再检查是否所有异常分支都有释放逻辑。另外一个经验是如果服务需要长时间运行可以定期重启模型实例这种“定时重载”的思路在边缘推理服务里很常见能有效规避内存碎片化积累的问题。另外还有个容易被忽略的问题多进程同时加载同一个模型文件。如果服务是多进程模型每个进程都去加载大模型24GB 内存也可能不够分。这种场景下建议用共享内存或者独立推理服务进程其他进程通过 IPC 调用推理接口避免每个进程都独自持有一份模型副本。6. 写在最后一点个人的实操体会Atlas 300V 24G 这台卡我用下来最大的感受是它不像很多开发板或者专用 AI 芯片那样“玩具化”而是真的能承担生产级推理负载。虽然初期从 CUDA 生态切过来需要一点学习成本但一旦熟悉了 ATC 转换和 AscendCL 接口整个部署链路非常顺畅。尤其是视频流推理场景卡上自带的硬解码能力让整套系统的资源占用和运维复杂度都下降了一个级别。最后分享一个小技巧部署阶段一定不要急着上生产配置。先用msame跑通一个 batch1 的推理确认输入输出数据格式没问题再用 Python 或者 C 写一个单线程版本跑通完整的预处理到后处理链路最后再做多线程、多 Stream、batch 推理的优化。每层都验证通过再往下一层走看起来慢实际却是最快的路子。毕竟模型转换和后处理的坑往往在你把代码堆到一定程度后才会集中爆发到时候定位起来特别痛苦。如果你手头正打算做 YOLO 相关的推理项目Atlas 300V 24G 是一个值得认真考虑的方案。希望这篇文章能帮你把前面的水坑都提前避开直接把精力放在真正的业务逻辑和性能优化上。有部署中遇到的新鲜问题也欢迎留言交流我也在持续积累昇腾生态的实战经验。
返回列表