AI推理加速卡的测试与迁移:从Atlas到下一代硬件的工程方法
上周帮朋友迁移一个推理服务,翻出两年前写的 Atlas 300I Duo 测试笔记,一边看一边有点感慨:当时那个型号,在官网首页已经看不到主推位置了。后来在一个技术讨论里看到一句“RIP:只活了292天的Atlas”,讲某个具体型号从正式发版到被新一代替代,前后只撑了差不多十个月。这个数字我没有去核实,也不准备当作事实来讨论。但那种感觉我完全能理解:在 AI 加速卡这个赛道里,一款硬件十几二十个月就更新,已经接近常态。
这篇文章不想给任何厂商写悼词,也不想争论某一个型号到底合格不合格。我想聊的是另一件事:当硬件型号高速更替时,真正让人焦虑的不是产品退场,而是你的工作流会不会跟着一起报废。围绕一块卡建立的那些环境配置、模型转换步骤、性能测试方法、踩坑记录,到底是绑定在某个具体型号上,还是能沉淀成可以迁移的能力,这才是关键。
今天就把我过去测试 Atlas 300I Duo 这类推理加速卡时的一些经验整理出来,也顺便聊一聊:面对一张新卡,工程师应该用什么样的顺序去验证、测试、调优和做长期维护。
1. 先搞清楚这张卡到底解决哪类问题
1.1 推理卡和训练卡不是一种玩法
Atlas 300I Duo 这个名字,按公开定位来看,更接近一块推理加速卡,而不是用来从头训练大模型的训练卡。两者的分工完全不同。训练卡通常追求高算力、高显存带宽和大容量显存,跑的是梯度更新、分布式训练这类重负载;推理卡更关注把已经训练好的模型稳定、低延迟、低成本地跑起来,常见于在线识别、OCR、图像分类、边缘计算等场景。
所以拿到这样一张卡,第一反不应该是拿它和训练卡跑分对比,而是先问一个问题:我要承接的是什么样的线上推理负载?
对推理卡来说,更关键的指标通常是:
- 单路延迟,也就是一个请求从进来到返回结果花多少毫秒。
- 吞吐量,单位时间内能处理多少样本。
- 批量推理时的稳定性,batch 增大后延迟和资源占用是否失控。
- 整卡功耗和散热表现,尤其是在边缘或机架密集部署时。
- 对已有模型和推理框架的兼容程度,这决定了迁移成本。
为了更直观,可以简单对比一下训练卡和推理卡的关注点差异:
| 维度 | 训练卡 | 推理卡 |
|---|---|---|
| 核心用途 | 模型迭代、分布式训练 | 已训练模型的在线或批量推理 |
| 关键指标 | 峰值算力、显存带宽、扩展性 | 延迟、吞吐、稳定性、功耗 |
| 典型负载 | 长时间高占用训练任务 | 服务化请求、定时批量推理 |
| 资源管理方式 | 作业调度、集群排队 | 服务化部署、监控告警 |
这个划分当然不是绝对的,也有些卡同时兼顾训练和推理。但至少在看一张推理卡时,不应完全按照训练卡的思路去测,否则很容易被“算力数字”带偏,忽略掉实际业务最关心的延迟和稳定性。
1.2 为什么加速卡的型号寿命越来越短
过去几年,模型规模在涨,推理请求对算力和内存带宽的要求也在涨。供应链这边,芯片迭代、制造工艺改进、软件栈升级,都会推动新卡更快出来。于是你会看到:今天还在用的型号,明天可能就被下一代定位更准的型号替代。
这不是哪一家厂商的问题,是行业节奏问题。对使用者来说,新卡出来通常意味着更好的能效比和更高的吞吐,但同时也意味着新的驱动、新的算子库、新的模型转换流程。如果你只是做一次短期 POC,影响不大;如果你打算引入一张卡并且在生产环境维护两三年,那么版本管理和迁移路径就是一开始就要想清楚的事。
很多团队踩坑,不是因为卡不好,而是因为一开始就把“会测一块卡”等同于“会做推理系统”。单卡跑通一个模型,离真正可用的系统还差得很远。
2. 从零到能跑:一次Atlas卡的最小验证流程
2.1 安装环节最该做的是版本对照
先说结论:首次验证,请一定从最小但完整的路径开始。最小,指的是模型小、数据小、流程短;完整,指的是从环境安装、设备检测、模型转换到推理输出,全链路都走通,而不是只跑完一个官方示例就结束。
Atlas 这类算力卡通常依赖完整的软件栈,常见组件包括驱动、固件,以及类似 CANN 的异构计算架构,再往上还有推理引擎或深度学习框架的适配层。很多人一看安装包很多,就会忍不住“都装最新的”。实际上,最先要做的不是安装,而是版本兼容性确认。
需要核对的东西大致有这些:
- 服务器操作系统版本和内核版本。
- 驱动版本和固件版本。
- CANN 版本。
- 推理引擎或深度学习框架版本。
- 所选模型转换工具对应的版本。
不要混用不同来源的组件。曾经遇到过几次“NPU 始终识别不到”的情况,最后定位下来,都是驱动、固件和 CANN 版本三者不在同一兼容组合里。这类问题之所以难排查,是因为它不报业务错误,只是设备列表里少一张卡,或者推理脚本直接报初始化失败。
所以实际操作时,我一般会先进入官方文档找到对应型号的软件安装指南,只安装与当前系统匹配的版本,然后把最终确定的一组版本号记录在测试目录里。这是整个测试流程里成本最低,但收益最高的一个动作。
2.2 最小验证路径:从官方样例开始
环境装完之后,第一步是确认硬件真的被识别。在华为 Atlas 环境下,通常可以使用类似 npu-smi info 的检查命令查看设备状态、驱动版本和显存信息。这一步如果不对,后面做什么都没有意义。
一个非常基础的检查流程大致是这样的:
正常时,你会看到设备列表里有对应的 NPU 芯片,状态正常,显存容积正确显示。如果看不到设备,不建议直接进入模型调试,而是回到驱动、固件、硬件插槽和权限这几个方向去查。
设备确认没问题后,我强烈建议先跑官方样例里的图像分类模型,比如常见 ResNet 模型。为什么不用自己的业务模型?因为官方样例通常在算子支持、预处理流程和输出解析上都和当前软件栈匹配过,跑通它,说明环境本身是健康的。这时候再去换自己的模型,才能把问题范围集中在“模型适配”而不是“环境问题”上。
2.3 接业务模型之前,先想清楚三件事
用自己的模型之前,通常要过三关。
第一关:模型能不能转换成功。很多框架的模型包含自定义算子,转换到加速卡支持的格式时,可能会出现算子不支持、算子融合失败之类的错误。这一关通常和模型结构有关,不一定是你改参数能解决的,更多时候需要替换算子或者调整模型结构。
第二关:转换后结果是否正确。如果模型能转,但输出是 NaN 或全 0,优先检查预处理逻辑。图像的通道顺序、归一化系数、resize 方式、精度设置,都可能导致推理结果完全不对。
第三关:目标 batch 下能否稳定跑通。如果业务需要一次处理比较大的 batch,不要一开始就拉满,先跑 batch=1,确认单条推理链路没问题,再逐步放大。
这里给出一个排查顺序,适用于很多类似场景:
- 先看现象:是设备识别不到、算子报错、输出异常,还是性能远低于预期。
- 再看输入:数据格式、通道信息、归一化参数、batch 维度是否合理。
- 再看环境:版本是否匹配、权限是否足够、日志里有没有底层错误。
- 再看参数:batch 大小、超时时间、内存池、并发数是否设置合理。
- 最后看工具边界:当前设备或软件栈是否支持该算子、该模型架构。
这个顺序看起来简单,但能挡住大部分无效调试。
3. 别只看“跑通了”,性能测试更考验细节
3.1 至少要记录这四类指标
跑通一次的成就感是真的,但它只能说明流程没有断,不能说明这张卡适合你的业务。真正要回答的问题是:这个模型在这张卡上,用你的数据分布、你的并发模型、你的 batch 策略,能做到多快、多稳、多少吞吐。
基础指标至少要记录四类:
- 吞吐:单位时间处理多少样本,比如 samples/s。
- 延迟:单个样本或单个 batch 的处理时间,尤其要看高百分位的延迟,比如 p95、p99。
- 稳定性:连续运行一段时间后,延迟和吞吐是否明显抖动。
- 资源消耗:NPU 利用率、显存占用、整卡功耗、温度。
如果只是随手记几个数字,后面很难用来横向对比其他硬件。
3.2 一个基础但有效的批量测试流程
性能测试别靠感觉,要用脚本固定下来。下面是一个常见的循环思路,不是官方工具,只是一个演示用的测试骨架:
在这个循环里,每次切换 batch 后都要重新加载或至少重置推理上下文,并且要做 warmup。也就是说,正式记录数据前先跑几轮,让模型加载、内存分配、算子初始化都稳定下来。第一次推理通常慢得离谱,直接拿这个数当有效数据会误导判断。
每个 batch 设置下,建议跑多轮,取比较稳定的值,而不是拿最大值或第一个值。如果数据加载和预处理不在设备上做,还要单独记录 CPU 侧耗时。很多时候瓶颈根本不在推理卡,而在数据喂给设备的速度。图像解码、resize、归一化、内存拷贝,每一步都可能成为隐性瓶颈。
一份好的测试记录至少应该包含这些字段:
- 模型名称和模型文件版本。
- 软件栈版本,包括驱动、固件、CANN、推理引擎。
- batch 大小。
- 平均延迟、p95 延迟、p99 延迟。
- 吞吐量。
- NPU 利用率、显存占用、功耗。
- 测试时间、机器配置、数据规模。
记录越完整,后续排查时越省力。
3.3 性能结果该怎样解读
很多同学会陷在一个误区里:把厂商宣传的“最大算力”当成自己业务能达到的指标。实际上,最终性能取决于模型结构、算子实现、数据管线、batch 策略,甚至输入数据的尺寸和内存对齐方式。官方标称性能只能帮你做选型初筛,不能作为验收标准。
真正要跑的数据,必须是你的业务模型、你的输入规模、你的并发曲线。如果测试下来和预期差距很大,也别急着下结论说卡不行。先按前面说的排查顺序走一遍:
- 是不是数据加载太快导致 CPU 打满?
- 是不是模型预处理占了大量时间?
- 是不是 batch 增大后显存或内存池不够,产生了额外拷贝?
- 是不是并发请求在客户端排队,而不是设备在处理瓶颈?
这些因素都会直接影响最终数据。把设备侧、CPU 侧和业务层分开看,定位到真正瓶颈,再决定要不要调参数或换方案。
不要用宣传页上的“最高”数据作为性能验收依据。你需要的是自己的模型在预期负载下稳定跑出来的数字。
4. 换卡的时候,你能带走什么比卡本身更重要
4.1 把经验固化成仓库
硬件型号会退场,但一个工程团队长期积累的基础设施不应该跟着退场。我建议维护一个“硬件适配仓库”,里面不只有最终结论,还要有中间过程。
这个仓库至少要包含几类内容:
- 环境版本记录表:操作系统、驱动、固件、CANN、推理引擎的版本组合。
- 安装脚本或步骤文档:把安装过程写成可执行或至少可照着操作的步骤。
- 模型转换和推理脚本:输入路径、输出目录、日志位置都参数化。
- 性能测试脚本和结果目录:不同 batch、不同数据规模下的指标记录。
- 踩坑记录:包括报错信息、原因分析、解决办法、验证方式。
这些内容不会因为一款硬件退场而失效。它们构成了你面对下一款硬件时的起点,而不是每次从零开始。
4.2 一张“新卡引入评估”清单
面对一个新硬件型号,可以按四个阶段来控制节奏。这套四步法同样适合测试 Atlas 这类推理加速卡:
| 阶段 | 主要动作 | 输出物 |
|---|---|---|
| 需求确认 | 明确业务场景、延迟/吞吐/功耗预算 | 一份评估清单 |
| 最小验证 | 安装环境、跑通官方样例 | 一个能用的最小 demo |
| 基准测试 | 标准模型和业务模型在不同 batch 下测试 | 一组性能数据和结果分析 |
| 长期评估 | 稳定性测试、监控、升级迁移方案 | 一份结论建议 |
每个阶段做完再进入下一个阶段。很多人一上来就跑到第四步,结果环境还没完全稳定,性能数据也不可复现,最后讨论半天无法定论。
4.3 方法为什么能穿越型号周期
命令和 API 一定会变,主流框架的接口也会变。但有些东西相对稳定:先验证环境,再跑通最小样例,然后小步加压,最后记录基线的这个顺序,几乎适用于所有推理硬件。
你掌握“如何定位算子兼容问题”的方法,比背下某一个算子名更有价值。你理解“batch 增大后为什么延迟上升”,比只会调参数更接近问题本质。所以,面对新卡时,迁移的应当是工作流,而不是一行一行地重新记某个工具的命令路径。
5. 当Atlas成为过去式,工程师怎么保持从容
5.1 别把技能绑死在具体硬件型号上
如果你会的只是“Atlas 300I Duo 怎么装驱动”,那这个型号退场时,你的技能也跟着贬值了。但如果你会的是“如何分析一套推理系统在硬件替换后的性能瓶颈”,那这个技能放到任何硬件上都有用。
回到日常工作中,这其实是在提醒一件事:学习一款新硬件时,不仅要记步骤,还要理解步骤之间的因果关系。为什么先装驱动再装固件?为什么版本必须匹配?为什么算子转换失败可能和模型结构而不是参数有关?这些理解,才是能带走的资产。
5.2 值得养成的一个习惯:硬件观察笔记
我很推荐做一份个人硬件观察笔记,或者团队层面的硬件评估记录。接触一款新卡,就按照统一的模板记录:环境安装、设备检测、模型适配、性能曲线、踩坑清单、适配建议。
这份笔记最大的价值不是给人看,而是让几个月后的你,能快速重建上下文。那时候你不会记得每个报错细节,但翻到当时写的“这里 root 权限不对导致设备初始化失败”这样一条记录,可能直接省掉半天排查时间。长期积累下来,这就是一个属于自己的“硬件适配知识库”。
5.3 回到“RIP”这个感慨
再回到那句“RIP:只活了292天的Atlas”。我并没有替那个型号感到太多惋惜。硬件本来就是承载计算流程的容器,今天替换掉一个,明天还会有一个新的型号补上来。真正值得担心的是:你围绕它积累的方法,是否足够独立于具体型号而存在。
如果这些能力没有建立起来,那么它今天退场,明天你换一块卡,过去踩过的坑还要全部重踩一遍:版本不匹配再踩一次,算子不兼容再排查一次,性能测试再重新设计一次。每一次都是成本,每一次都是重复劳动。
如果这些能力已经建立起来,那旧型号退不退场,对你来说只是一次迁移成本。你手里有环境清单,有测试脚本,有踩坑记录,有性能基线,还有一套清晰的排查顺序。换卡的时候,你真正要做的只是把新的参数填进去,重新跑一遍流程,对比结果,然后决定是否切换。
这样想,那块“只活了292天”的卡,至少教会了我们一件事:在这个快速迭代的行业里,人被淘汰的隐患往往不是跟不上新工具,而是把能力绑定在了某个注定会过时的具体物件上。
加速卡会迭代,型号名字会消失,但那些关于环境判断、性能测试、迁移策略和问题排查的经验,不该跟着一起 RIP。下一块卡到货的时候,我们继续按照同一套流程测下去就行了。