☰
AI Infra 学习路线与实战:从分布式训练到故障排查
2026/10/22 8:46:02 网站建设 项目流程

这两年我经常被问到同一个问题:明明我模型结构了然于心、数据预处理也做得滴水不漏,为什么一跑大规模训练就四处翻车,不是显存爆了就是训练卡死,换个环境连复现都困难?这个问题的核心往往不在地图里,而在承载模型的那层基础设施——也就是大家常说的 AI Infra。如果你也经历过在单机上调试活蹦乱跳、一上多机多卡就原形毕露的困境,或者你在负责算法团队与平台的衔接,这篇学习笔记应该能给你一些启发。

AI Infra 表面上是硬件、驱动、框架、调度、存储这一堆“工程零件”的排列组合,但本质上它管的是三件事:让计算资源用在刀刃上,让训练过程不莫名其妙的挂掉,让团队协作时不互相踩踏。这篇文章会把我的知识全景整理出来,先从问题边界讲清楚,再给一条按层次递进的学习路线,接着用一套最小可用的训练基础设施作为实操主线,最后把我在实践中反复踩过的坑和排查思路一起倒出来。适合算法工程师、平台工程师,也适合想从单卡走向集群的初学者。

1. 先搞清楚 AI Infra 到底在解决什么问题

1.1 从模型实验到生产部署,Infra 的边界在哪

很多人第一次接触 AI Infra 时都会产生一个误解,以为它就是把服务器装好、把显卡驱动装完、再把容器起来就结束了。但真正进入局部之后你会发现,它的边界远比我最初想的要大得多。

从模型实验到生产部署这条路,算法工程师写模型只占一小段。拿到一批 GPU,首先要解决的是“卡怎么分配、多少人共用、谁的任务优先”。然后要解决“训练数据放在哪、怎么高效地送到 GPU 上”。训练跑起来之后,还要看“GPU 利用率到底高不高,是不是有一半时间在等待数据落地”。等到模型需要发布上线,又会出现“推理服务怎么扩缩容、多个副本之间如何共享显存、模型怎么热更新”这些问题。这些环节加在一起,才是 AI Infra 的完整外延。

我自己的习惯是用三个层次来切分:最底层是物理资源层,包含 GPU、CPU、内存、高速网络和存储设备;中间层是平台层,负责把物理资源抽象成可申请、可隔离、可计量的资源池;最上层是应用层,也就是算法工程师真正接触到的训练脚本、推理服务、模型仓库。很多混乱发生在中间层,因为资源被抽象之后,算法的运行环境跟本机调试时有了微妙的差异,用户感知到的“机器坏了”往往不是物理机坏了,而是调度策略、网络配置或存储权限出了问题。

1.2 资源利用率、稳定性、可观测性,三大痛点

把 AI Infra 的问题收敛成三个词,就是利用率、稳定性和可观测性。

利用率这块最典型的例子是 GPU 显存还空着一大半,但算力已经卡到不足。表面上看是版本不兼容,实际上可能是数据管线的读取速度跟不上,GPU 每轮都在等数据;也可能通信库的默认参数在多机环境下效率极低,每个 step 的同步等待时间占了三分之一。稳定性则是另一件让人头疼的事,训练任务跑着跑着突然卡死,或者某个节点死掉导致整个作业失败,这种问题在 AI Infra 领域非常常见。

可观测性往往是被忽略得最严重的一环。很多团队在初期只有一个“看机器负载”的监控面板,CPU、内存、带宽都是自动收集的,但缺少模型训练本身的细粒度指标,比如每个训练 step 的耗时变化、通信算子占比、数据读取耗时。没有这些指标,出了问题就只能猜,而 AI Infra 的问题猜测成本极高,因为链路太长,一个故障可能横跨存储、网络、调度、框架四层。

1.3 为什么算法工程师也要学 AI Infra

过去我总觉得 AI Infra 是平台工程师的事,算法工程师只需要写好 loss 函数就行。直到有一次我在一个 8 卡环境上跑实验,发现数据加载脚本里有个隐式的 shuffle 逻辑,每个进程都读取了完整的数据索引,导致频繁的锁等待。当时我花了一整天排查训练变慢的根因,最后发现只是因为没有把数据读的并行策略想清楚。

从那以后我的观点就变了:算法工程师学 AI Infra 不是为了替代平台组,而是为了在和基础设施打交道时有共同语言。你会发现当你理解资源管理器是怎么调度你的任务、网卡带宽是如何影响梯度同步、数据读取为什么不能简单缩成一行代码之后,很多问题在提交任务之前就能规避。这种理解让我在模型代码里就开始考虑数据布局、集合通信策略和显存复用,而不是等任务挂了再看日志。

2. 学习路线拆解:按层次吃透 AI 基础设施

2.1 第一层:算力硬件与高速互联

学习 AI Infra 我建议从硬件层切入,但不需要陷入硬件选型的评测细节。你需要掌握的是:GPU 的算力是怎么量化的,显存带宽和数据搬运速度的区别,高性能计算用的高速互联和普通以太网有什么不同。

计算性能的衡量维度主要有两个:峰值算力和有效算力。峰值算力看显卡的理论浮点运算能力,实际训练中几乎达不到这个数字,因为数据搬运、算子融合、CPU 端开销都会打折扣。显存容量决定单卡能跑多大模型,显存带宽决定数据在片内搬运的效率。很多人只关心显存够不够大,却不关心带宽,结果模型塞进显存了,训练速度反而不如显存小但带宽高的卡。

多卡之间的互联是真正拉开差距的地方。单机多卡之间通常有高带宽的低延迟总线,跨机需要通过高速网卡,而网卡的拓扑结构会影响集合通信的效率。我刚开始学习时把一张简单的拓扑图画在本子上:两台服务器之间数据交换的瓶颈在哪,哪个环节最容易丢包或背压,几号的通信模式会放大某个瓶颈。画完这张图后,再去理解分布式并行策略就顺多了。

2.2 第二层:分布式训练策略与并行模式

这一层是 AI Infra 中数学味最浓的部分。主流的并行模式归纳下来无非是:数据并行、模型并行、流水线并行、张量并行,以及它们的组合。

数据并行最容易理解,每张卡拿到一份模型副本,各吃不同的数据小批量,每轮计算结束后交换梯度做平均。它的通信开销跟模型大小正相关,模型越大,每轮同步的梯度数据就越多。要想想怎么减少通信频次,或者采用同步方式不同的梯度压缩策略。模型并行则是在一张卡放不下整个模型时,把模型切成几块放在不同卡上来前向反向计算;流水线并行再进一步,把切好的模型分成阶段,让数据一批一批像流水线一样在不同阶段中流动。张量并行则是把单个层的矩阵计算拆分到多张卡上,对通信延迟的要求最高。

第一次接触这些概念时容易迷失在“哪种模式最好”的讨论里。真正靠谱的学习方式是找一个实际模型,算一算模型参数量、单卡显存容量、通信带宽,然后手动做一次容量估算:当一个模型需要 40GB 显存,但每张卡只有 16GB 时,你应该选用哪种切分方式,切分后每轮通信的数据量是多少。这个估算过程比死记硬背并行策略管用得多。

2.3 第三层:集群资源调度与容器化

算法工程师接触到的平台层,本质上就是一套把多用户任务塞进有限资源的系统。这里面的容器化不是简单地把代码打成镜像,而是要对 CPU、GPU、内存、网络做精细化隔离和配额限制。

我在学习时把资源调度理解成一个“旅馆前台”模型:住客是训练任务,客房是 GPU/NPU 算力,前台需要决定谁住进来、住多久、能占用多少资源、多人共享时如何避免互相干扰。调度器做几件事,维护可用资源清单,监听新任务请求,然后根据优先级、亲和性、反亲和性等约束条件完成分配。

容器化的知识点里最容易被忽视的是 GPU 在容器里的暴露方式。一个自然语言处理任务可能只需要 CPU 内存,而一个视觉模型必须绑定某几块 GPU。那容器怎么才能获得对应的显卡设备,同时又不让它把整台宿主机的显卡资源全占掉?这就是设备插件和资源池管理的活。这块我会建议多写几个测试镜像,亲自动手做一次资源限制和共享的验证,光看文档永远体会不到细节。

2.4 第四层:数据存储与预处理管线

AI Infra 的另一条大腿是数据。大多数模型训练求的不是“一次性把数据全装进内存”,而是数据能“刚刚好”地流进 GPU。数据处理链路通常包含原始数据存储、中间格式转换、采样/增强、预取和缓存几个环节。

学习存储时,要分清楚两类延迟:第一类是冷数据从磁盘/对象存储读到本机的延迟,第二类是热数据从本机缓存进入 GPU 显存的延迟。一个常见的设计是把原始数据放高容量低成本存储,训练前转换成模型读取高效的格式,训练过程中利用分布式的数据加载器做预取和多进程并行读取。

数据管线里最隐蔽的坑是数据顺序和随机性。分布式训练中如果每个进程的数据切片方法不一样,会导致部分样本被重复训练或漏训。这看似是算法问题,其实是基础设施层面的索引管理问题,需要在数据管线设计时就规定好全局样本编号和分片规则。

2.5 第五层:推理服务与模型生命周期

训练只是 AI Infra 的前半场,后半场是模型上线后的推理服务。推理和训练在资源管理逻辑上有很多不同点:训练任务通常长时间占用一组资源,而推理服务需要应对动态的请求流量,要求快速扩缩容,还要在多个模型副本间做到显存隔离。

模型生命周期管理在我学习时被列为独立主题,因为一个模型从 checkpoint 保存、版本登记、上线评估、灰度发布到废弃回收,每一步都涉及存储系统和元数据管理。很多训练平台能跑通训练,但上线时一团乱麻,就是因为没有一套模型版本管理和灰度发布流程。学习这块时,可以自己做一个简单模型注册表的模拟:定义模型文件的目录结构,写清楚版本号、精度指标、部署环境信息,再把发布状态从 dev 切到 prod,这个练习对理解全链路很有帮助。

3. 实操笔记:亲手搭建一个最小可用的 AI 训练基础设施

3.1 需求界定与架构选型

理论知识积累到一定程度后,我建议原地做一次小规模实操,目标是让一个多卡训练任务稳定跑完,并且能看到基础的运行指标。我实操时的环境用的是几台带 8 卡 GPU 的服务器,搭配一个共享存储目录和一套容器编排平台。

需求界定上不要贪多。我先明确三条核心目标:让用户能通过平台申请 GPU 资源并运行训练任务,让训练任务能够访问共享数据目录,让训练过程中能看到 GPU 利用率、显存占用和训练 loss 曲线。至于自动混合精度、断点续训、弹性扩缩容,这些属于二期增强功能,不要一开始就全塞进架构里。

架构选型上我遵循“最少组件”原则。容器编排平台负责资源调度和任务生命周期管理,镜像仓库负责管理训练镜像,共享文件系统负责存放数据和模型输出,监控组件负责采集指标。这个组合已经够应付最小环境了。选型的关键是确定版本兼容关系,因为 AI 训练任务对底层依赖很敏感,差一个小版本都可能让算子跑错设备。

3.2 关键依赖版本与兼容性排查

实操中最容易让人心态崩塌的不是功能不会写,而是版本不兼容。整个链路里同时牵扯操作系统内核、GPU 驱动、容器运行时、深度学习框架、集合通信库,每一层都有自己的版本约束。

我的经验是先确定一个“基线版本组合”,然后所有组件尽可能从同一发行渠道装。比如操作系统用同一个长期支持版本,GPU 驱动版本与编程库的版本严格对齐,容器运行时和调度插件之间的适配关系也要先查清楚。检查兼容性时不要只听信安装文档,要主动查看内核模块是否加载成功,再用一个简单的矩阵乘法程序跑一遍验证 GPU 是否真的能参与计算。

实操记录里我专门写了一个检查清单:驱动能识别到 GPU 设备,容器内也能看到同样的设备号,多卡间能完成简单的通信测试,数据存储目录在所有节点上挂载路径一致。这个清单让我后续排查问题时省了大量时间,每一个环节挂掉都能顺着链路快速定位。

3.3 多卡训练的配置要点

当基础环境确认没问题后,下一步就是跑多卡分布式训练。这地方的配置项远比单卡多,而且每一项都可能让性能出现数量级差异。

第一件事是设置全局随机种子和每个进程的独立标识。数据并行时,不同进程负责不同数据分片,如果每个进程的随机种子一样,数据增强可能产生相同的图像变换,这在严格意义上会污染实验结论。更麻烦的是,如果进程没有正确告知全局排名和本地排名,分布式通信库就不知道怎么建立通信拓扑。

第二件事是环境变量的传递。容器化环境下,用户脚本里看到的进程数量、节点数量、通信地址都必须由调度平台通过环境变量注入。我踩过的一个坑是,任务在容器里表现为一个单进程启动器,没有把分布式训练需要的若干并行进程真正拉起。这种情况下即便代码是正确的,也只在单卡上运行,其他卡全部空转。排查这类问题需要到容器里手动查看进程列表,确认启动了预期数量的工作进程。

第三件事是通信初始化。多机训练时最先要保证的是节点之间能够通过特定端口完成握手。很多团队的生产环境会在节点间禁用端口访问,导致任务一直在等待连接。实操时需要提前开通通信所需的端口范围,并做一次手动的通信连通性测试,而不是等任务提交后才暴露。

3.4 一套开销不大的监控告警方案

训练基础设施上线后,监控必须跟上。最基础的指标有三类:硬件类指标(GPU 利用率、显存占用、温度、功耗)、任务类指标(训练 step 耗时、 loss 曲线、数据加载耗时)、事件类指标(任务失败、节点掉线、重启)。所有指标最终都应该汇聚到同一个时间序列数据库里,方便按时间维度对比。

监控方案的落地方式不用追求大而全。我比较推荐先做到四件事:每台机器的核心指标能采集到,关键指标能按训练任务维度做标签区分,训练失败时能触发即时通知,历史指标能至少保存两周。这个规模下只需要一个采集器和一个可视化面板就足够。

告警规则的设定需要刻意避免“狼来了”效应。不要对 GPU 温度设置过灵敏的告警,温度偶尔瞬时飙升并不代表故障;也不要对所有任务失败都报警,训练中的偶尔重试可能是平台自动恢复机制的一部分。我的经验是告警的核心目标是发现“用户无法自己解决的问题”,比如节点失联、存储权限失效、驱动丢失,而不是算法层面的 loss 异常。

3.5 配额管理与多用户协作

当训练环境有了几个真实用户后,配额管理很快会变成第一优先级。没有配额时,同事 A 一个 8 卡长任务能占住所有资源,其他人只能排队等。透明、公平的配额机制才能让团队协作顺畅。

我搭的最小环境里,配额管理做了三件事:为每个用户设置 GPU 使用上限,规定单任务最长运行时间,提供资源排队和优先级策略。超时任务自动杀死前会发送提醒,预留一段缓冲时间让用户保存 checkpoint。这些机制光写在文档里没用,必须实际验证调度器能够强制生效,否则仍然会有钻空子的情况。

另一个实用细节是共享目录的权限管理。训练任务跑在多台机器上,经常需要写入共享目录,如果每个任务都以同一个账户运行,用户之间很容易因为文件权限问题互相锁死。我给每个用户设置了独立的工作目录,并通过用户组权限控制只读和读写范围。这个改变直接减少了大量“我无法写入模型输出路径”的工单。

4. 踩坑实录:AI Infra 实践中的常见问题与排查技巧

4.1 GPU 显存利用率低,瓶颈未必在 GPU

先说一个最常见的现象:从监控面板看,GPU 利用率只有 30%,显存占用却很满。直觉上会以为是显存不够导致的模型反复换入换出,但我排查过的很多案例实际上卡在数据读取上。

如果数据文件分布在大量小文件里,文件系统元数据操作会成为前置瓶颈。路径解析、文件打开、目录扫描都会消耗大量 CPU 时间,而 GPU 算完一个 batch 后只能在原地等待。这时候就算你加大数据加载的进程数,效果也有限,因为瓶颈在存储系统的 IOPS,也就是每秒能处理的文件操作次数,而不是传输带宽。

遇到这种问题,先别急着改代码。我会在训练进程里打几个时间戳,统计从请求数据到拿到数据的时间中位数和 p99,确认高延迟发生在哪一个环节。是每次都访问远端存储,还是本地缓存命中率太低,还是解压/解码算法的 CPU 开销太大?这样一层层拆,几分钟就能找到根因。

4.2 分布式训练卡死与超时问题

分布式训练里最让人血压高的就是任务卡死,日志里最后一行写着类似“等待其他进程”的状态,然后就没有然后了。这个现象背后通常有两种可能,一种是在集合通信时某个进程没能顺利参加,另一种是不同进程的执行进度出现了漂移。

我第一次遇到卡死时,以为是网络故障,后来检查发现是一个节点的显存被其他任务占掉了一部分,导致当前进程在初始化阶段分配显存失败,于是它待在重试循环里,而其他进程已经在正常的通信流程中等它。这种问题在现代显存紧张的环境中相当常见,经验是启动训练前统一检查所有节点上可用的 GPU 显存余量,而不是只检查任务申请时的那一个时点。

另一个排查技巧是看“卡死是否稳定复现”。如果每次卡在同一步,多半是某个样本或某个算子在特定进程上触发了异常;如果是随机卡死,才需要怀疑网络、通信库和硬件。稳定复现的问题可以缩小范围到具体数据批次,随机卡死的问题则要走协议级日志分析,把通信库的调试输出打开,观察每个集合通信算子的开始和结束时间。

4.3 显存不足与碎片化问题

显存不足听起来像容量问题,但在同一张卡跑不同模型后,显存碎片化会让明明还有几 GB 空闲,新任务却申请不到连续大块内存。推理服务一多,这种问题尤其明显。

面对显存不足,第一调整思路是降低 batch size 或启用梯度检查点,这属于算法侧的改动;从基础设施侧来看,可以做的是让服务在申请显存时能复用已有的显存池,或者在任务结束后主动释放不再使用的缓存块。我见过不少团队给每个新任务都新建一个推理进程,结果显存碎片越来越严重,最后只能用重启节点的暴力办法解决。

如果你在维护一个多模型推理平台,记得把显存分配策略和模型加载策略放在一起考虑。有些模型体积小但请求量大,适合常驻内存;有些模型只在特定活动期间被调用,应该按需加载。把这些策略梳理清楚,单机能承载的模型数量会有明显提升。

4.4 集群资源闲置率高的治理经验

监控面板上线后,最直观的冲击往往是集群资源闲置率高得惊人。这里说的闲置不是指机器关机,而是指任务申请了 8 张卡,实际有效计算时间只有一半;也可能是用户排队一个多小时,最后任务几分钟就跑完。

治理闲置率的难点在于“闲置”的定义。GPU 利用率低不一定是浪费,比如推理服务有既定的低流量水位,只要满足响应时间要求,低利用就是正常的。但训练任务的低利用率通常可以被优化。我给团队做治理时,先按时间维度切分:工作日的波峰波谷是什么时段,每周有没有周期性的大规模评测任务。然后针对高频耗资源的任务类型做统计,把超量申请资源的任务找出来,分析它真实用到的显存和算力份额。

治理手段不应该是简单限制用户,而是提供更细粒度的资源规格选项。很多用户上来就要整卡,是因为他不知道任务只用得了 40% 显存。如果你能在申请界面给出不同 GPU 切片规格,并配上历史资源用量参考,用户自然会选择更合适的方式。这个改变比任何强管制手段都有效。

4.5 快速定位“慢节点”的思路

分布式训练常常会遇到整体速度被某一个节点拖累的情况,其他节点都在等那个慢角色。这种“慢节点”不一定真的硬件故障,有时候只是磁盘快满了、网卡带宽被其他业务抢占、内存换页严重。

定位慢节点我习惯用三步。第一步是看训练日志,观察每个 step 完成时间是不是所有节点都同步在同一水平,如果一个节点的 step 时间明显高于其他节点,先把嫌疑锁定到它身上。第二步是登录慢节点,用监控命令看 CPU 负载、内存、磁盘读写、网络流量;特别要关注是否存在大量 swap 操作,swap 对训练性能的拖累远大于网络延迟。第三步是做一个轻量通信测试,让慢节点与其他节点反复交换数据,对比带宽和延迟。这片区域基本能覆盖绝大多数“慢节点”场景。

最后一个建议:从最小闭环开始,再逐步扩边界

如果你打算系统学习 AI Infra,我的个人建议是不要一开始就啃大规模集群设计和复杂的弹性调度。先在自己的工作站或一台测试机上搭一个最小闭环:让一个模型能跑通数据并行,能看到 loss 曲线,能在 GPU 掉线后自动恢复,能快速定位一次数据加载慢的问题。这个闭环会打通你对“硬件-驱动-框架-数据-调度”五层关系的认知,而且后续每一次扩展,比如加存储缓存、加推理服务、加多集群调度,都有了明确的位置坐标。

另外,学习过程中一定要养成记录“故障现象和排查过程”的习惯。很多 AI Infra 问题不会出现在官方文档里,只会在你踩坑之后才变成经验。把这些记录整理成自己的速查表,几个月后回头看,你会发现自己已经能从容处理各种奇形怪状的运行问题。真正有价值的 AI Infra 能力,正是建立在这些真实的踩坑、分析和修复循环之上的。

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

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

立即咨询