一、精度量化(实操命令 + 参数)

1. FP16 / BF16(通用,训练 + 推理)

vLLM 启动(默认开启,显式指定)

bash

运行

# BF16(NVIDIA GPU 推荐)
vllm-serve \
  --model /path/model \
  --dtype bfloat16 \
  --max-model-len 8192 \
  --port 8000

# FP16
vllm-serve \
  --model /path/model \
  --dtype float16

TensorRT-LLM 编译阶段指定精度

bash

运行

trtllm-build \
  --checkpoint_dir /path/model \
  --output_dir ./trt_engine \
  --dtype fp16 \
  --max_seq_len 8192

2. INT8 量化

vLLM 运行时量化

bash

运行

vllm-serve \
  --model /path/model \
  --quantization int8 \
  --dtype float16

TRT-LLM 编译时开启 INT8

bash

运行

trtllm-build \
  --checkpoint_dir /path/model \
  --output_dir ./trt_engine \
  --quantization int8

3. INT4-AWQ(线上推理主流,显存最优)

提前使用 autoawq 离线把模型转成 AWQ 量化权重(推荐离线量化,不在线实时转)

bash

运行

# 1. 离线量化模型(一次生成,反复使用)
python -m awq.entry --model_path /hf_model \
  --quant_path /awq_4b_model \
  --w_bit 4 --q_group_size 128

# 2. vLLM 加载 AWQ 4bit 模型
vllm-serve \
  --model /awq_4b_model \
  --quantization awq \
  --dtype float16

TRT-LLM + INT4-AWQ

bash

运行

trtllm-build \
  --checkpoint_dir /awq_4b_model \
  --output_dir ./trt_4b_engine \
  --quantization int4_awq

4. FP8(H100/H200 专属)

仅新卡支持,框架 + 驱动 + CUDA 版本达标后启用

bash

运行

vllm-serve \
  --model /path/model \
  --dtype fp8

二、KV Cache 专项优化(推理核心,vLLM 为主)

1. 限制最大上下文(防长对话爆显存,必配)

bash

运行

vllm-serve \
  --model /path/model \
  --max-model-len 4096  # 根据业务设置,越小越省显存

2. 显存使用率阈值(预留空间给 KV Cache,生产标准配置)

取值 0.7 ~ 0.85,不要拉满 1.0

bash

运行

vllm-serve \
  --model /path/model \
  --gpu-memory-utilization 0.8

3. KV Cache 分片(多卡 TP 并行场景)

多卡自动分片,只需指定张量并行数,KV 会分散到各卡:

bash

运行

# 4卡 TP,KV Cache 自动分片到4张卡
vllm-serve \
  --model /path/model \
  --tensor-parallel-size 4 \
  --max-model-len 4096

说明:vLLM 默认开启 PagedAttention,无需额外参数,开箱即用分页显存。


三、模型并行(TP / PP 拆分,超大模型 34B/70B)

1. 张量并行 TP(推理首选)

单卡放不下,横向拆分权重

bash

运行

# 4卡运行70B模型
vllm-serve \
  --model /70b_awq_4b \
  --tensor-parallel-size 4 \
  --quantization awq \
  --max-model-len 4096

2. 流水线并行 PP(超长序列 / 超深模型)

TP + PP 组合使用

bash

运行

# 4TP + 2PP,总共占用 8 张卡
vllm-serve \
  --model /path/model \
  --tensor-parallel-size 4 \
  --pipeline-parallel-size 2

3. TRT-LLM 并行配置(编译阶段指定)

bash

运行

trtllm-build \
  --checkpoint_dir /path/model \
  --output_dir ./trt_engine \
  --tp_size 4 \
  --pp_size 2

四、批处理 & 并发控制

1. 动态 Batch(vLLM 原生支持,无额外参数)

vLLM 默认启用动态批,无需配置;如需硬限制最大 batch(压测 / 防雪崩):

bash

运行

vllm-serve \
  --model /path/model \
  --max-batch-size 64

2. 梯度累积(仅 训练场景,PyTorch/DeepSpeed)

训练代码 / 配置文件设置,小 batch 模拟大 batch,降显存

python

运行

# 伪代码示意
batch_size = 8
gradient_accumulation_steps = 4  # 等效 batch = 8*4=32

DeepSpeed 配置 ds_config.json

json

{
  "train_batch_size": 32,
  "train_micro_batch_size_per_gpu": 8,
  "gradient_accumulation_steps": 4
}

3. 外部限流(防止突发流量 OOM)

结合 Nginx / 接口网关做 QPS 限流;K8s 侧可配合 HPA + 自定义指标,根据显存使用率自动扩缩容。


五、显存碎片 & 显存泄漏 现场处理

1. 查看 GPU 占用、定位僵尸进程

bash

运行

# 全局查看GPU
nvidia-smi

# 实时监控
nvidia-smi dmon

# 查看占用GPU的进程 + PID
fuser -v /dev/nvidia*

# 杀掉异常GPU进程(谨慎操作)
kill -9 进程ID

2. 服务重启(解决显存碎片最直接手段)

bash

运行

# 容器化环境 K8s 重启 Pod
kubectl delete pod <pod-name> -n <namespace>

# 裸机直接停启进程
pkill -f vllm-serve
# 再重新启动服务

3. K8s 调高共享内存 shm(多卡必备,间接解决显存类报错)

Pod yaml 配置:

yaml

spec:
  containers:
  - name: llm-server
    image: xxx
    resources:
      limits:
        nvidia.com/gpu: 4
    volumeMounts:
    - name: dshm
      mountPath: /dev/shm
  volumes:
  - name: dshm
    emptyDir:
      medium: Memory
      sizeLimit: 4Gi  # 调高共享内存

六、MIG 切卡实操(推理节点多租户显存隔离)

1. 宿主机开启 / 管理 MIG(A100/H100)

bash

运行

# 查看当前GPU及MIG状态
nvidia-smi -L

# 全局开启MIG模式
nvidia-smi -mig 1

# 创建指定规格MIG实例(示例:切分成7个实例)
nvidia-smi mig -cci

# 关闭MIG,恢复整卡模式
nvidia-smi -mig 0

2. K8s 识别 MIG 实例

重启 nvidia-device-plugin,集群自动识别细分 GPU 资源,调度时直接使用即可,yaml 无需特殊改动。


七、底层开关优化(CUDA Graph / 显存复用)

1. vLLM 开启 CUDA Graph(加速 + 降显存波动)

bash

运行

vllm-serve \
  --model /path/model \
  --enable-cuda-graph

2. 环境变量全局显存 / 通信优化(写入启动脚本 / K8s env)

bash

运行

# 写入环境变量,全局生效
export NCCL_P2P_DISABLE=0
export NCCL_SHM_DISABLE=0
export CUDA_LAUNCH_BLOCKING=0

K8s Pod 中配置环境变量:

yaml

spec:
  containers:
  - name: llm
    env:
    - name: NCCL_P2P_DISABLE
      value: "0"
    - name: NCCL_SHM_DISABLE
      value: "0"

八、模型加载优化(解决启动瞬间 OOM)

1. 模型预加载 + 常驻

做成系统服务 / 容器,节点启动自动加载模型,不动态反复加载。

2. 离线预处理权重

所有量化、分片、转换离线完成,不要在线服务中做转换。

3. 高速存储挂载

使用 NAS/IB-NVMe 挂载模型目录,降低加载时延与瞬时峰值。


九、场景化组合命令(直接拿去生产用)

场景 1:7B/13B 单卡推理(线上标准)

bash

运行

vllm-serve \
  --model /awq_4b_13b \
  --quantization awq \
  --dtype float16 \
  --max-model-len 4096 \
  --gpu-memory-utilization 0.8 \
  --enable-cuda-graph \
  --port 8000

场景 2:70B 4 卡 TP 推理(大模型标配)

bash

运行

vllm-serve \
  --model /awq_4b_70b \
  --quantization awq \
  --tensor-parallel-size 4 \
  --max-model-len 4096 \
  --gpu-memory-utilization 0.75

场景 3:训练场景(BF16 + 梯度累积)

仅改训练脚本 & DeepSpeed 配置,不使用 INT4。


十、面试口述总结(实操版答题话术)

问:这些显存调优方法你平时怎么落地操作?

答:

  1. 量化:优先离线把模型转成 INT4-AWQ 权重,vLLM/TRT-LLM 启动时指定量化参数,直接降低基础显存占用;H100/H200 会开启 FP8。
  2. KV Cache:严格配置 max-model-len 限制上下文,设置 gpu-memory-utilization 在 0.7~0.85 预留空间,多卡场景用张量并行自动分片 KV。
  3. 超大模型:34B/70B 采用 TP/PP 多卡并行拆分权重,突破单卡显存上限。
  4. 泄漏与碎片:日常用 nvidia-smifuser 定位僵尸进程并清理,出现显存碎片就重启服务;K8s 环境调高 Pod 的 /dev/shm 大小。
  5. 多租户推理:对 H100/A100 节点开启 MIG 切卡,做显存隔离,提升整卡利用率。
  6. 同时统一配置 NCCL、CUDA 相关环境变量,开启 CUDA Graph,从底层进一步优化显存与运行效率。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐