1. 先说清楚:AI Infra 到底是什么,为什么这么火
这两年 AI Infra 这个名词出现频率越来越高,招聘网站上相关岗位的薪资也一路水涨船高。但如果你去问十个人“AI Infra 具体做什么”,大概率会得到十种不同的回答——有人说是做 GPU 集群管理的,有人说是优化训练框架的,还有人说是搞推理加速的。这些说法都对,但都不完整。
我自己的理解是:AI Infra 是连接“算法创意”和“算力硬件”之间的那一整层工程体系。算法工程师写出一段模型代码,GPU 厂商提供芯片,中间怎么把代码高效跑在芯片上、怎么让几百张卡协同工作不浪费、怎么在模型训练到一半的时候从容应对显存溢出和断点续训、怎么把训练好的模型以最低延迟和成本部署上线——这些脏活累活,全部属于 AI Infra 的范畴。它不是一个单一技术栈,而是硬件、系统、框架、平台、工程化方法的合集。
对于想入行的人来说,最大的困难恰恰就在这里。不同于“学 Python 写爬虫”或者“学 React 做前端”这种目标明确的路线,AI Infra 的知识图谱是横向铺开的,你得同时懂一点 CUDA、懂一点网络、懂一点分布式系统、懂一点容器编排,还得懂模型训练的基本原理。网上资料虽然多,但散落在不同社区、不同仓库、不同技术博客里,初学者很容易迷失方向。
这篇文章就是基于我自己从零开始摸爬滚打的经验,整理出来的一条相对清晰的学习路径。我会尽量少讲虚的,多讲具体的知识点、工具、实操步骤和面试中常被问到的内容。适合准备转行做 AI Infra 的开发工程师、相关专业还没确定方向的学生,以及已经在做算法但想往底层走的同学参考。
2. 学习路线怎么设计:先搭骨架,再填血肉
2.1 先搞清楚 AI Infra 的四大核心板块
我见过太多人一上来就抱着 CUDA 编程的教材啃,啃了两周发现矩阵乘法都调不明白,自信心备受打击,最后放弃。这种学法的问题在于:把“某一个垂直技能”当成了“整个方向的基础”,顺序搞反了。
AI Infra 的知识体系,在我看来可以分成四个互相关联的板块:
第一个是硬件与集群层。包括 GPU 的架构特征(显存、带宽、算力)、CPU 与 GPU 的协作方式、服务器之间的网络拓扑(以太网、InfiniBand、RDMA)、存储系统(分布式文件系统、对象存储)。这一层的核心问题是:算力资源长什么样,怎么把它们组织起来变成可用的集群。
第二个是框架与并行策略层。包括 PyTorch 分布式训练原理、数据并行(DP)、模型并行(MP)、流水线并行(PP)、张量并行(TP)、ZeRO 优化器、混合精度训练(FP16/BF16)等。这一层的核心问题是:怎么让模型训练逻辑在多个设备上正确且高效地执行。
第三个是调度与平台层。包括 Docker 容器、Kubernetes、GPU 调度插件(如 Volcano、Koordinator)、任务编排、资源隔离与配额管理、镜像仓库等。这一层的核心问题是:怎么让多个团队、多个任务共享一个集群,同时互不干扰。
第四个是推理与工程化层。包括模型推理加速(TensorRT、vLLM、TGI)、量化(INT8、INT4)、服务化部署(TorchServe、Triton)、弹性伸缩、模型版本管理、监控告警(Prometheus、Grafana)等。这一层的核心问题是:模型训练完之后,怎么让它稳定高效地对外提供服务。
这四个板块不是并列关系,而是层层递进的。硬件是底座,框架在硬件之上抽象出编程接口,平台再在框架之上做资源管理,推理则把最终产物交付给用户。初学者的学习顺序理论上应该从下往上,但我不建议在第一层停留太久。
2.2 推荐的分阶段学习路线
我自己的学习过程大概经历了三个阶段,每个阶段对应不同的目标和产出。
第一阶段是“建立全局认知”阶段。目标是搞清楚上面四个板块分别解决什么问题,涉及哪些核心组件,相互之间什么关系。这个阶段不需要深抠细节,也不用写太多代码,重点是快速在脑海里画出一张地图。我当时用的主要方式是看技术大会的视频演讲(比如各类云厂商的 AI 基础设施分享)、读一些大厂的工程博客,以及刷知乎和 InfoQ 上的入门文章。大概花了两到三周,就能对“AI Infra 包含什么”有一个基本概念。
第二阶段是“垂直突破 + 横向串联”阶段。选择一个方向作为主线深入下去,比如先从 PyTorch 分布式训练入手,从单卡训练逐步扩展到多卡训练,然后引入容器化,最后上 Kubernetes。过程中你会发现,每一个新问题都在逼迫你接触上一层或下一层的知识——当你运行一个分布式训练任务发现网卡带宽不够时,你会本能地去了解 RDMA;当你手动在一百台机器上操作环境装到崩溃时,你会自然地想用容器来解决。
第三阶段是“项目实战”阶段。这个阶段必须动手做一个相对完整的项目,比如把一个小模型(如 GPT-2 规模)在一个多机多卡的集群上完成训练、监控、部署的全流程。这个项目会成为你面试时最重要的谈资,也是验证前面所有学习效果的唯一标准。
2.3 学习过程中最常见的心态误区
关于学习路线,我先说一个不少人踩过的坑:沉迷八股,不做实验。AI Infra 因为面试题相对固定,市面上确实流传着各种“AI Infra 八股文”汇总,我自己面试时也背过不少。八股本身不是坏事,它可以帮助你在短时间内覆盖知识盲区,但如果只背八股而不理解背后的系统设计逻辑,面试官连环追问两轮就会露馅。
另一个误区是贪多求全。看到别人说 CUDA 很重要就去学 CUDA,看到招聘 JD 写着熟悉 Kubernetes 就去考 CKA,结果每个方向都只学了个皮毛。我的建议是:在以一条主线(比如分布式训练)垂直深入之前,不要花大量时间碰其他方向。先把一条链路跑通,其他知识都是围绕这条链路自然长出来的。
3. 四大核心板块逐个拆解:每个方向学什么、怎么学
3.1 硬件与集群:理解计算资源的底层逻辑
很多软件背景的同学会下意识地排斥硬件知识,觉得那是“搞机房的人”才需要管的。但实际上,AI Infra 里 70% 的性能问题最终都能追溯到硬件配置或拓扑结构上。你不必会设计服务器,但你必须读懂一张 GPU 集群的拓扑图。
先从最基本的开始。你需要搞清楚一张 GPU 卡的关键参数:显存大小、显存带宽、FP16/BF16 算力、卡间互联带宽。以目前主流的 NVIDIA A100 为例,80GB 显存,显存带宽超过 2TB/s,BF16 算力约 312 TFLOPS,NVLink 卡间互联带宽 600GB/s。这些数字意味着什么?意味着模型参数和激活值能放到多大的显存里,意味着每一轮迭代的数据搬运速度上限在哪里。面试官问你“为什么 A100 训练比 V100 快”,你要能回答出不只是算力提升,还有显存带宽和互联带宽的同步升级。
集群层需要理解的关键词是RDMA(Remote Direct Memory Access)和InfiniBand。简单来说,RDMA 允许一台机器的网卡直接读写另一台机器的内存,绕过操作系统内核和 CPU 的中转,从而大幅降低延迟、提升带宽。在多机分布式训练中,梯度同步是每一轮迭代都发生的操作,通信效率直接决定训练吞吐。你可以用一个小实验来感受差距:对比用 TCP 和用 RDMA 跑一次 all-reduce 操作,观察同样的数据量下耗时差多少。
学习这类知识不怎么需要动手,但要结合图表看一些集群拓扑的案例。推荐阅读 NVIDIA 官方关于 DGX 系列集群的文档,以及 InfiniBand 的架构科普。国内一些大厂的技术博客也偶尔会分享大规模训练集群的运维实践,这些案例能帮你把抽象概念具象化。
3.2 框架与并行策略:这是核心中的核心
如果说整个 AI Infra 只有一块知识点需要你反复咀嚼,我毫不犹豫会选“分布式训练”。原因很直接:训练任务是大规模算力消耗的主要场景,也是工程复杂度最高的地方。
先理解数据并行(DP)。最简单的方式是把同一个模型复制到 N 张卡上,每张卡分到一批不同的数据,独立做前向和反向计算,然后通过 all-reduce 操作把各自的梯度汇总求平均,再统一更新参数。数据并行的优点是实现简单,缺点是每张卡都要存一份完整模型副本,模型大到放不进单卡显存时就无能为力了。ZeRO 就是在此基础上的优化——把模型参数、梯度和优化器状态切分到不同设备上,需要时再通过通信收集,这就是为什么 ZeRO Stage 3 能训练比单卡显存大数倍的模型。
再理解模型并行(MP)。当单张卡放不下完整模型时,把模型的不同“层”切到不同卡上就是流水线并行(PP),把同一层的参数矩阵切成多份分布在多张卡上就是张量并行(TP)。实际大模型训练中,往往是 TP、PP、DP 甚至 ZeRO 混合使用,比如训练千亿参数模型时,常见的做法是在单机内用 TP 和 PP,跨机用 DP 或 ZeRO。
PyTorch 的torch.distributed是学习这些策略的最佳切入点。我建议从最基础的多卡训练代码开始写起:
import torch import torch.distributed as dist dist.init_process_group(backend="nccl") local_rank = dist.get_rank() device = torch.device(f"cuda:{local_rank}") # 模型包装为 DDP model = nn.Linear(1024, 1024).to(device) ddp_model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[local_rank]) # 数据分配到当前进程 sampler = torch.utils.data.distributed.DistributedSampler(dataset) dataloader = torch.utils.data.DataLoader(dataset, sampler=sampler, batch_size=32) for epoch in range(10): for batch in dataloader: optimizer.zero_grad() output = ddp_model(batch[0].to(device)) loss = criterion(output, batch[1].to(device)) loss.backward() optimizer.step()这段代码看似简单,但里面藏着几个关键点:init_process_group负责初始化进程组,DistributedSampler保证不同的进程拿到不重叠的数据,DistributedDataParallel会自动完成梯度同步。你随便改一点就能引发连锁排查——比如忘了设置local_rank环境变量,程序会直接报错;比如用了不恰当的 batch size,可能导致显存溢出。
除了代码本身,你还得理解几个“为什么”。为什么同步训练的全局 batch size 变大会影响收敛精度?因为梯度是全局平均的,等价于用更大的 batch 做一次更新,学习率可能需要相应调整。为什么混合精度训练能加速?因为 FP16 的算力通常比 FP32 高一倍以上,显存占用减半,同时配合GradScaler防止下溢。这些问题既是面试高频题,也是你实际调优时绕不开的点。
3.3 调度与平台:把算力变成“自来水”
当你真正开始在一个几十甚至上百人的团队里做算法研发时,会发现一个残酷的现实:GPU 资源永远不够用。训练一个模型要一周,调参可能要跑几十次实验,每个人都需要算力,但总资源有限——这时候就需要一套资源管理和调度系统。
Kubernetes 在 AI 场景的应用实际上做了不少扩展。原生 K8s 调度 GPU 的方式比较简单粗暴,通过nvidia.com/gpu这个资源字段来声明,但功能有限。比如它不支持 GPU 显存的精细划分(一张 A100 可以按显存切成多份给不同任务使用),也不支持 NUMA 感知和拓扑感知的调度(把需要高速通信的任务调度到同一台机器的不同卡上)。为了解决这些问题,社区出现了多种 GPU 调度方案:NVIDIA 官方的k8s-device-plugin是最基础的 GPU 设备插件;Volcano 是一个面向高性能计算和 AI 场景的调度器,支持公平调度、队列优先级、任务依赖;Koordinator 则是去年开始非常火的一个开源项目,主打 QoS 感知和混部,可以在离线任务与在线任务之间动态分配资源。
学习容器和 K8s 时,我不建议直接去啃 K8s 官方文档从头到尾读一遍,而是应该带着任务学。先自己做一个镜像,把 PyTorch 训练环境全部装好,然后写一个 K8s Job 的 YAML 文件跑通一个单卡训练任务,再逐步扩展到多机多卡。格式上参考最简单的模板:
apiVersion: batch/v1 kind: Job metadata: name: pytorch-training-job spec: template: spec: restartPolicy: OnFailure containers: - name: trainer image: myrepo/pytorch-train:latest command: ["torchrun", "--nproc_per_node=2", "--nnodes=2", "train.py"] resources: limits: nvidia.com/gpu: 2 nodeSelector: gpu-type: a100这个 YAML 模板会引导你逐步了解几个核心概念:Job是一次性任务,跑完就结束;nvidia.com/gpu是设备资源的声明方式;nodeSelector用来选择带特定标签的节点。当你真正把一个多机多卡任务跑通,你对容器、调度器、环境变量、网络模式的理解会比看十篇文章都深。
3.4 推理与工程化:模型上线是最后一步
训练出模型只是第一步,把模型变成能服务用户的产品才是工程闭环。推理优化的核心目标有两个:降低延迟和提升吞吐。这两个目标在某种程度上是互斥的——为了降低单请求延迟,你可能要把请求独占一个 GPU 实例;为了提升吞吐,你得实现请求的批量动态拼接。
主流的推理加速方法中,vLLM是当下大模型推理绕不开的一个开源项目。它的核心卖点是 PagedAttention,简单类比就是操作系统里的虚拟内存分页机制——把 KV Cache 切分成固定大小的块,不要求物理上连续,按需分配和释放,把显存利用率提高数倍,从而支持更大的并发。TGI(Text Generation Inference)是 Hugging Face 推出的推理服务,同样支持连续批处理和量化推理。TensorRT 则是 NVIDIA 官方的推理优化库,可以对模型做层融合、精度校准和算子替换,适合对延迟有极致要求的场景。
推理这块的实操入门比较直接:拉一个 vLLM 的镜像,启动一个 OpenAI 兼容的 API 服务,然后压测吞吐量,再做不同并发、不同 max-token 参数下的对比实验。你会发现一些有意思的现象:并发从 1 提升到 16,总吞吐大幅上升,但单请求延迟也跟着上升;max-token 越长,解码阶段的计算量越大,对显存带宽的要求越高。这些现象背后都对应具体的系统设计权衡,值得写笔记。
4. 从零到一实操演练:两周搭出一个迷你训练平台
4.1 环境准备:没有 A100 也能玩起来
很多人一听到 AI Infra 就条件反射地问:是不是得先有一张 A100?其实不用。学习阶段完全可以用云平台的按量付费 GPU 实例或者单机的消费级显卡(RTX 3090 24GB、RTX 4090 24GB)完成大部分实验。消费级显卡不支持 NVLink,但你在单机内跑起 DDP 仍然是有效的学习体验。更进一步,你甚至可以在一台不带 GPU 的机器上,用gloo作为 PyTorch 的后端,模拟多进程环境下的分布式训练流程,理解数据分发和梯度汇总的逻辑。
我的推荐配置清单是:
- 一台 4 核 16GB 内存的 Linux 服务器(云厂商按量付费即可)
- 一张至少 16GB 显存的 GPU(如果预算有限,先跑通 CPU 版本的分布式逻辑也行)
- Docker 和 Docker Compose
- minikube(本地单节点 Kubernetes)或者直接买一个 3 节点的托管 K8s 集群
- Python 3.10、PyTorch 2.x、CUDA 12.x(装对应的版本)
4.2 三个动手项目:从跑脚本到管集群
我在学习阶段给自己设计了三个递进的项目,每完成一个,能力就上一个台阶。
第一个项目:用 PyTorch DDP 训练一个简单的语言模型。数据集就用 WikiText-103 或者自己造一批文本数据。先单卡训练一个 baseline,记录吞吐量(每秒处理的 token 数),然后改用 2 卡 DDP,再改 4 卡,观察扩展效率的变化。最后分析一下:为什么卡数翻倍,吞吐量没有翻倍?瓶颈是通信、数据加载还是负载不均衡?
第二个项目:把训练任务容器化并在 Kubernetes 上运行。Dockerfile 里装好 Python 依赖和训练代码,构建镜像推到私有仓库,然后在 K8s 集群上声明一个 Job 运行。这个项目会逼着你学会镜像构建、容器日志查看、环境变量注入、GPU 资源声明等基础设施知识。我到现在还记得第一次把多机任务在 K8s 上跑通时的成就感——所有错综复杂的配置终于在一条kubectl logs日志里得到了回应。
第三个项目:部署一个模型推理服务并提供 HTTP API。拿你训练好的模型,用 vLLM 启动一个 server,然后写一个小脚本测试并发请求下的响应时间和吞吐量。接着用 Prometheus 采集 GPU 利用率、显存占用、请求延迟这些指标,用 Grafana 画一个简单的 Dashboard。这个项目做完,你对“AI Infra 全链路”这个概念就有了无比具体的感知。
4.3 时间分配建议
整个阶段如果每天能投入 3-4 小时,大约 4-6 周可以完成。其中 50% 的时间花在分布式训练的代码实验和调参上,25% 花在 K8s 和容器学习上,15% 花在推理部署上,最后 10% 用于整理笔记和知识体系复盘。
复盘这一步特别容易被人忽略。我的习惯是每完成一个项目,就写一篇笔记,把遇到的问题、排查思路、最后的解决方案记录下来,同时对照网上已有的最佳实践找差距。这个过程积累出的笔记,后来直接成了我面试时的复习资料,比任何培训班资料都有效。
5. “AI Infra 八股”高频考点与面试准备
5.1 面试官到底想考察什么
在准备“AI Infra 八股”之前,你要明白面试官问这些问题不是在考背诵,而是在考察你有没有系统性思维。比如“讲讲 ZeRO 的三种阶段”,表面上是在问概念,实际上是想看你能不能清晰地解释显存分配、通信开销、时间空间权衡之间的关系。所以你不仅要背结论,还要能推导。
把各大厂 AI Infra 岗位的面经汇总起来,高频考点主要集中在以下几个方面:
分布式训练原理(数据并行/模型并行/流水线并行的优缺点与适用场景)、all-reduce 的实现方式和通信量与百亿千亿模型训练时的显存估算方法、混合精度训练的数值问题与解决方案、Kubernetes GPU 调度的基本流程和 GPU 虚拟化方案对比、推理优化中的 KV Cache 和连续批处理原理。如果把这些问题一个个吃透,你会发现自己对整个领域的理解已经超出了“八股”层面。
5.2 几个典型问题举例
拿“训练一个 7B 参数模型,需要多少显存”这个经典问题来说。回忆一个简单的估算公式:模型参数为 7B,以 FP16 存储,参数占显存 14GB;训练时还需要保存梯度,同样 FP16,又是 14GB;优化器状态如果用 AdamW,需要为每个参数保存两份动量(FP32),大约 42GB。这样一算,仅训练中的“参数 + 梯度 + 优化器状态”就需要约 70GB 显存,再加上激活值和临时变量,一张 A100 80GB 勉强够用,实际要跑起来就得靠 ZeRO 或张量并行切分了。这类问题没有标准答案,但能体现你的工程敏感度。
再比如“为什么大模型推理时显存占用随 batch size 增大而快速上涨”。解码阶段的 KV Cache 大小和序列长度、batch size、层数、注意力头维度成正比。可以估算一下:7B 模型,40 层,KV Cache 每个 token 可能需要几百 KB,当 batch size 和序列长度增大时,显存压力会很快超过模型权重本身。理解了这一点,你就明白为什么 vLLM 的 PagedAttention 那么重要了——它本质上是在用高效的显存管理换取更大的并发能力。
5.3 项目经验怎么包装
面试问到你项目经验时,不要只说“我用 PyTorch 训练了一个模型”。要把项目中体现 Infra 思维的决策讲出来:为什么选这个并行策略、遇到了什么性能瓶颈、如何定位和解决、系统扩展到什么规模。我当时把“容器化训练 + 监控采集 + 服务部署”的迷你平台作为案例讲完之后,面试官明显更感兴趣的是我把数据加载从单线程改成num_workers=8并且用了prefetch_factor之后的吞吐变化数据,而不是模型本身的效果。
6. 常见问题与踩坑经验
坑 1:多卡训练速度没提升反而变慢了。排查思路很简单,先用
nvidia-smi看 GPU 利用率,再用top看 CPU 和网络占用。最常见的罪魁祸首是数据加载成为瓶颈——每轮迭代 GPU 都在等 CPU 准备好数据,你增加 GPU 数量只是让等待更明显。解决方案一般是增加 DataLoader 的num_workers、开启pin_memory、用 TFRecord 等更高效的格式替代小文件读取,或者用torch.compile减少单步计算时间。坑 2:Kubernetes 上容器里看不到 GPU。几乎每个第一次在 K8s 上跑 GPU 任务的人都会遇到这个问题。原因通常是你没有部署 NVIDIA 的 device plugin,Kubelet 根本不知道节点上有 GPU 资源。先在节点上运行
nvidia-smi确认驱动正常,然后部署k8s-device-plugin的 DaemonSet,再检查 pod 的 resources 声明是否包含nvidia.com/gpu。坑 3:训练过程中显存逐渐增长。如果显存不是一开始就溢出,而是在训练中途持续增长直到 OOM,大概率是代码里有显存泄漏——比如在循环中不断创建新的计算图、忘记对 loss 或梯度做 detach、或者 DataLoader 返回的数据没有及时释放。用环境变量
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True可以让 PyTorch 的显存分配器更灵活,但根本解法还是定位到泄漏源头。多机训练时如果使用了 gloo 后端却跑在多 GPU 环境,也会出现莫名的性能问题,记得统一用 nccl。坑 4:分布式训练一跑多进程就报地址已在使用。这是因为你没有正确处理进程序号和通信端口。先用
dist.init_process_group里设置好init_method,最常见的做法是指定一个 master 节点的地址和端口,其余节点连过来;在同一个节点上启动多个进程时,每个进程要分配不同的local_rank。端口冲突的典型场景是你上次跑的进程没杀干净,ps -ef查一下清理掉就解决了。坑 5:模型训练时 loss 不下降。这个问题和 Infra 其实关系不大,但很多人排查时容易误伤 Infra——先检查数据预处理和标签的是否对齐,再检查学习率和 warmup 策略,最后才去查分布式训练梯度同步是否正确。有一种诡异的场景是,DDP 训练时梯度正常但 loss 不变,原因可能是某个进程的数据加载有缓存,导致每个 epoch 拿到相同数据,检查一下 DataLoader 的重置逻辑。
7. 个人体会:AI Infra 学习中最值得投资的三个能力
最后分享一点我的真实想法。AI Infra 方向的知识更新速度极快,今天还在用 ZeRO Stage 2,明天可能所有大厂都切到 FSDP 或者自研的混合并行方案了。所以我越来越觉得,具体工具和框架的熟练程度反而不是最关键的,更重要的是三个底层能力。
第一个是定位问题的能力。一个任务没跑起来,你要能从上到下层层排查——先看资源够不够,再看网络通不通,再看代码报什么错,最后看日志指标是否异常。这种排查顺序听起来简单,但很多人遇到问题是一上来就怀疑代码逻辑,在正确但不够高效的地方浪费时间。
第二个是估算数量级的能力。不管是显存占用、通信耗时还是推理延迟,养成在动手前先粗算一下的好习惯。等你训练一个 13B 模型之前,能提前预判需要几张卡、每张卡多少显存、数据加载要多少带宽,很多失败在开始前就能避免。这种能力在面试中也非常加分的。
第三个是持续学习的习惯。AI Infra 的社区非常活跃,几乎每个月都有新工具和新论文出来。我的做法是每周固定花一些时间刷 arXiv 上系统方向的论文、看 GitHub 上热门仓库的 Release Notes、关注几个大厂工程团队的博客。不需要每篇都精读,但起码要能跟上大方向的变化。
从零开始学 AI Infra 确实不容易,这个方向的知识密度大、涉及面广、上手门槛高。但反过来想,正因为门槛高,真正踏踏实实走过这条路径的人才会拥有长期的职业竞争力。如果你正在这条路上,或者准备出发,希望这篇路线图能帮你少走一些弯路,也欢迎在实践中多动手验证——毕竟在这个领域,跑通一个实验比读十篇文章都管用。