1. 为什么AI Infra值得系统学一遍
这两年“AI Infra”这个词出现的频率越来越高,但很多人对它的理解还停留在“搞GPU集群的”或者“运维大模型训练环境的”这种模糊印象上。我刚开始接触这块的时候也走过不少弯路,以为会配几台机器、装个CUDA、跑通一个训练脚本就算入门了,结果真到了生产环境才发现,从底层硬件到上层框架再到业务落地,中间隔着一整套需要系统补齐的知识体系。
AI Infra,拆开来看就是“AI”加“Infrastructure”。它不是单纯的机器学习,也不是传统的后端运维,而是两者的交叉地带——让AI模型能在真实硬件上高效跑起来、稳定跑下去、并且跑得足够便宜的一整套工程能力。具体来说,它涵盖了计算资源调度、分布式训练、推理服务部署、模型压缩与加速、存储与网络优化、监控与容错等多个层面。你如果只是做算法研究,可能不需要关心显存碎片怎么整理、NCCL通信怎么调优;但一旦你要把模型推到线上、要支撑几十上百张卡的训练任务、要让推理延迟从500毫秒压到50毫秒,这些就是绕不过去的硬骨头。
这篇文章适合三类人看:第一类是算法工程师,想补上工程侧的短板,让自己训的模型能真正上线;第二类是后端或运维工程师,想切入AI方向,但不知道从哪下手;第三类是刚入行的新人,面对“AI Infra”这个岗位描述里一堆名词感到迷茫。我会按照一条从底层到落地的完整路径来讲,每一步都告诉你为什么学、学什么、怎么练,尽量把踩过的坑和实测有效的方案都摊开说。
2. 先搞清楚AI Infra到底包含哪些板块
2.1 从一次完整的模型生命周期倒推技术栈
要理解AI Infra的范围,最直接的方法不是看定义,而是跟着一个模型从诞生到上线的全过程走一遍。假设你要做一个图像分类模型,整个流程大致是这样的:数据从存储系统读取,经过预处理后送入GPU,用多张卡并行训练,训练过程中要保存检查点,训练完成后模型需要压缩和格式转换,然后部署到推理服务器上对外提供服务,服务运行期间还要监控延迟、吞吐和资源利用率。这每一个环节背后都有对应的Infra技术。
数据读取阶段,你需要知道怎么选存储方案——是本地NVMe还是网络文件系统,是对象存储还是分布式文件系统,不同选择对训练吞吐的影响可能差出好几倍。训练阶段,单卡跑不动就要上分布式,数据并行、模型并行、流水线并行各有适用场景,通信库选NCCL还是Gloo,梯度同步用AllReduce还是Parameter Server,这些决策直接影响训练效率和稳定性。推理阶段,模型要不要量化、要不要做算子融合、用TensorRT还是ONNX Runtime,批处理策略怎么设计,这些又决定了线上服务的成本和响应速度。
所以AI Infra不是一个单点技术,而是一条链。你可以先精通其中某一环,但最终一定要建立全局视角,否则优化了推理延迟却发现训练侧的数据管道才是瓶颈,这种亏我吃过不止一次。
2.2 四个核心能力域及其优先级
把上面这条链抽象一下,AI Infra可以归为四个能力域:计算、存储、网络、调度。计算域包括GPU/CPU/加速卡的选型、CUDA编程基础、算子优化、混合精度训练等;存储域包括数据格式、缓存策略、检查点管理、分布式文件系统;网络域包括集合通信、RDMA、拓扑感知调度;调度域包括Kubernetes、Slurm、资源配额、优先级抢占等。
对于刚入门的人,我的建议是优先把计算域和调度域的基础打牢。原因很简单:计算域是你理解一切性能问题的根基,为什么这个模型跑得慢、为什么显存不够、为什么多卡加速比上不去,答案都在计算域里。调度域则是你进入生产环境的门票,不会用K8s或者Slurm管理训练任务,基本没法在团队里协作。存储和网络可以稍后深入,但至少要理解基本概念和常见瓶颈点。
这里给一个粗略的学习优先级参考:
| 能力域 | 入门优先级 | 核心知识点 | 建议投入时间 |
|---|---|---|---|
| 计算 | 高 | CUDA基础、显存管理、混合精度 | 4-6周 |
| 调度 | 高 | K8s基础、任务编排、资源配额 | 3-4周 |
| 存储 | 中 | 数据管道、检查点、分布式存储 | 2-3周 |
| 网络 | 中 | 集合通信、RDMA概念、拓扑 | 2-3周 |
这个时间只是参考,实际取决于你每天能投入多少小时以及已有的基础。有后端经验的人学调度会快很多,有算法经验的人学计算域会更顺手。
3. 底层基础:计算、存储与网络的最小知识集
3.1 GPU计算基础与CUDA编程入门
不管你以后是做训练还是推理,GPU计算基础都是必修课。很多人觉得CUDA编程是“底层大佬”才需要学的,做AI Infra只要会调库就行。这个想法在初期没问题,但遇到性能瓶颈时,如果你不理解SM(流多处理器)的调度机制、不理解显存层次结构、不知道什么是warp divergence,你连问题出在哪都判断不了。
我的建议是从三个概念入手:线程层次、内存层次、执行模型。线程层次就是grid-block-thread这套组织方式,你要能看懂一个kernel启动时有多少线程在跑、怎么映射到硬件上。内存层次包括全局内存、共享内存、寄存器、常量内存,不同层次的访问延迟差几个数量级,优化往往就是把数据搬到更快的层次里。执行模型涉及warp调度、延迟隐藏、占用率计算,这些决定了你的kernel能不能跑满GPU。
实操层面,你可以先不写复杂的CUDA kernel,但一定要会用Nsight Systems和Nsight Compute这两个工具。前者看整体时间线,帮你定位是计算瓶颈还是通信瓶颈还是IO瓶颈;后者看单个kernel的内部指标,帮你判断是访存受限还是计算受限。我见过太多人一上来就凭感觉调参,结果方向完全错了,用好这两个工具能省下大量试错时间。
注意:不要一上来就啃《CUDA编程指南》那本厚书,容易劝退。先从跑通一个向量加法kernel开始,然后逐步加功能,遇到问题再查资料,这样学得最快。
3.2 存储方案选型:从数据加载到检查点管理
存储这块最容易被忽视,但它对训练效率的影响极其直接。我做过一个对比测试:同样的模型和GPU配置,数据放在本地NVMe上训练一个epoch需要12分钟,放在网络文件系统上需要18分钟,放在对象存储上直接飙到35分钟。差距就是这么夸张。
数据加载的核心问题是“喂饱GPU”。GPU计算速度远快于磁盘IO,如果数据管道跟不上,GPU就会空转。解决方案通常有几层:第一层是格式优化,把原始图片或文本转成TFRecord、WebDataset或者LMDB这类适合顺序读取的格式;第二层是预取和缓存,用DataLoader的prefetch功能或者自己写缓存层;第三层是并行读取,多个worker同时从不同分片读数据。
检查点管理是另一个坑。大模型训练动辄几百GB的检查点,如果每次都全量保存,不仅慢而且浪费存储。常见做法是分片保存加异步写入,再配合增量检查点策略。另外检查点的版本管理也很重要,训练中断后要能准确恢复到最近的正确状态,这需要你在保存时记录步数、优化器状态、随机种子等元信息。
3.3 网络与集合通信:多卡训练的隐形瓶颈
单卡训练不需要关心网络,但一旦上多卡,网络就成了决定加速比的关键因素。集合通信是分布式训练的核心操作,包括Broadcast、AllReduce、AllGather、ReduceScatter等。你不需要自己实现这些操作,但必须理解它们的通信量和适用场景。
以数据并行为例,每个step结束后所有卡要同步梯度,用的就是AllReduce。AllReduce的通信量是2倍模型参数量(一次ReduceScatter加一次AllGather),如果模型有10亿参数,每张卡每个step要收发约8GB的数据。这时候网络带宽就是硬瓶颈,IB(InfiniBand)和普通以太网的差距会直接体现在训练速度上。
拓扑感知也很关键。如果通信的两张卡跨了NUMA节点或者跨了交换机,延迟会明显增加。NCCL会自动做拓扑探测和路径选择,但你需要知道怎么查看它选的路径、怎么通过环境变量调整。比如NCCL_DEBUG=INFO可以打印通信详情,NCCL_TOPO_DUMP_FILE可以导出拓扑结构,这些在排查通信瓶颈时非常有用。
4. 框架与工具链:从训练到推理的工程化路径
4.1 分布式训练框架选型与实操要点
分布式训练框架现在主流的有PyTorch DDP、DeepSpeed、Megatron-LM、Horovod等。选哪个取决于你的模型规模和团队技术栈。PyTorch DDP是最通用的选择,适合中小规模模型和快速实验;DeepSpeed在显存优化和超大模型训练上更强,集成了ZeRO系列技术;Megatron-LM专注张量并行和流水线并行,适合千亿参数级别的模型。
我个人的经验是:先从PyTorch DDP入手,把数据并行的流程跑通,理解DistributedSampler、DistributedDataParallel、梯度同步这些机制。然后根据需求逐步引入DeepSpeed的ZeRO Stage 1/2/3,每一步都要做性能对比,确认优化确实有效再继续。不要一上来就堆最复杂的配置,出了问题很难定位。
实操中几个关键点:第一,batch size和learning rate要随卡数调整,通常learning rate要按平方根或线性缩放;第二,数据加载的worker数量要合理,太多会导致CPU争抢,太少会饿死GPU;第三,日志和检查点要只在rank 0上做,否则所有卡同时写文件会冲突。这些细节看起来小,但实际训练中经常因为这些问题浪费大量时间。
4.2 推理服务部署:延迟、吞吐与成本的三角平衡
推理部署和训练是完全不同的挑战。训练追求的是吞吐和收敛速度,推理追求的是延迟、吞吐和成本的平衡。一个线上推理服务,用户关心的是响应时间,老板关心的是每QPS的成本,而你夹在中间要做各种取舍。
推理优化的手段很多,按效果从大到小排:模型量化(FP16到INT8通常能提速2-3倍)、算子融合(把多个小算子合并成一个大算子,减少kernel启动开销)、批处理(把多个请求攒在一起推理,提高GPU利用率)、KV Cache优化(对Transformer类模型尤其重要)、投机解码(用一个小模型预测多个token,大模型并行验证)。每一项都有适用场景和副作用,比如量化可能掉精度,批处理可能增加尾延迟,需要根据业务需求权衡。
部署框架方面,Triton Inference Server是通用性最好的选择,支持多种后端和动态批处理;TensorRT适合NVIDIA GPU上的极致优化;ONNX Runtime跨平台支持好;vLLM专注大语言模型推理,在KV Cache管理和连续批处理上做了很多优化。选哪个取决于你的模型类型、硬件环境和团队熟悉度。
4.3 监控、容错与成本控制
生产环境和实验环境最大的区别就是:实验环境可以随便挂,生产环境挂了就是事故。所以监控和容错是AI Infra必须掌握的能力。
监控要覆盖几个层面:硬件层看GPU利用率、显存占用、温度、功耗;框架层看训练loss、学习率、梯度范数;服务层看QPS、延迟分布、错误率。工具上Prometheus加Grafana是标配,再配合各框架自带的日志系统。关键是要设置合理的告警阈值,比如GPU利用率持续低于30%可能意味着数据管道有问题,推理延迟P99超过阈值可能意味着需要扩容。
容错方面,训练任务要支持断点续训,推理服务要支持滚动更新和自动重启。Kubernetes的liveness和readiness探针、PodDisruptionBudget、节点亲和性这些机制都要会用。成本控制则是更高阶的要求,包括用竞价实例跑非关键任务、根据负载自动伸缩、选择合适的GPU型号等。我见过一个团队因为没做自动伸缩,夜间低峰期还开着几十张A100,一个月浪费的钱够买好几张新卡了。
5. 落地实践:从零搭建一个可复现的训练与推理流程
5.1 环境准备与依赖管理
说了这么多理论,最终还是要落到动手上。我建议用一个完整的项目来串联所有知识点,比如训练一个中等规模的图像分类模型并部署成API服务。这样你能把数据、训练、推理、监控整条链都走一遍。
环境准备的第一步是确定硬件和驱动版本。CUDA版本、cuDNN版本、PyTorch版本、NCCL版本之间有严格的兼容性要求,版本对不上轻则报错重则性能异常。我的习惯是用Docker来管理环境,基础镜像选NVIDIA官方提供的PyTorch镜像,然后在上面装项目特定的依赖。这样既能保证环境一致,又方便迁移到其他机器。
依赖管理用conda或者pip都行,但一定要锁定版本。requirements.txt里不要写“torch>=1.12”这种模糊版本,要写死具体版本号。我吃过亏:本地开发环境跑得好好的,到了服务器上因为torch版本自动升级导致API变了,排查了半天才发现是版本问题。
5.2 训练流程搭建与调优记录
训练流程的搭建我习惯分四步走:先跑通单卡小数据,再扩展到单卡全量数据,然后上多卡DDP,最后加DeepSpeed优化。每一步都记录训练时间、显存占用、最终精度,方便对比。
单卡跑通后,上多卡时最容易遇到的问题是数据加载成为瓶颈。这时候要看DataLoader的worker数量是否足够、数据格式是否高效、是否有不必要的CPU计算。我通常会用PyTorch Profiler抓一个step的时间线,看看GPU到底在等什么。如果GPU利用率只有50%左右,大概率是数据管道的问题。
DeepSpeed的引入要循序渐进。先开ZeRO Stage 1(优化器状态分片),看显存降了多少、速度有没有变化;再开Stage 2(梯度分片);最后才考虑Stage 3(参数分片)。每开一级都要重新调batch size和learning rate,因为显存和通信模式都变了。Stage 3虽然省显存,但通信量大幅增加,在慢速网络上可能反而更慢。
5.3 推理服务上线与性能压测
训练完成后,模型导出为ONNX或TorchScript格式,然后用Triton或者vLLM部署。部署时要注意几个参数:max_batch_size决定最大批处理大小,instance_group决定用几张卡跑几个实例,dynamic_batching控制批处理策略。这些参数没有万能值,要根据实际请求分布来调。
压测是上线前的必做环节。用wrk或者Locust模拟并发请求,观察QPS、P50/P95/P99延迟、GPU利用率、显存占用。如果P99延迟远高于P50,说明有长尾请求,可能是批处理策略不合理或者有个别请求计算量特别大。如果GPU利用率上不去,可能是批处理大小太小或者CPU预处理成了瓶颈。
我一般会做三组压测:低并发看延迟下限,中并发看最佳吞吐点,高并发看系统崩溃点。根据这三组数据来确定服务的容量规划和自动伸缩策略。
6. 常见问题与排查技巧实录
6.1 训练侧高频问题速查
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| GPU利用率低 | 数据管道瓶颈 | Profiler看GPU等待时间 | 增加worker、优化数据格式 |
| 多卡加速比低 | 通信瓶颈 | NCCL_DEBUG看通信耗时 | 调整并行策略、换IB网络 |
| 显存OOM | batch太大或碎片 | torch.cuda.memory_summary | 减小batch、开梯度检查点 |
| loss不收敛 | 学习率或数据问题 | 看梯度范数和数据分布 | 调学习率、检查数据标签 |
| 训练中断无法恢复 | 检查点不完整 | 检查保存的元信息 | 保存优化器状态和步数 |
这张表里的每一个问题我都实际遇到过,其中“多卡加速比低”是最难排查的。有一次8卡训练加速比只有4倍,查了半天发现是NCCL选了错误的网卡,走了一个慢速通道。后来通过设置NCCL_SOCKET_IFNAME指定网卡才解决。这种问题没有通用答案,只能靠工具和经验一步步缩小范围。
6.2 推理侧高频问题速查
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| P99延迟高 | 长尾请求或批处理不当 | 看延迟分布和请求大小 | 调整批处理策略、限流 |
| 吞吐上不去 | GPU利用率低或CPU瓶颈 | 看GPU和CPU利用率 | 增大batch、优化预处理 |
| 精度下降 | 量化或算子融合副作用 | 对比原始模型输出 | 调整量化策略、校准 |
| 服务OOM | 并发太高或显存泄漏 | 看显存随时间变化 | 限流、重启、查泄漏 |
| 冷启动慢 | 模型加载和编译耗时 | 看启动日志时间戳 | 预加载、模型缓存 |
推理侧最容易被忽视的是冷启动问题。模型第一次加载要读文件、初始化CUDA上下文、编译kernel,可能耗时几十秒。如果服务频繁重启或者自动伸缩,冷启动会严重影响可用性。解决方案包括预热请求、模型常驻内存、使用TensorRT的plan缓存等。
6.3 那些文档里不会写的避坑经验
第一个坑:不要在生产环境用latest标签的镜像。我见过一次因为基础镜像自动更新导致CUDA版本变化,整个训练任务全挂。所有镜像都要用固定版本号,并且定期手动更新。
第二个坑:检查点不要只存一份。存储系统可能出故障,检查点可能损坏。我习惯同时存本地和远程两份,并且定期做恢复测试,确保检查点真的能用。
第三个坑:监控不要只看GPU利用率。GPU利用率高不代表效率高,可能是在做无效计算。要结合loss曲线、梯度范数、吞吐量一起看。有时候GPU利用率100%但loss不降,说明学习率或者数据有问题。
第四个坑:压测环境和生产环境要尽量一致。我试过在测试环境压测表现很好,上线后直接崩了,后来发现是生产环境的网络延迟更高、请求分布更不均匀。压测要尽可能模拟真实流量。
第五个坑:不要忽视CPU和内存。AI Infra虽然以GPU为中心,但CPU预处理、数据加载、网络通信都依赖CPU。CPU核心数不够或者内存带宽不足,同样会拖慢整体性能。我一般会确保CPU核心数是GPU数量的2-4倍,内存至少是显存的2倍。
7. 学习路径规划与资源推荐
7.1 分阶段学习路线图
如果你是从零开始,我建议按这个节奏走:
第一阶段(1-2个月):打基础。学Linux基础、Python编程、PyTorch基本用法。能在单卡上训练一个简单模型,理解训练循环的每个步骤。这个阶段不需要碰分布式,先把单机玩熟。
第二阶段(2-3个月):深入计算域。学CUDA基础、显存管理、混合精度训练。能用Profiler分析性能瓶颈,能做基本的算子优化。同时开始接触Docker和Kubernetes,把训练环境容器化。
第三阶段(2-3个月):分布式训练。学DDP、DeepSpeed、NCCL。能在多卡上训练中等规模模型,理解数据并行、模型并行、流水线并行的原理和适用场景。开始做性能对比和调优。
第四阶段(2-3个月):推理部署。学Triton、TensorRT、ONNX Runtime。能把训练好的模型部署成API服务,做量化和批处理优化,搭建监控系统。
第五阶段(持续):生产实践。在实际项目中积累经验,学习容错、成本控制、自动化运维。这个阶段没有终点,因为生产环境的问题永远比实验环境复杂。
7.2 值得反复看的资料与工具
官方文档永远是最好的学习资料。PyTorch的分布式训练教程、NVIDIA的CUDA编程指南、DeepSpeed的文档和示例、Triton的快速入门,这些都要反复看。不要只看一遍就觉得自己会了,实际动手时你会发现很多细节文档里写了但你没注意到。
工具方面,Nsight Systems和Nsight Compute是性能分析的双子星,必须熟练。PyTorch Profiler适合快速定位框架层问题。NCCL的调试环境变量要整理成自己的速查表。Kubernetes的官方教程和kubectl cheat sheet要常备手边。
社区方面,PyTorch论坛、NVIDIA开发者论坛、Stack Overflow上的AI Infra相关标签都值得关注。遇到问题先搜索,大概率有人遇到过类似情况。但要注意甄别答案的时效性,AI Infra领域变化很快,两年前的方案可能已经过时了。
7.3 如何判断自己真正入门了
最后说一个我自己的判断标准:当你遇到一个没见过的AI Infra问题时,能在一小时内定位到是计算、存储、网络还是调度层面的问题,并且能说出至少两种可能的解决方案及其优缺点,那就算入门了。如果还能进一步估算每种方案的成本和收益,那就是进阶了。
这个标准听起来简单,但需要大量的实践积累。我建议每解决一个问题就写一篇简短的复盘笔记,记录问题现象、排查过程、根本原因、解决方案和后续改进。坚持半年,你会发现自己对AI Infra的理解完全不一样了。
我个人在实际操作中的体会是,AI Infra最难的不是某个具体技术,而是建立系统思维。你要能在一个问题出现时,快速在脑子里过一遍整条链路,判断哪个环节最可疑,然后用工具去验证。这种能力没有捷径,只能靠一个个项目喂出来。但一旦建立起来,你会发现不管是换框架、换硬件还是换业务场景,你都能快速上手。