练像是铺设高铁网络——大工程、重吞吐看的是长周期的稳定与整体进度 推理像是高铁的日常运营——看的是单班次的准点率、响应时间以及应对突发客流的能力。很多算法工程师在转向系统/工程岗位时会撞上同一堵墙训练优化与推理优化的底层逻辑、评价指标和技术栈是完全不同的两套体系。在训练里行得通的省显存大法到推理场景可能反而是性能毒药推理里大放异彩的 INT8 量化在训练阶段则会让梯度直接崩盘。这篇文章会沿着评价指标 → 系统瓶颈 → 优化手段的脉络把这两个世界拆开讲清楚并在最后给出一份可以直接背下来的核心思想对照。一、训练优化追求极致的吞吐与长周期稳定训练是一个极其昂贵的离线过程。前向传播要保存大量的激活值Activations反向传播据此计算梯度最后再更新权重。整个链路冗长而沉重——它的优化哲学只有一句话吃尽每一滴算力和显存。1. 核心评价指标Throughput Stabilitysamples/s, tokens/s, step time宏观吞吐指标。训练不关心某一张图片算得多快只关心一天能跑完多少万亿个 Token、一轮 Epoch 要几天。优化目标是缩短整体的Time-to-Convergence收敛时间。GPU 利用率SM Memory Bandwidth训练最怕的就是GPU Starvation——GPU 饿着。如果 DataLoader 跟不上或者 CPU 预处理拖了后腿GPU 利用率就会周期性地掉到 0。常见解法是多进程加载、Prefetch乃至把预处理直接搬到 GPU 上。显存峰值Peak Memory训练最大的敌人是 OOM。为了塞下更大的 Batch Size 或更大的模型需要Activation Checkpointing用重新计算换显存、Mixed Precision混合精度省一半显存等手段把显存压到极限。2. 分布式通信瓶颈DDP / FSDP / ZeRO当训练扩展到几百上千张卡通信时间往往比计算时间还长。DDP需要在每一步同步全局梯度AllReduceZeRO / FSDP为了省显存把模型参数、梯度、优化器状态都切分到各个 GPU 上代价是更频繁的 AllGather 与 ReduceScatter 通信。优化的核心思路只有四个字计算与通信重叠Overlap。当 GPU 在算第 N 层时网卡应该已经在同步第 N1 层的参数。再往下走就要拼高速网络IB、RoCE和拓扑感知路由了。3. 容易被忽视的基础设施开销Checkpoint 开销百亿参数模型的权重 优化器状态可达几百 GB每隔几小时存一次 Checkpoint可能让整个集群停摆十几分钟。异步保存Async Save和分布式文件系统优化是关键。长周期稳定性跑一个月的大模型训练硬件必然会出故障——ECC 错误、网卡掉线、节点掉电。如何快速检测坏节点、从最近的 Checkpoint 飞速恢复是工程团队的核心 KPI远比单卡性能调优更重要。二、推理优化追求极致的低延迟与高并发推理是在线过程。模型权重固定不需要反向传播不需要保存中间激活值。挑战完全转向另一边如何又快又省地应对海量、动态的用户请求。1. 核心评价指标Latency, Throughput Tail Latency单请求 Latency用户点下按钮后多久看到结果首字响应时间 TTFT或端到端耗时。这直接决定用户体验。Batch Throughput服务器一秒能处理多少并发请求QPS。P95 / P99 尾延迟Tail Latency在线服务最看重的指标。如果平均延迟是 50ms但 P99 是 500ms就意味着 1% 的用户体验极差。在微服务链路里一个节点的 P99 抖动会引发整条链路的超时雪崩。2. 系统与架构开销H2D / D2H Copy很多时候模型前向极快比如 2ms但把图片从主机内存拷到 GPUH2D、再把结果拷回来D2H花了 5ms。锁页内存Pinned Memory和 GPU Direct 在此尤为重要。预处理 / 后处理瓶颈用 Python 做图像 Resize/Crop 或文本 Tokenize由于 GIL 的存在CPU 容易被打满进而拖垮整个服务。生产级推理通常要用 C 或 Triton 重写这部分逻辑。Dynamic Shape 处理真实用户输入长度参差不齐。如果是静态 Batch就要把所有输入 Padding 到最大长度浪费惊人。推理引擎必须原生支持动态维度——这正是 vLLM 等框架引入Continuous Batching连续批处理的根本原因。3. 极致的底层编译与计算优化TensorRT / TVM 等推理引擎因为不需要求导图可以通过 AOT提前编译做极致的图优化剔除冗余节点并根据当前 GPU 架构Auto-tuning选择最快的底层汇编指令。Operator Fusion算子融合把连续的多个算子Conv BN ReLU或者复杂的 FlashAttention合并成一个 CUDA Kernel极大减少内存读写次数缓解 Memory Bound访存瓶颈。INT8 / FP16 / BF16 量化没有反向传播就不用担心梯度下溢出可以激进地使用低精度。INT8 量化不仅让计算速度翻倍还能让显存占用和访存带宽需求下降约 75%。CUDA Graph对执行极快的小模型CPU 发射指令Launch Kernel的时间可能比 GPU 真正计算的时间还长。CUDA Graph 允许把所有 GPU 指令预先录制好、一次性发射彻底消灭 CPU 调度开销。三、思想的碰撞Pipeline 还是 Jitter训练可以接受一定的 pipeline 延迟只要整体吞吐高 在线推理更怕 P99 抖动和 batch 等待。这一句几乎可以涵盖两个世界的全部张力。训练场景下追求整体吞吐——为了榨干带宽和算力我们会构建非常深的数据流水线CPU 在预处理第 10 个 BatchGPU 在算第 8 个 Batch网卡在同步第 6 个 Batch。某个 Batch 从进入内存到完成参数更新可能经历了相当长的绝对时间Pipeline Latency。但这没关系——只要水管一直是满的宏观上的吞吐就是高的。推理场景下最怕抖动和等待——为了提高吞吐服务通常会把多个用户请求凑成一个 Batch 一起算Dynamic Batching。但这马上面临一个死局如果等太久才凑齐 32 个请求 → GPU 效率高了但第一个进来的请求超时了Latency 爆炸如果完全不等来一个算一个 → GPU 算力大量闲置吞吐崩了。所以推理系统必须设置严格的 Timeout并在调度算法上做极其精细的妥协在不牺牲 P99 尾延迟的前提下尽可能提高并发吞吐。这是一门妥协的艺术。四、一图总览训练 vs 推理维度训练推理运行模式离线、长周期在线、动态请求核心指标Throughput、Time-to-ConvergenceLatency、QPS、P95/P99最大敌人OOM、GPU Starvation、通信瓶颈尾延迟抖动、Batch 等待、调度开销显存策略拼命省Checkpointing、ZeRO拼命压缩、量化、共享 KV Cache数值精度混合精度保留梯度精度激进量化INT8、FP8 都敢上批处理大 Batch、静态 Shape动态 Batch、Continuous Batching底层编译关注计算图与通信调度AOT 编译、Operator Fusion、CUDA Graph稳定性焦点月级稳定性、故障恢复毫秒级抖动、长尾治理优化哲学填满流水线消灭抖动五、一句话速记训练工程师的口头禅是 显存又爆了算力还没打满 → 想尽办法省显存、填满流水线。推理工程师的口头禅是 谁的代码又让 P99 飙升了 200 毫秒 → 想尽办法抠底层、去抖动。理解了这两套迥然不同的世界观再去看 vLLM、TensorRT-LLM、DeepSpeed、Megatron 这些框架的设计取舍就不会觉得它们长得很像但又用法不同——它们本就生长在两片不同的土壤里。写在最后训练优化考验的是对系统资源的全局调度能力推理优化考验的则是对每一微秒的洁癖。前者像是工业总设计师后者像是钟表匠。能在两者之间自由切换的工程师才是真正吃透了深度学习工程化这件事。