理解训练 vs 推理时对计算图、内存、精度的不同要求

太棒了,这不仅是理论,更是顶级部署工程师和普通算法工程师的分水岭。

在面试或实战中,很多人以为"部署不就是把 model.train() 改成 model.eval() 吗?"
大错特错。

训练(Training)和推理(Inference/Serving)在底层逻辑上是两种完全不同的生物。下面我从计算图、内存、精度三个维度,结合真实项目场景来剖析。


1. 计算图 (Computational Graph)

核心差异:动态图 vs 静态图 (Dynamic vs Static)

  • 训练时 (PyTorch 默认模式):

    • 机制: 就像边走边铺路。你需要保留中间所有的激活值(Activations),因为反向传播(Backpropagation)要回来求导。
    • 代价: 灵活但慢,且显存占用是推理的 N 倍(因为存了中间状态)。
  • 推理时 (Deployment 模式):

    • 机制: 就像看着地图开车。路已经铺好了,不需要回头(没有反向传播),走过的地方直接拆掉(释放显存)。
    • 应用技术:图编译与算子融合 (Graph Compilation & Kernel Fusion)
实际项目应用:

场景 A:Python 后端太慢,QPS 上不去

  • 痛点: 用原生 PyTorch 跑推理,每次计算 LayerNorm -> Linear -> GELU 都要启动 3 个 CUDA Kernel。启动 Kernel 的 CPU 开销(Overhead)比 GPU 计算还慢。

  • 工程解法: 使用 TensorRTTorchCompile

    • 动作: 我们把 PyTorch 的动态图"冻结"并"编译"成静态图(Engine)。
    • 黑魔法(算子融合): 编译器发现 LayerNorm + Linear + GELU 是连在一起的,它会自动把这 3 个小算子合并成 1 个大算子 (Fused Kernel)
    • 收益: 显存读写次数减少,Kernel 启动开销消失,推理速度直接提升 30%-50%

场景 B:动态输入形状 (Dynamic Shape)

  • 痛点: 静态图最怕变。但用户输入有时候是 10 个字,有时候是 1000 个字。

  • 工程解法: 在构建 TensorRT 引擎时,我们需要配置 Optimization Profiles

    • 告诉引擎:"我的输入最小是 1,最大是 4096,最常用的是 512。"
    • 引擎会针对这几个尺寸分别生成最优的计算图代码。

2. 内存管理 (Memory Management)

核心差异:吞吐优先 vs 延迟优先

  • 训练时:

    • 重点: 为了存下巨大的梯度(Gradients)和优化器状态(Optimizer States),我们通常把 Batch Size 设得很小。显存主要被参数和中间变量吃掉了。
  • 推理时:

    • 重点: 梯度没了,优化器没了。显存空出来一大半!
    • 新魔鬼: KV Cache
实际项目应用:

场景 A:显存明明有空闲,为什么并发上不去?

  • 现象: 7B 模型占 14G 显存,24G 的卡还剩 10G。但并发才到 5 就报 OOM。

  • 原因: 原生 PyTorch 的内存分配是碎片化的。KV Cache 就像一条长蛇,随着生成越来越长,它需要连续内存。一旦中间有点碎片,就塞不进去了。

  • 工程解法: PagedAttention (vLLM)

    • 原理: 像操作系统一样,把显存切成 16MB 的小块(Page)。
    • 动作: 不再要求连续显存。这条蛇的头在第 1 页,尾巴可以在第 100 页。
    • 收益: 显存利用率接近 100%,并发量(Throughput)直接翻倍。

场景 B:长文本推理显存爆炸

  • 现象: 用户传了 20k 的文档。

  • 工程解法: KV Cache Offloading (缓存卸载)

    • 推理引擎监测到显存吃紧,自动把暂时不用的 KV Cache 块从 GPU 显存 搬运到 CPU 内存
    • 等需要算那一块时,再搬回来。
    • 这完全改变了内存的使用逻辑,是用带宽换容量。

3. 精度 (Precision)

核心差异:数值稳定性 vs 计算速度

  • 训练时:

    • 需要 Mixed Precision (FP16/BF16 + FP32) 。为什么?因为梯度更新时,那个 Δw\Delta wΔw 经常非常小(比如 0.0000010.0000010.000001)。如果是纯 FP16,这个小数字直接变成 0 了(Underflow),模型就学不到东西。所以关键时刻必须用 FP32 存累加器。
  • 推理时:

    • 模型权重已经固定了,不需要更新。
    • 我们可以极其激进地压缩精度。
实际项目应用:

场景 A:老板嫌 4 张 A100 太贵,要换成 2 张 4090

  • 痛点: 显存不够。

  • 工程解法: Post-Training Quantization (PTQ, 训练后量化)

    • 动作: 既然不做梯度更新,我们可以把权重从 FP16 (16-bit) 砍成 Int8 (8-bit) 甚至 Int4 (4-bit)
    • 原理: 大模型的参数是冗余的。把 1.2345 变成 1.2,输出结果几乎没变。
    • 收益: 显存减半再减半。Qwen-72B 原本要 144G,Int4 只要 42G。

场景 B:W8A8 vs W4A16 (量化策略选择)

  • 这是一个高级部署决策。

    • W4A16 (Weight Int4, Activation FP16):

      • 应用: 适合 Batch Size = 1 的场景(如手机端、低并发)。
      • 原因: 此时瓶颈在读取权重(Memory Bound)。把权重压得越小越好。
    • W8A8 (Weight Int8, Activation Int8):

      • 应用: 适合 高并发服务端
      • 原因: 此时瓶颈在计算矩阵乘法(Compute Bound)。W8A8 可以利用 Tensor Core 的 Int8 计算单元,算力是 FP16 的 2 倍。
    • 决策点: 作为工程师,你要根据业务是"只有老板一个人用"还是"几万用户同时用",来选择不同的量化精度方案。


总结:一张表看懂差异

维度 训练 (Training) 推理 (Inference) 工程应用关键点
计算图 动态,需保存中间状态用于反向传播 静态,用完即丢,无反向传播 TensorRT / 算子融合 (消除启动开销)
显存大头 激活值 (Activations) + 梯度 + 优化器 KV Cache + 权重 PagedAttention / vLLM (解决内存碎片)
显存策略 显存换速度 (Checkpointing) 空间换时间 (KV Cache) KV Offloading (CPU/GPU 互换)
精度要求 高 (FP32/BF16 混合),防止梯度消失 低 (Int8/Int4),只需结果大致对 GPTQ/AWQ 量化 (降本增效的神器)
输入形态 Batch Size 固定,长度通常 Padding 对齐 Batch 动态,长度参差不齐 Continuous Batching (动态插入请求)

面试/实战金句:

"在推理部署中,我们将训练时的计算密集型 问题转化为了IO密集型 问题(Memory Bound)。因此,我们的优化手段不再是像训练那样死磕梯度下降,而是通过量化减小体积PagedAttention 优化内存布局 、以及算子融合减少显存读写,来榨干每一滴显存带宽。"

相关推荐
阿杰学AI1 小时前
AI核心知识33——大语言模型之ASR(简洁且通俗易懂版)
人工智能·ai·语言模型·自然语言处理·语音识别·asr·自动语音识别
安徽正LU o561-6o623o71 小时前
(露)转棒疲劳仪 大鼠转棒疲劳仪 小鼠转棒疲劳仪
人工智能
北京耐用通信1 小时前
工业通信升级利器:耐达讯自动化Ethernet/IP转CC-Link网关让IO模块兼容无忧!
网络·人工智能·科技·物联网·网络协议·自动化·信息与通信
用户2462932067671 小时前
标书智能体(三)——生成标书正文代码+提示词
人工智能
凌晨一点的秃头猪1 小时前
SIFT尺度不变特征变换
人工智能·计算机视觉
JEECG低代码平台1 小时前
Jeecg AI 应用开发平台 v1.0.0,首个开源版本发布
人工智能·开源
强化学习与机器人控制仿真1 小时前
Holosoma 开源人形机器人强化学习训练部署框架
人工智能·stm32·神经网络·机器人·强化学习·具身智能·人形机器人
金融小师妹1 小时前
机器学习驱动分析:ADP就业数据异常波动,AI模型预测12月降息概率达89%
大数据·人工智能·深度学习·编辑器·1024程序员节
智慧化智能化数字化方案1 小时前
ERP规划——解读86页大型企业业务流程优化及ERP整体规划方案【附全文阅读】
大数据·人工智能·erp整体规划方案·erp实施项目建设方案·erp基本概念培训