2. 硬件认知:ATLAS 300V 24G到底是一张什么卡
ATLAS 300V 24G是华为昇腾系列面向边缘推理场景推出的一款AI加速卡,核心芯片为昇腾310P系列处理器。很多人第一次拿到这张卡,会下意识地把它和GPU放在一起对比,比如“它是不是对标RTX 4090”“能不能跑训练任务”,这个认知需要先纠正一下。
昇腾310P这颗芯片从设计之初就不是为训练准备的。它主打的是推理场景,也就是模型训练完成后,用训练好的权重去做实际业务预测(比如检测图片中有没有行人、识别工业缺陷)。这和训练卡的工作模式有本质区别:训练是海量数据反反复复前向传播加反向传播,算力密集且对精度极其敏感;推理则是用固定好的模型参数做一次前向计算,更看重延迟、吞吐量、单位功耗下的计算效率。ATLAS 300V 24G在这条赛道上做了很多针对性优化,包括内置的AI Core数量、数据缓存结构、以及配套的推理加速工具链(ATC模型转换器、AscendCL推理接口等)。
再说硬件规格。ATLAS 300V 24G带24GB显存(昇腾的文档里通常叫“存储空间”或“DDR”),这在推理卡里已经属于大显存档位了。如果你部署的是YOLOv8m、YOLOv8l这类中等体量的模型,单张卡放个几十路视频流任务都没有问题。它的功耗大约在72W左右,散热方式是风冷被动散热,也就是说它自己不带风扇,需要依赖服务器机箱内的系统风扇照顾散热。这个点在实际部署时很关键,后面我会专门展开讲。
从接口上看,这张卡是标准PCIe卡,支持PCIe 4.0 x16(也兼容x8链路),适合插在主流的x86服务器上,也支持部分ARM架构服务器(如鲲鹏平台)。如果是边缘小盒子,昇腾也有内置310P芯片的整机产品,原理和插卡是相通的。
一句话总结定位:ATLAS 300V 24G是一张为“模型部署上线”而生的推理加速卡,它的价值不在于把模型训出来,而在于把模型跑得又快又省电。所以如果你手头已经有训练好的YOLO权重,想找一个高性价比的推理加速方案,这张卡非常合适;如果你指望用它从零开始训练一个模型,那建议还是租云GPU或者买训练卡。
3. 为什么YOLO部署优先选昇腾而不是GPU
这是很多初接触昇腾的工程师会问的问题。明明CUDA生态那么成熟,PyTorch对GPU支持得那么好,为什么还要折腾一个相对小众的昇腾工具链?
我个人的观点是:在推理场景里,昇腾在某些维度上比GPU更“能打”,尤其是在边缘部署和成本敏感的项目中。
第一个维是能耗比。以ATLAS 300V 24G为例,整卡功耗约72W,而一张主流推理用GPU(比如RTX 3060,注意消费级卡不在数据中心允许范围内,这里只是做能效对比参考)的功耗大多在170W以上。24小时不间断跑视频分析业务的场景下,电费差距非常可观。项目方如果要做几十上百个点位的大规模部署,昇腾在运维成本和电力预算上的优势会被放得很大。
第二个维度是性价比。昇腾的推理卡在同等算力区间,采购价格通常比同性能的GPU推理卡更低(当然这两年GPU市场波动大,这个优势时有时无,具体得看采购渠道和批量)。再加上推理场景不需要GPU的通用计算能力(CUDA core、Tensor Core这些),昇腾把算力更集中地用在AI前向计算上,单位成本的有效算力反而更高。
第三个维度是配套工具链。昇腾提供了从模型转换到推理部署的完整闭环:PyTorch模型先导出ONNX,再通过ATC工具转换成昇腾的OM格式,最后用AscendCL Python/C++接口加载OM模型执行推理。这套链路虽然前期学习成本略高,但一旦跑通,稳定性相当好——毕竟是面向工业场景设计的,不是实验室玩具。
当然,昇腾不是没有短板。最大的痛点就是生态不如CUDA丰富,社区资料少,遇到问题能搜到的解决方案有限。此外,昇腾对PyTorch框架的原生算子支持还在持续完善,个别模型在转换时可能需要手工改算子或做算子映射。所以我的建议是:如果你的项目是纯训练方向,无脑选GPU;如果是推理部署方向,且模型以常见的CNN目标检测模型(YOLO系列)为主,昇腾完全值得纳入评估。
4. 部署前必须搞懂的软件栈与版本配套
昇腾的软件栈初次接触会让人有点懵,因为名词太多了:CANN、Ascend Driver、Firmware、Toolkit、Kernel、AscendCL、pyACL…… 我这里用最直白的方式梳理一遍。
昇腾软件栈分成下面几层:
- Driver(驱动):最底层,负责操作系统与硬件之间的通信。没有驱动,系统根本识别不到这张卡。
- Firmware(固件):芯片内部的固化程序,负责芯片启动、电源管理、算力调度等底层逻辑。
- CANN(华为昇腾异构计算架构):相当于CUDA在NVIDIA体系中的地位,是基于昇腾硬件的高层软件栈。CANN里包含了算子库(AscendCL算子)、图编译引擎(GE)、运行时(Runtime)等核心组件。
- ATC工具:CANN套件里的模型转换工具,负责把ONNX/TensorFlow/Caffe模型转换成昇腾的OM离线模型。
- AscendCL(Ascend Computing Language):面向开发者的编程接口,类似CUDA Runtime API。Python环境下也提供了
aclruntime或pyACL接口。
在实际部署时,最关键的注意事项是版本匹配。昇腾的驱动、固件、CANN三者的版本必须严格配套,否则轻则功能异常,重则直接无法运行。华为官方会针对不同型号的卡发布配套的版本组合建议,但从实际操作来看,最稳妥的办法是:安装完驱动后,通过npu-smi info命令查看固件版本,然后拿着这个版本号去昇腾社区找对应的CANN版本下载。社区一般会提供“驱动-固件-CANN版本配套表”,严格按照表格来。
下面是我在一次部署中记录的版本组合,大家可以参考(当然实际以官方最新配套表为准):
| 组件 | 版本 |
|---|---|
| 操作系统 | Ubuntu 20.04.6 LTS |
| 内核 | Linux 5.4.0-150-generic |
| Driver | 24.1.rc1(Atlas 300V 24G专用包) |
| Firmware | 24.1.rc1配套版本 |
| CANN | 8.0.RC1(社区版) |
| Python | 3.8 |
| PyTorch | 2.1.0(仅用于模型导出ONNX) |
需要特别提醒的是,很多部署问题不是配置不对,而是操作系统内核版本与驱动不兼容。Ubuntu 20.04的内核版本如果在5.15以上,老版本的驱动很可能装不上。碰到这种情况:要么让昇腾官方驱动适配新内核,要么直接换成官方文档里明确支持的OS版本,别浪费时间硬刚。
5. YOLO模型在昇腾上的部署实操全流程
现在进入正题:把YOLOv8(以YOLOv8s为例)的PyTorch模型部署到ATLAS 300V 24G上的完整步骤。整个流程可以拆成四步:环境准备、模型转换、推理代码编写、性能验证。
5.1 环境准备
首先确认硬件被系统识别。安装完驱动后执行:
npu-smi info如果能看到类似下面的输出,说明驱动正常:
+-----------------------------------------------------------------------------+ | npu-smi 24.1.rc1 Version: 24.1.rc1 | +-------------------------------+-----------------+----------------------------+ | NPU Name | Health | Power | | 0 300V 24G | OK | 72W | +-------------------------------+-----------------+----------------------------+同时确认CANN环境变量已经加载。通常需要在/etc/profile或~/.bashrc里追加:
source /usr/local/Ascend/ascend-toolkit/set_env.sh这一步不能省,否则后面调用ATC工具、AscendCL库都会报找不到模块的错误。
5.2 导出ONNX模型
YOLOv8代码库基于Ultralytics,导出ONNX非常简单:
yolo export model=yolov8s.pt format=onnx opset=11这里有两个注意点:
第一,opset版本建议用11。昇腾的ATC工具对opset 11的支持最稳定,opset 13以上个别算子(比如部分版本的Einsum、Multinomial)可能会抖动或需要手工映射。虽然新版CANN逐步支持更高opset,但为了少踩坑,我习惯固定用11。
第二,导出ONNX后,如果要对模型做AIPP(AI Preprocessing,昇腾的前处理加速特性),需要把模型输入尺寸固定下来。YOLOv8的默认输入是1x3x640x640,这个尺寸就很好,不用改。
导出完成后,可以用onnxruntime在CPU上先跑一遍,确认模型本身没问题:
import onnxruntime as ort import numpy as np session = ort.InferenceSession('yolov8s.onnx', providers=['CPUExecutionProvider']) input_name = session.get_inputs()[0].name outputs = session.run(None, {input_name: np.random.rand(1, 3, 640, 640).astype(np.float32)}) print([o.shape for o in outputs])这一步是排查“模型本身问题”和“昇腾转换问题”的分界线。
5.3 ATC工具转换OM模型
ONNX模型转OM格式,需要用到ATC工具。这一步是昇腾部署里最核心也最讲究的一步。
下面是一条最基础的转换命令:
atc --model=yolov8s.onnx \ --framework=5 \ --output=yolov8s_bs1 \ --input_shape="images:1,3,640,640" \ --soc_version=Ascend310P3 \ --insert_op_conf=aipp.cfg \ --output_type=FP32参数解读:
--framework=5:固定值,表示输入模型为ONNX格式。--output:输出OM文件前缀。--input_shape:固定输入尺寸。这里填的是images:1,3,640,640,注意images是ONNX模型里输入节点的实际名字,需要先通过onnx.load查看确认。YOLOv8默认的输入名就是images。--soc_version:指定芯片型号。ATLAS 300V 24G对应的是Ascend310P3,这个不能填错,填错会出现算子不支持或者精度异常。--insert_op_conf:AIPP配置文件路径。这个可以后置优化时再用,首次转换可以先不加。--output_type:输出数据类型,默认FP32即可。
转换过程会有大量日志输出,看到[INFO] ATC run success就代表转换成功。输出的OM文件目录下同时会生成一个*.json文件,记录了模型输入输出信息,后面写代码时要看。
5.4 AIPP配置详解
AIPP是昇腾特有的“预处理下沉”功能,可以把图像缩放、减均值、除方差等预处理操作从CPU/GPU端搬到AI Core上执行,从而减少主机侧的计算和数据拷贝开销。对于视频流场景,这个优化非常可观。
一个典型的AIPP配置如下:
aipp_op { aipp_mode: static input_format: RGB888_U8 mean_chn_0: 123.675 mean_chn_1: 116.28 mean_chn_2: 103.53 min_chn_0: 0.0 min_chn_1: 0.0 min_chn_2: 0.0 var_reci_chn_0: 0.0171247538316637 var_reci_chn_1: 0.0175070028011204 var_reci_chn_2: 0.0174291938997821 crop_params { crop_w: 640 crop_h: 640 } }这里的mean和var_reci数值取自YOLOv8官方训练时的归一化参数(ImageNet数据集的标准统计值)。也就是说,JPG图片直接以RGB888_U8格式喂给模型,AIPP在芯片内部完成像素归一化,这个环节就不再需要额外调用OpenCV或者NumPy做预处理了。
把AIPP配置保存为aipp.cfg,重新执行ATC转换:
atc --model=yolov8s.onnx \ --framework=5 \ --output=yolov8s_bs1 \ --input_shape="images:1,3,640,640" \ --soc_version=Ascend310P3 \ --insert_op_conf=aipp.cfg \ --output_type=FP32注意:一旦使用AIPP,输入到模型的原始数据就变成了待预处理的图像(比如HWC布局的RGB888),而不是已经归一化好的浮点张量,这个认知切换非常重要。
5.5 推理代码实现
接下来用Python写一个最小可运行的推理脚本。昇腾提供了pyACL(即aclruntime)接口,但我个人更推荐用AscendCL的Python绑定(from acl import ...),这个API设计得更接近C接口,出错时能直接对应到CANN的报错文档。
下面是一个完整的单张图片推理示例:
import numpy as np from PIL import Image import acl # 初始化 acl.init() ret = acl.rt.set_device(0) device_id = 0 # 加载模型 model_path = b"./yolov8s_bs1.om" model_id = 1 ret = acl.mdl.load_from_file(model_path, model_id) # 获取模型输入输出信息 input_desc = acl.mdl.create_desc() output_desc = acl.mdl.create_desc() acl.mdl.get_input_desc(model_id, 0, input_desc) acl.mdl.get_output_desc(model_id, 0, output_desc) input_size = acl.mdl.get_desc_size(input_desc) output_size = acl.mdl.get_desc_size(output_desc) # 准备输入输出内存 input_data = np.zeros((1, 3, 640, 640), dtype=np.uint8) _, input_mem = acl.rt.malloc(input_size, 2) _, output_mem = acl.rt.malloc(output_size, 2) # 读取并缩放图片(这里以一张jpg为例) img = Image.open("test.jpg").convert("RGB") img = img.resize((640, 640)) img_np = np.array(img) # shape: (640, 640, 3), dtype=uint8, 布局为RGB # 将HWC转成CHW(AIPP模式下可以直接传HWC,这里为了演示通用流程做转换) img_np = img_np.transpose(2, 0, 1).copy() input_data[0] = img_np # 数据拷贝到设备 acl.rt.memcpy(input_mem, input_size, input_data.flatten().tobytes(), input_data.nbytes, 1) # 执行推理 ret = acl.mdl.execute(model_id, input_mem, input_size, output_mem, output_size) # 获取输出 output_arr = np.zeros(output_size, dtype=np.uint8) acl.rt.memcpy(output_arr.tobytes(), output_size, output_mem, output_size, 2) # 解析输出(YOLOv8输出格式为 [1, 84, 8400],需转置后做后处理) # 释放资源 acl.rt.free(input_mem) acl.rt.free(output_mem) acl.mdl.unload(model_id) acl.rt.reset_device(device_id) acl.finalize()这个脚本是极简版本,核心目的是验证OM模型的加载和执行链路是否通畅。注意几个细节:
acl.rt.memcpy的第4个参数是内存拷贝方向的枚举值,1表示Host到Device,2表示Device到Host。- 输入数据的dtype是
uint8不是float32(因为用了AIPP,数据不做归一化处理)。 acl.mdl.execute是同步接口,执行完就返回结果。如果要做异步推理,需要自己管理Stream和Event,异步接口在视频流场景收益明显。
关于YOLOv8输出的后处理:YOLOv8模型的输出形状是[1, 84, 8400],其中84表示4个边界框坐标(xywh)+ 80个类别置信度,8400是不同尺度特征图上的候选框总数。解析时需要:
output_arr = output_arr.reshape(1, 84, 8400) pred = output_arr[0].T # shape: (8400, 84) boxes = pred[:, :4] scores = pred[:, 4:]后续就是常规的置信度过滤 + NMS(非极大值抑制)。如果想提升性能,可以把NMS也放到设备端执行(用MindSpore实现),但对大部分场景来说,在CPU上用OpenCV的NMS已经够用了,40路以内的视频流不会成为瓶颈。
5.6 动态Batch与静态Batch的取舍
ATC转换时,--input_shape可以设置动态维度,比如:
--input_shape="images:-1,3,640,640" --dynamic_dims="1;4;8;16"这样模型就支持1/4/8/16这几种batch尺寸动态切换。动态Batch的优势是在客户端请求数量波动时能够按需分配算力,不浪费显存和算力。缺点是需要把每种batch对应的输入输出内存提前申请好,且动态切换时有一定额外开销。
从我实测的经验看,如果是固定路数的视频流分析(比如准时处理8路摄像头),直接用静态Batch 4或8的模型反而更稳,延迟更低。如果是API化调用(用户请求量不可控),动态Batch更划算。我个人的推荐是:商用推理服务优先做动态Batch + 队列调度,边缘单点固定输入优先静态模型,不要盲目追求“高 Batch”,因为显存占用和推理延迟不一定呈线性关系,有时候Batch翻倍但算子并行度没跟上,延迟反而增加。
6. 性能优化:把ATLAS 300V 24G榨干的几个实操
模型跑通了,接下来要做的是性能调优。这里分享几个我在真实项目中验证过的优化思路和数据。
6.1 多路视频流并发设计
ATLAS 300V 24G做大路数视频分析时,单张卡能跑到多少路,取决于模型大小和输入分辨率。以YOLOv8s、640x640输入为例,我实测的稳定推理吞吐量大约在120~180 FPS之间(单模型实例、静态Batch 1,视环境温度和处理器负载浮动)。如果每路视频按10 FPS的分析频率计算,一张卡能支撑12~18路视频流实时分析。如果要叠加其他模型(比如人脸检测+目标检测同时跑),需要根据模型数量动态分配算力。
多路视频流的部署架构建议采用“消费者-生产者”模式:主进程从摄像头拉流,解码缩放后放进队列;NPU推理线程从队列中取图,拼成Batch后送入模型推理。配合动态Batch,实测可以将卡的有效算力利用到90%以上。
6.2 AIPP一定是首选项
我见过很多从CUDA转过来的工程师,习惯在主机侧用OpenCV做缩放、归一化、通道转换,然后把Float32的张量传到设备端。这种思路在GPU上没问题,但在昇腾上会造成CPU占用率高且PCIe传输量大。我在一个项目里做过对比:
| 处理方式 | 单帧预处理时间(ms) | CPU占用率(8线程场景) |
|---|---|---|
| 主机侧OpenCV + NumPy归一化 | 8~12 | 65% |
| AIPP下沉 | 3~5 | 20% |
在8路视频流的场景里,把预处理下沉到AIPP后,CPU占用率大幅下降,整个服务的稳定性提升非常明显。所以建议一开始就规划好AIPP配置,把Resize、Crop、减均值、除方差全部交给芯片完成。
6.3 小模型与大Batch的权衡
如果目标场景不需要高精度(比如只需要人形检测,不需要分类),可以考虑把YOLOv8s替换成YOLOv8n,或者用蒸馏后的定制模型。模型参数量减少后,单帧推理时间从12ms左右降低到7ms左右,吞吐量提升明显。这时候可以适当增大Batch,比如Batch 4或Batch 8,让AI Core同时处理多张图,缩短平均每张图的计算时间。
但有个坑需要提醒:Batch过大时,输出后处理(NMS)会成为新瓶颈。YOLO v8输出8400个候选框,Batch 8就是67200个候选框,主机侧如果用纯Python做NMS,耗时可能比模型推理还长。建议用C++扩充NMS逻辑,或者用torchvision.ops.nms的C++加速实现(通过PyTorch调用)。我在项目里实测过,Python原生循环NMS处理67200个框大约需要150ms,不改的话直接拖垮整体性能。
6.4 使用Profiling工具定位瓶颈
昇腾的CANN工具链里有一个Profiling工具,可以输出算子级别的执行耗时。用法:
msprof --application="./your_app" --output="./prof_data"生成的profiling报告会详细列出每个算子的耗时、AI Core利用率、内存拷贝时间等。我在调优时发现了很多意想不到的瓶颈,比如某个Transpose算子因为数据布局不对导致耗时占了总耗时的15%,后来通过修改AIPP配置里的input_format(改成RGB888_U8+ 内部转NCHW),直接把这个算子消除了。
建议性能调优的顺序是:先用AIPP把预处理尽可能下沉,再用Profiling看哪个算子拖后腿,然后针对性优化模型结构或数据布局,最后才考虑换更大Batch。不要一开始就无脑调Batch,那样很容易事倍功半。
7. 部署过程中最常见的坑与排查实录
这部分是整篇文章里我认为最有价值的部分。以下问题我全部在真实环境中遇到并解决过,按出现频率排序。
7.1 驱动安装成功但npu-smi info看不到卡
这是最常见的首装问题。排查步骤:
第一步,确认内核版本。昇腾驱动对内核版本非常挑剔,某些新内核版本(比如Ubuntu 22.04的5.15内核)在安装时可能提示成功,但模块无法加载。查看方法:
uname -r第二步,确认驱动模块被加载:
lsmod | grep drv_pcie如果没有输出,手动加载:
modprobe drv_pcie第三步,查看驱动日志。昇腾驱动装完后会在/var/log/npu-smi/和/var/log/ascend/下产生日志文件,重点看host_os_info.log和device_info.log。很多情况下日志里会直接说明“FW version mismatch”或者“No device found”。
我自己遇到过一种情况:驱动和固件版本有一个小版本不一致(固件是24.0.rc1,驱动是24.1.rc1),导致系统反复重启设备。解决办法是重新刷固件,保持驱动和固件版本完全一致。在昇腾生态里,驱动和固件配套的优先级高于一切,宁可都老一个版本,也不要一个激进一个保守。
7.2 ATC转换时报算子不支持
如果模型里含有昇腾不支持的算子,ATC会在转换阶段报错,给出类似[ERROR] Unsupported op: XXX的信息。
常见解决方案:
- 升级CANN版本。新版CANN会持续支持更多算子,这是最省事的路径。
- 设置算子精度为FP16。有些算子仅在FP16下优化,FP32下不支持,可以通过
--precision_mode=allow_mix_precision来允许混合精度。 - 手工替换算子。比如某些模型里的
Einsum算子,昇腾的支持有时不完善,可以手动把它拆成MatMul和Transpose的等价组合,再导出ONNX。 - 算子映射。CANN提供了
--op_type_map参数,可以将一个算子映射为另一个等价算子。
YOLO系列模型相对“友好”,主要算子都是Conv、BN、SiLU、Concat、Mul、Add这些基础算子,昇腾支持得很完善。如果用的是比较冷门的检测模型(比如某些基于Transformer的DETR变体),算子兼容性要格外小心,建议做好“动手改模型”的预案。
7.3 推理结果全为0或者大量漏检
这个问题的根本原因绝大多数是输入数据与模型期望不一致。
比如:模型训练时是BGR输入,但你用PIL加载RGB图片直接喂给AIPP;或者模型期望FP32归一化输入,但你在AIPP里配置成U8输入;又或者图片没有正确缩放,导致输入分辨率不匹配。
排查方式很简单:先用一张已知结果的标准图片,在CPU上用ONNX Runtime验证一次,拿到基准输出结果。然后用昇腾推理,对比两边的输出差异。如果CPU端输出正常、NPU端输出全0,问题基本锁定在数据预处理环节。在我接触的案例里,至少有一半的人走一趟这个对比流程就能找出问题。
另外还有一个常见错误:使用了AIPP但输入数据没有按RGB888_U8的排列方式塞进内存。AIPP模式下,输入数据的layout不能随意定,必须是NHWC(即HWC),否则内部处理会解析错位。这一点在官方文档里其实有说明,但容易忽略。
7.4 性能远低于预期
如果推理延迟是理论值的两倍以上,先不要急着怀疑硬件缩水,大概率是以下几个方面之一:
- 模型没有开启AIPP,主机测CPU预处理占了大量时间。
- 模型是动态Shape,每次推理都触发Shape推导和优化(昇腾对动态Shape的支持不如静态Shape成熟,动态Shape推理耗时可能翻倍)。
- 没有使用昇腾的异步执行接口
acl.mdl.execute_async,同步执行会阻塞调用线程,导致无法流水线化。 - 使用了错误的
soc_version型号(比如把310P改成310P1),导致算子调度策略不匹配。
我的建议是:性能不达标时,第一时间用msprof采集数据,先看“NPU计算时间 vs 数据拷贝时间 vs CPU预处理时间”三者的占比,哪个高就优化哪个,不要瞎猜。
7.5 显存(存储空间)不够怎么办
ATLAS 300V 24G对绝大多数部署场景来说已经非常充裕,但如果你同时加载了好几个OM模型(例如多路视频流配合多个模型使用),可能会看到类似[ERROR] mem alloc failed的报错。
解决办法:
- 减少同一个卡上同时加载的模型数量,用模型切换代替多模型常驻。
- 用
acl.mdl.set_optimization_level或者ATC的--buffer_optimize参数,让编译器帮忙优化中间缓存占用。 - 检查是否有模型加载后没有释放,比如连续加载同名的OM文件导致内存泄漏。昇腾的模型句柄一旦加载,就必须在
acl.mdl.unload后才能真正释放,否则占用会累积。
8. 写在最后:一点个人使用心得
从第一次接触ATLAS 300V 24G到现在,我踩过不少坑,也摸清了它的一些脾气。说实话,这张卡不是那种“开箱即用”的产品,前期的学习成本远比用GPU高。但一旦把软件栈理清、把工具链跑通,它的稳定性、性价比和功耗表现都相当亮眼。对做AI落地项目的团队来说,昇腾方案值得认真评估,不要因为工具链陌生就直接放弃——尤其在需要大规模部署、长期跑7x24小时服务的场景里,昇腾的TCO优势是实实在在的。
如果你正准备在ATLAS 300V 24G上部署YOLO模型,我最后想叮嘱三件事:第一,一定先用官方配套表核对驱动、固件、CANN版本,不要用“最新版”;第二,模型部署的第一步就是做AIPP配置,不要嫌麻烦;第三,遇到问题先把日志翻出来看,昇腾的日志体系虽然繁杂,但信息量比论坛提问靠谱得多。祝各位部署顺利,少踩坑。