☰
Atlas 300V部署YOLO全攻略:从模型转换到推理加速的实战指南
2026/9/25 12:15:55 网站建设 项目流程

先讲个有意思的现象:你随便在一个技术群里丢一句“atlas”,能收到五六种完全不同的回复。有人以为你在说Atlas数据库中间件,有人以为你在聊Atlas机器人,搞嵌入式的会问你是不是在说ST的那块开发板,但这两年,越来越多的人问的是同一个东西——华为的Atlas AI计算产品线,尤其是当一句话后面跟了“部署YOLO”“运算加速卡”这种词的时候。我最近就频繁看到有人在问“Atlas 300V 24G是运算加速卡吗”“Atlas部署YOLO怎么搞”,甚至有朋友把Atlas 300V当显卡买回去,插上机才发现驱动、生态、部署流程跟GPU完全是两码事,然后一脸懵地来问我。

这篇东西就是想把这些事一次说清楚。我会先从Atlas 300V 24G这张卡的身份问题讲起,把Atlas整个产品线的命名规律捋一遍,然后重点讲在Atlas设备上跑YOLO的完整流程——不是只丢几个命令,而是把为什么要转模型、为什么推理代码长这样、为什么内存老是不够用这些背后的原因都讲透。适合谁看?手里正好有Atlas卡、打算在昇腾环境上跑目标检测的开发者,以及正在做技术选型、纠结要不要入坑NPU的人。你不需要有华为官方认证的经验,只要懂点Python、用过YOLO,这篇文章能帮你少走一大半弯路。

1. Atlas产品线到底怎么认:一张表理清型号关系

先说结论:Atlas 300V 24G,确实是运算加速卡,但它不是显卡。这个“不是显卡”的表述不是咬文嚼字,而是会直接影响你怎么用这张卡、怎么部署模型、怎么调性能。很多人把它当GPU用,本质上是因为它在物理形态上长得像一块PCIe卡,插在服务器里,有自己的显存,能跑神经网络推理——这些表象都和GPU很像。但从指令集到编程模型,它走的是完全不同的另一套体系。

1.1 Atlas 300V 24G的准确定位

华为的Atlas产品线根据使用场景分成几个大类,不同类之间的差异比你想的大。为了让你一眼看明白,我把它简化成下面这个表:

产品系列典型型号形态核心用途算力特点
Atlas 300系列300I Duo、300V ProPCIe加速卡服务器推理加速主打推理,功耗较低
Atlas 800/900系列800T训练服务器、900 A2整机服务器训练和推理集群多卡互联、高性能
Atlas 200系列200 DK、200I DK开发者套件/模组边缘计算、嵌入式低功耗,适合端侧
Atlas 500系列500 A2、500 Pro智能小站边缘场景整机交付一体化,防护等级高

Atlas 300V 24G属于Atlas 300系列里的推理加速卡,后缀“24G”指的是板上集成了24GB的存储,用于缓存模型权重和中间计算结果。它搭载的是昇腾310P芯片,这颗芯片的设计目标和NVIDIA的A10、T4这类推理卡是同一个生态位,而不是和A100、H100那样的训练卡对标。正因为定位是“推理卡”,它上面没有完整的AI训练流水线,你不能直接拿它跑PyTorch的backward(),也不能把它当成一块大显存的GPU来跑训练。

1.2 为什么“是不是运算加速卡”会让人犯迷糊

这个问题之所以成为热搜,我分析有三个层面的原因:

第一,华为官方物料里对“加速卡”的界定很宽泛。你查Atlas 300V的数据手册,里面写的是“AI加速卡”,再往下看规格,洋洋洒洒列了几百个TOPS的INT8算力,给人的直觉就是它什么AI计算都能干。但实际上,如果没有昇腾的软件栈配合,这张卡插到普通x86服务器上是不能直接参与计算的。

第二,市面上叫“加速卡”的东西太多了。视频编解码有加速卡,网络卸载有加速卡,AI推理也有加速卡。大家默认“运算加速卡”就等于“能跑深度学习的那张卡”,但没想到AI加速卡内部还有推理和训练的区分。Atlas 300V是推理卡,这一点决定了它最擅长的是把已经训练好的模型跑到尽可能高的吞吐量,而不是从零开始训练一个模型。

第三,Atlas 300V的“24G”和GPU的“24G”语义近似但不完全一致。GPU的显存既是计算缓冲也是数据中转站,CPU和GPU之间通过PCIe拷贝数据,显存大小直接影响你能塞多大的batch。Atlas 300V的24G是板载存储,作用同样是放权重和中间特征图,但它的数据通路、内存管理方式跟GPU不是一回事。所以你在GPU上养成的习惯——比如“24G显存就能跑batch size 64的YOLOv5”——在Atlas上是不成立的,实际能跑多少要重新测。

如果一句话总结:Atlas 300V 24G是一张专用于AI推理的PCIe加速卡,它运算能力很强,但和显卡是两种物种,你需要用昇腾的工具链去驱动它。

2. 为什么YOLO部署到Atlas上要重走一遍流程

很多人的第一个疑问是:我的YOLO在GPU上跑得好好的,导出成ONNX,换个设备推理不是分分钟的事吗?理论上是这样,但到了Atlas这里,你把ONNX直接喂给硬件,它是听不懂的。这里面的核心原因是芯片架构的差异,不理解这一层,后面的每一步配置文件、转换报错、性能调优你都只能是照着文档瞎试。

2.1 从GPU到NPU的架构差异

NVIDIA GPU的核心是CUDA Core + Tensor Core,走的指令集是CUDA扩展出的并行计算模型。ATLAS 300V用的昇腾310P NPU,核心是达芬奇架构,里面是AI Core、AI CPU、向量计算单元、矩阵计算单元的组合。这两者的本质区别在于:

  • GPU是通用并行计算设备,它不光能跑神经网络,还能跑CUDA加速的很多通用计算任务,比如数值模拟、图像处理、密码学运算。
  • 昇腾NPU是专用的AI计算设备,它的矩阵计算单元是为神经网络里的卷积、矩阵乘法高度定制的,普通逻辑运算能力很弱,甚至可以说几乎没有。

这就导致了一个关键结论:NPU上不是所有算子都能高效运行,甚至不是所有算子都能运行。GPU上常见的torch.cat、torch.stack、各种tensor.reshape,在GPU上都能找到优化过的实现,但在昇腾NPU上,有些算子不支持,有些算子虽然支持但效率很低,尤其是动态shape相关的算子。这也是为什么YOLO的部署流程里必须经过模型转换和算子调优,而不是直接加载权重。

2.2 模型转换:从ONNX到OM的完整链路

在昇腾平台上,能被NPU直接加载执行的模型格式是**.om**(Offline Model)。你训练得到的PyTorch权重、导出的ONNX模型,都不能直接跑在NPU上,必须经过一个叫做ATC(Ascend Tensor Compiler)的工具做离线转换。整个链路是:

PyTorch权重 (.pth/.pt) ↓ 导出ONNX模型 (.onnx) ↓ ATC工具转换 ↓ 离线模型 (.om) ↓ ACL(Ascend CANN)运行时加载推理

这里有个点你必须提前意识到:ATC转换不是格式翻译,而是重新编译。它会把ONNX里的算子映射到昇腾的算子实现上,然后做计算图优化、算子融合、内存重排,最终生成一份深度定制过的离线模型。这个过程中的任何一步出问题,都会导致转换失败,而失败信息往往不会直接告诉你“你这个算子在昇腾上不支持”,而是报一些看起来莫名其妙的原因,比如某个Tensor的shape对不上、某个attribute的取值非法。调这些报错的过程非常磨人,我后面会专门写一节怎么排查。

2.3 推理框架的选择:ACL还是MindSpore Lite

UTC转换好OM模型之后,你需要一套官方运行时去加载它。昇腾平台上有两套主流的推理方案,很多新手在这里被绕晕:

方案一:直接调ACL(Ascend CANN的推理API,也叫acl)。这是最底层的方式,C++和Python接口都有。你直接调用acl.mdl.load_from_file加载OM模型,然后手动管理输入输出的buffer、自己处理图像的前处理、后处理。优点是完全可控、性能上限高、没有多余框架的隐形成本;缺点是代码量大,你得自己把YOLO的前处理(letterbox、归一化)和后处理(NMS)全部写成普通Python/C++代码,每个环节都要手动管理内存。

方案二:用MindSpore Lite推理框架。它像是一个封装好的推理引擎,你在Python里把OM模型当成一个“黑盒”,调用mindspore_lite的接口跑推理,输入输出是numpy数组,内存管理由框架代劳。优点是代码简洁、快速跑通,适合验证模型转换结果对不对、性能大概什么水平;缺点是你要想压榨极致性能,框架的一些封装反而成为阻碍,而且MindSpore Lite的版本和CANN版本必须严格匹配,错一个版本就会出现奇怪的segment fault。

我的建议是:验证阶段用MindSpore Lite,正式产品里如果追求性能,直接上ACL。这两条路线的代码风格完全不同,不要指望中间切换很轻松,所以选型要提前想明白。

3. 手把手:YOLOv5/v8在Atlas 300V上的完整部署流程

讲完了原理,这一节直接给可复现的部署路径。我拿YOLOv5和YOLOv8分别说,因为这两个是当前最主流的版本,部署细节上略有差异,但整体思路一致。这里假设你手里已经有一张Atlas 300V 24G插在服务器上,系统是Ubuntu 20.04/22.04,CANN和驱动已经装好,昇腾环境能正常识别设备。

3.1 环境准备最容易漏掉的两步

很多人卡在环境准备的第一关,不是驱动装不上,而是版本对不齐。昇腾的软件栈包含三层:驱动(Driver)、固件(Firmware)、CANN工具包。三层必须保证版本兼容,官方文档里列了个兼容性矩阵,一定要先查你再动手。

第二步是确认设备是否被系统正确识别。执行:

npu-smi info

如果你能看到类似下面这行,说明驱动和固件都正常:

+-------+-----------------+------+--------+------+------------+ | NPU | Name | HBM | Health | Power| Temp | +-------+-----------------+------+--------+------+------------+ | 0 | 310P | 24G | OK | 40W | 45C | +-------+-----------------+------+--------+------+------------+

如果这里看不到卡,后面装什么CANN都白搭。这时候查两件事:驱动是否加载(lsmod | grep drv),PCIe设备是否枚举成功(lspci | grep -i ascend)。

接下来设置环境变量。CANN安装完成后,官方脚本在/usr/local/Ascend/ascend-toolkit/set_env.sh,你需要在~/.bashrc里source它。但这里有个很容易踩的坑:如果你在conda虚拟环境里跑Python,这个环境变量必须在启动Python之前就生效。很多人在conda环境里直接跑import acl报找不到库,根源就是环境变量没在这个shell会话里刷新生效。

3.2 YOLOv5的模型导出与转换

以YOLOv5 v6.0以上版本为例,把训练好的PyTorch权重导出为ONNX,官方仓库里已经有现成脚本:

python export.py --weights yolov5s.pt --include onnx --opset 11

这里有几个参数要特别注意:

  • --opset 11:不是越高越好。ONNX算子集版本越高,ATC转换器的兼容性压力越大,实测opset 11到12最稳。
  • --dynamic:不要加。YOLOv5的export.py默认导出的是静态shape的ONNX,如果你加了--dynamic,ATC转换时动态shape的支持会牵扯到dynamic_dims配置,处理起来非常麻烦。第一版先跑通静态shape,再考虑动态shape的优化。
  • --simplify:建议加上。用onnx-simplifier把模型里的冗余算子(比如一些identity、shape相关的算子)清理掉,能让ATC转换更顺利。

导出的ONNX如果输入shape是[1, 3, 640, 640],那ATC转换命令大概是:

atc --model=yolov5s.onnx \ --framework=5 \ --output=yolov5s_bs1 \ --input_shape="images:1,3,640,640" \ --soc_version=Ascend310P3

这里面的参数我解释一下:

  • --framework=5表示输入是ONNX模型。
  • --soc_version=Ascend310P3是Atlas 300V对应的芯片版本。注意,不同批次的Atlas 300V可能对应310P1、310P2、310P3,具体用哪个要用npu-smi info或官方文档确认,填错了转换也能过,但上板加载时会报版本不匹配。
  • --input_shape必须和ONNX的输入名完全一致。YOLOv5导出后的输入名一般是images,YOLOv8可能是images也可能是input,用Netron打开ONNX看一下就知道。

转换成功后会生成yolov5s_bs1.om,这就离能跑通只有一步了。

3.3 YOLOv8的模型转换差异

YOLOv8的导出命令类似:

yolo export model=yolov8s.pt format=onnx opset=11

但YOLOv8导出的ONNX和YOLOv5有一个显著区别,就是它的输出层不包含NMS后处理,而是直接输出[1, 84, 8400]这种shape的原始预测张量(4个框坐标 + 80个类别分数,8400个anchor)。这本身是好事,因为NMS后处理本来就应该放在CPU上做,而不是塞进模型里。但转换时要注意:YOLOv8导出的ONNX可能会有一些ReduceMax、Mul、Add组合出来的算子,ATC转换时偶尔会报不支持。我遇到过的处理方式是先把ONNX用onnx-simplifier简化一遍,如果还不行,就用onnxruntime做一次静态shape的重新导出:

import onnx from onnxsim import simplify model = onnx.load("yolov8s.onnx") model_sim, check = simplify(model, input_shapes={"images": [1, 3, 640, 640]}) onnx.save(model_sim, "yolov8s_sim.onnx")

拿到简化后的ONNX,ATC转换参数和YOLOv5基本一致,只是--input_shape要按实际输入名调整。

3.4 推理代码的两种写法与实测对比

转换完模型后,写推理脚本。我先给一个最简的MindSpore Lite版本,适合快速验证模型能否跑通:

import numpy as np import mindspore_lite as mslite # 加载模型 model = mslite.Model() model.load_from_file("yolov5s_bs1.om", mslite.ModelType.MINDIR_LITE) # 构建输入 input_tensor = mslite.Tensor() input_tensor.set_data(np.random.rand(1, 3, 640, 640).astype(np.float32)) # 推理 inputs = [input_tensor] outputs = model.predict(inputs) # 输出是一个list,每个元素是对应输出头的numpy数组 print(outputs[0].get_data().shape)

这段代码能跑通,说明你的OM模型是好的、环境是通的,整个链路已经没有任何原则性问题。但如果你要做性能测试,或者后面要接到真实业务里,我建议直接用ACL,理由很简单:MindSpore Lite在每次predict的时候都可能做额外的内存分配和数据拷贝,吞吐量会难看很多。ACL版本的核心代码大概是:

import acl # 初始化 acl.init() ret = acl.rt.set_device(0) # 加载模型 model_id, ret = acl.mdl.load_from_file("yolov5s_bs1.om") # 准备输入输出内存 input_desc = acl.mdl.create_tensor_desc_from_model(model_id, 0) output_desc = acl.mdl.create_tensor_desc_from_model(model_id, 1) input_data = acl.util.np_to_ptr(np.random.rand(1, 3, 640, 640).astype(np.float32)) output_data = acl.util.np_to_ptr(np.zeros((1, 84, 8400), dtype=np.float32)) # 推理 ret = acl.mdl.execute(model_id, [input_data], [output_data]) # 把输出拷回numpy output_np = acl.util.ptr_to_np(output_data, (1, 84, 8400), np.float32)

ACL代码看起来繁琐,但它把内存和执行的每一个环节都交到了你手里。实测同一个YOLOv5s模型,在相同的输入和业务逻辑下,ACL版本的吞吐量比MindSpore Lite版本能高出10%~30%,延迟也更稳定。如果你们的业务对性能有硬性要求,多写这几行代码非常值得。

3.5 性能调优的三个可执行方向

模型跑通只是第一步,真正决定你能不能用起来的是性能。Atlas 300V上的性能调优,跟GPU上那套不完全一样,我建议按下面的优先级来:

第一优先:检查model转换时的算子融合情况。ATC转换日志里会输出融合后的算子信息,重点看有没有大量的TransData算子插入。如果有,说明你的模型在某些层的输入输出格式上不匹配NPU内部的数据排列,AT C自动插入了格式转换算子在兜底。这种转换一次两次没关系,如果整个模型到处是TransData,推理性能会大打折扣。处理方式是尽量保持网络结构的规整性,减少reshape、permute、transpose这类算子。

第二优先:调整batch size和AIPP配置。静态batch的模型在推理时,batch越大吞吐量越高,但延迟也会相应增加。你要根据业务场景找平衡点。AIPP(AI Preprocessing)是昇腾的硬件图像预处理单元,可以把图像缩放、归一化、格式转换(比如BGR到RGB)这些操作从CPU挪到专用硬件上做,节省不少时间。在ATC转换时用--insert_op_conf=aipp.cfg来配置,具体写法官方文档有模板,这里不展开。

第三优先:开启多线程/多流推理。当单模型单batch的性能已经到瓶颈,真正的提升空间在“并发”。Atlas 300V支持多流(Stream)并发执行,你可以同时创建多个ACL Stream,每个Stream独立跑一批输入,利用NPU上的多核并行能力。这个方案的难点在于你的业务代码得多路并发地准备数据、提交推理、回收结果,复杂度会上一个台阶,但吞吐量能再翻一倍以上。

4. 部署中避不开的那些坑:精度对不上、内存不足、算子不支持

这一节我专门写踩坑实录。不夸张地说,我第一次在Atlas 300V上跑YOLOv5,从拿到卡到推理结果全绿,花了将近一个星期,最后发现好几个坑都是文档里提过但一句话带过的点。

4.1 推理结果和GPU差距大:先从输入侧找原因

如果你在GPU上用同一张图片测试,用同一份权重在Atlas上推理,结果P5的人头框位置偏了、confidence普遍低,别急着怀疑模型转换。我的排查顺序是:

第一,看前处理是否一致。YOLO的LetterBox处理在GPU上用PyTorch实现,可能在uint8和float32之间的转换、像素值除以255的时机、BGR/RGB通道顺序上都存在细微差异。这些差异在GPU上几乎不影响结果,但在Atlas上因为模型对输入的敏感度不同,会被放大。我建议你在两端统一用完全相同的预处理代码,最好把预处理结果直接存成npy文件,再分别喂给GPU和Atlas,对比模型输入的数值差异。如果np.max(np.abs(input_gpu - input_atlas))超过0.5,那结果不一致就是预处理引起的。

第二,检查NPU上运行的是FP16还是FP32。ATC转换时默认会把模型里的权重转成FP16存储,推理也用FP16计算。FP16的动态范围比FP32小,如果你的模型权重里存在极端的数值分布,FP16计算会出现精度损失,导致检测框偏移。在ATC命令里加上--output_type=FP32可以强制用FP32推理(代价是内存翻倍、速度下降),如果加了之后结果恢复正常,就说明问题出在精度模式上。

第三,检查后处理NMS的置信度阈值。这个看着很蠢,但确实有人踩过。NPU上推理输出的原始预测张量,和GPU上的数值基本一致,但NMS的处理逻辑如果用的是你之前为GPU量身定做的版本,注意一下阈值设置和坐标解码顺序是不是一样。尤其是YOLOv8的输出坐标是相对于640x640输入图的,不是相对于原图的,解码时要先还原到原图坐标系再套用confidence和NMS。

4.2 “内存不足”的报错,常是HBM分配策略和batch的串联问题

Atlas 300V 24G这个24G看着挺大,但实际跑起来很容易报内存不足,原因很反直觉:NPU不是GPU,你在GPU上习惯的“同一个模型能塞多少batch就塞多少batch”的策略,在NPU上不成立。昇腾的HBM不仅要存模型权重和中间激活值,还要存每个Stream的上下文、算子的工作空间、输入输出的缓冲等,内存占用跟模型结构、算子类型强相关。一个小模型的batch从1加到4,内存占用可能不是翻4倍,而是翻8倍,因为某些中间算子的工作空间和batch呈超线性关系。

处理方式有三个切入点:

  • 用npu-smi info看当前NPU的HBM占用情况,确认是模型自己吃掉了大部分显存,还是有别的进程在抢占。
  • 减小batch size跑一轮,观察内存占用随batch的变化曲线,找到这个模型的合理batch上限。
  • 如果必须大batch,考虑换用更小的模型变体,或者用多卡(如果你有不止一张300V)做数据并行。

另外,还有一个特别容易被忽略的点:ACL默认会为每个模型分配数量可观的静态内存池,如果你的业务会频繁加载/卸载模型,内存碎片会越积越多。我见过一个极端案例,模型反复加载五次之后,即使卸载了,HBM也回不到初始状态,最终直接报HBM out of memory。解决办法是在加载模型前显式调用acl.rt.set_memory_allocate_policy,或者在工程里复用同一个模型实例,不要频繁加载卸载。

4.3 ATC转换报算子不支持的排查链路

如果你运气不太好,在ATC转换阶段就遇到不支持的算子报错,别慌,按下面这套思路来排查:

第一步,读懂报错的算子名和位置。ATC的报错信息里一般会带Onnx节点的名字,比如/model.24/m.0/conv/Conv这种,明确告诉你哪个算子在哪个位置挂了。用Netron打开ONNX模型,定位到同名节点,看一下这个算子的具体参数。

第二步,判断算子的作用是否可以替代。昇腾对标准算子支持得比较全,常见的Conv、BatchNorm、Relu、MaxPool都没问题,容易挂的是那些自定义算子或者在PyTorch中被融合进torch.nn.functional的算子。如果你的模型用了torchvision.ops.nms、torchvision.ops.roi_align这些,基本可以确定要换成自定义CPU实现,把它们从模型里拆出来放到后处理代码里。

第三步,用算子替代的方式解决问题。举个例子,YOLOv8用到的一个可能出问题的算子是GridSample(在upsample相关的模块里)。这不是YOLO必需的算子,而是我见过有人把自定义的注意力模块导进ONNX之后踩到的坑。如果遇到这种非标准算子,思路不是去修改ATC配置,而是改模型结构,用等价的算子组合替代,比如GridSample可以用affine_grid+grid_sample的组合绕开,实在绕不开就把这个模块挪到后处理里用CPU实现。这是最不受罪的路。

第四步,如果模型结构没法改,考虑分块转换。把一个大模型按结构拆成几段,分别转成OM,然后在推理代码里按顺序依次跑,中间用内存buffer把特征图传给下一段。这个方案会增加不少推理延迟和代码复杂度,但对于某些必须跑通的模型来说,是一个可靠的兜底方案。

5. Atlas部署YOLO的后续扩展思路

说完了整个部署流程和排错经验,再分享几个我实际使用中觉得可以往下走的方向,你可以根据自己手头的业务决定要不要继续深入。

第一个方向是动静结合的推理路径。我前面建议第一版用静态shape先跑通,但实际业务里的输入图像尺寸往往是不固定的。Atlas 300V支持动态shape,官方叫Dynamic Shape模式,它要求ATC转换时指定多个可能的shape组合,推理时根据实际输入匹配最接近的shape。这个功能在CANN 6.0以后做得比较成熟了,性能损失也可以接受。我建议在静态模型跑通后,再用动态shape的方式重新转换一版,专门应对业务里参差不齐的输入尺寸。

第二个方向是把AIPP彻底用起来。我开始讲AIPP只是提了一句,实际上AIPP的能力远不止缩放和归一化,它还能做色域转换、填充(padding)、裁剪(crop)。如果你的取流链路是摄像头直接出的视频帧,AIPP可以把YUV到RGB的转换也下沉到硬件里,CPU占用能再降一块。这个优化在边缘服务器上尤其划算,因为边缘场景CPU往往很紧张。

第三个方向是模型量化。Atlas 300V的INT8算力是FP16的好几倍,如果业务对精度损失有容忍度,可以考虑用昇腾的AMCT(Ascend Model Compression Toolkit)做量化,把模型压到INT8,吞吐量能再上一个台阶。但量化是个系统工程,需要准备校准数据集、做精度对比、调量化敏感层,不是简单加一个flag就能完成的。我建议等FP16版本的部署链路完全稳定后,再把量化当成二期优化来做。

另外,如果你的业务不是单纯的目标检测,而是要做跟踪、计数、OCR这些复合任务,Atlas 300V同样能跑,但要注意多个模型之间的串并行调度。我见过有人在单卡上同时跑检测模型和ReID模型,结果两张模型的推理延迟互相拖累,后来把两个模型放在两个独立的ACL Stream里并行执行,问题就解决了。这里的核心思想是:Atlas 300V的多核心能力,不只体现在单模型的batch并发上,也体现在多模型的流并行上,这块能做很多文章。

最后再分享一个小技巧,也是我踩过几次坑之后总结出来的:在Atlas上做任何部署实验,先把日志级别调到INFO。昇腾的日志默认输出量太少,很多警告(比如算子精度降级、内存策略调整)都被静默吞掉了,调高日志级别之后,很多“看起来摸不着头脑”的报错都能在日志里找到端到端的上下文。日志级别调整在/usr/local/Ascend/ascend-toolkit/latest/...下的配置文件里,设置方法官方文档有写,这里不赘述了。

Atlas这条技术栈不像GPU生态那么“开箱即用”,但好处是它把推理场景的很多事做得很专,一旦你把流程走通,性能和稳定性都是能打的。希望这篇东西能帮你少走点弯路,把这卡真正用起来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询