大模型微调的硬件选型,核心只有一件事——把”参数 × 精度 × 优化器开销”算清楚。以 7B 模型为例,FP16 全量微调要 60–80 GB 显存;换 LoRA 可压到 15 GB 左右;再上 QLoRA 4-bit 量化,一张 24 GB 的消费级显卡就能跑起来。70B 模型则通常需要 80 GB × 2 或 H200 这类专业卡。下面给出从公式到表格的完整估算,以及一段能落地的训练脚本。
一、显存从哪里来
一块 GPU 在训练时,要同时装下五样东西:模型参数、梯度、优化器状态(Adam 通常是动量 + 方差两份)、激活值、CUDA 运行时开销。参数和优化器是大头,激活值随 batch 与序列长度放大。粗估公式是:
训练显存 ≈ 参数 × 2(模型+梯度) + 参数 × 优化器系数 + 激活值
全量 FP16 + AdamW 时,优化器系数约 12(参数以 FP32 存 + 动量 + 方差),所以 7B 模型光是参数侧就要 7 × (2+12) ≈ 98 GB——这还没算激活。QLoRA 把基础模型压到 4-bit(系数降到约 0.5),优化器只对 LoRA 矩阵跑,总开销能压到 6–10 GB。
把这笔账落到具体配置上:同一张 4090 跑同一个 7B 模型,全量微调 80% 会 OOM;LoRA FP16 占用约 16 GB,留出 8 GB 给激活和上下文,够跑;QLoRA 4-bit 直接压到 7 GB 上下,空出大半张卡做 batch 并行。换一个角度看:硬件没变,选择改了,可跑的方案从”理论上能行”变成”工程上能跑”,这就是显存估算的真正价值——把”凭感觉选配置”换成”算清楚再选”,失败重试的时间被压到了最小。
二、不同规模的显存参考
下面这张表汇总了 7B、13B、30B、70B 模型在四种微调方案下的常见显存占用(单位 GB,基于 16-bit 基座 + 4-bit QLoRA 量化方案的常见经验值,实际数值会随 batch 与序列长度浮动):
| 模型规模 | 全量 FP16 | LoRA FP16 | QLoRA 8-bit | QLoRA 4-bit |
|---|---|---|---|---|
| 7B | 60–80 | 15–20 | 9–10 | 6–8 |
| 13B | 120–130 | 28–32 | 17–18 | 9–12 |
| 30B | 280–290 | 60–65 | 38–40 | 20–24 |
| 70B | 660–680 | 140–150 | 88–90 | 46–50 |
把上表翻译成消费级显卡,会更直观:
| 显卡 | 显存 | 能直接做的事 |
|---|---|---|
| RTX 3060 / 4060 | 8–12 GB | 7B QLoRA、小 batch |
| RTX 3090 / 4090 | 24 GB | 7B–13B LoRA、30B QLoRA |
| RTX 5090 | 32 GB | 13B–20B LoRA、更长上下文 |
| A100 80GB | 80 GB | 70B QLoRA 或 30B 全量 |
| H200 141GB | 141 GB | 70B LoRA 舒适运行 |
| 多卡 H100 × 4 | 320 GB | 70B 全量微调 |
落到选型上,一句话:个人开发者基本只在 4090 / 5090 这一档选择;中小团队用单卡 A100 80GB 配 QLoRA 就能覆盖 70B 场景;真正要全量微调 70B 起步就是 4 张 H100 级别的算力。
按模型规模倒推选卡,走这四步基本不会错:
- 7B 量级:目标显存 ≤ 24 GB,优先 4090 / 5090 一档,QLoRA 4-bit 留足 batch 空间;
- 13B–30B 量级:目标显存 30–80 GB,选 A100 80GB 配 LoRA FP16,长序列再上 QLoRA 8-bit;
- 70B 量级:目标显存 100 GB+,单卡 A100 跑 QLoRA 4-bit 紧巴巴,H100 / H200 才有富余;
- 70B 全量微调:显存起步 600 GB,走 4×H100 + ZeRO-3 / FSDP,单机多卡或多机互联都要规划好。
对比几家云厂商的报价会发现一个反直觉:同样跑 7B QLoRA 100 步,单卡 A100 按小时租比买一张 4090 整机摊销要贵 3 到 5 倍。所以一旦任务稳定下来,自购一张 4090/5090 + 偶尔上云调 70B,比”全云端”更划算。硬件选型从来不是单看峰值显存,还要把使用频次和云端单价一起算进来。
三、显存省下来的四个开关
把同一份任务跑进更小的卡,核心就四件事:换量化方案、缩 batch、加梯度检查点、用分页优化器。
- 选精度:QLoRA 4-bit 比 LoRA FP16 再省 3–4 倍,优先用 4-bit;
- 缩 batch:把 per-device batch 调到 1–2,gradient accumulation 步数同步放大,效果几乎不变;
- 开 gradient checkpointing:用时间换空间,激活值能省 60% 以上;
- 用 8-bit / paged optimizer:bitsandbytes 提供的 PagedAdamW 能把优化器状态卸载到 CPU 内存,OOM 概率骤降。
下面这段代码演示了”用 QLoRA 跑 7B 模型微调”的最小骨架,重点看 BitsAndBytesConfig 与 preparemodelforkbittraining 这两处开关。
四、能直接跑起来的 QLoRA 配置
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
# 4-bit 量化配置:NF4 + 双量化 + fp16 计算
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype="float16",
bnb_4bit_use_double_quant=True,
)
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen2.5-7B-Instruct",
quantization_config=bnb_config,
device_map="auto",
)
# 关键:把 layernorm 等层切到 fp32,否则 4-bit 训练不稳定
model = prepare_model_for_kbit_training(model)
lora_cfg = LoraConfig(
r=16, lora_alpha=32, lora_dropout=0.05,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
task_type="CAUSAL_LM",
)
model = get_peft_model(model, lora_cfg)
model.print_trainable_parameters()
# 预期输出:trainable params: ~10M || all params: 7B || trainable%: ~0.14
注意几个易错点:targetmodules 必须覆盖到你模型里实际存在的投影层名(在 Qwen 系是 qproj/kproj/vproj/oproj,LLaMA 系还要加 gateproj/upproj/downproj);preparemodelforkbittraining 不调用的话,LayerNorm 跑在 4-bit 下会出现 NaN;device_map=”auto” 会自动把层切到多卡,单卡场景下也能让显存尽量摊开。
到这里,微调硬件的”算账、选卡、配置”三条线就完整了——剩下的就是按 batch 调一调,跑起来看 GPU 利用率是否在 70%–90% 之间,过低就放大 batch,过高就开检查点。
最后再点一个跨场景的细节:多卡训练时,通讯开销常常被低估。NVLink 满速的双向带宽约 600–900 GB/s,跨节点走 IB/RoCE 普遍只有 25–50 GB/s,差一个数量级。如果把 ZeRO-2/FSDP 切得太细,每个 step 都要同步梯度,慢卡会拖住整队;实战里 4 卡以上、模型超过 30B 的场景,优先把通讯密集的层(Embedding、最后输出层)合并到主卡,把可独立并行的 Transformer Block 块尽量铺到从卡,平均通讯量能降三成以上。
常见问题(FAQ)
Q1:7B 模型全量微调最低要什么卡?
至少单卡 A100 80GB,且建议开启 ZeRO-2 / FSDP 才能稳定跑;消费级卡请用 QLoRA。
Q2:70B 模型能在单卡 A100 上跑吗?
可以走 QLoRA 4-bit,显存约 46–50 GB,只是 batch 与序列长度会被卡得很紧。
Q3:显存不够时,加显存还是加卡便宜?
单卡扩容到 80GB 性价比最高;再往上不如直接上 H100 / H200 或用 DeepSpeed ZeRO-3 多卡分摊。