在单张显卡上微调 70B 模型。
QLoRA 能把原本需要一整机架的训练任务,变成只需要一张 48 GB GPU 就能完成的任务。以下是能放下什么、每月要多少钱,以及这项技术在哪里会失效。
简短的答案
- 70B 上的 QLoRA
- ~61 GB — 在较短序列长度下可放入一张 48 GB 显卡,在 80 GB 显卡上则绰绰有余
- 70B 模型的全量微调
- ~1,232 GB — 多节点集群,我们并不出租此类配置
- 这个比例
- 显存需求大约减少20×,而这项技术在大多数任务上都能达到大部分效果
- 在这里的费用
- 起价$286/月,整月显卡归您独享,而不只是单次运行期间
实际能放下什么
LoRA 冻结原模型,只在每个权重矩阵旁边训练一小对低秩矩阵。QLoRA 更进一步,把冻结的权重以 4-bit 存储。因此,您必须保留在显存里的内容也随之彻底改变。
全量微调为何不会
BF16 下的全量微调,每个参数大约需要 16 字节:权重本身 2 字节,梯度 2 字节,Adam 的两个动量用 FP32 存储占 8 字节,再加上主副本。这是一个固定的倍数,而且非常吃显存。
| 模型 | QLoRA | 全量微调 | 比例 | 这意味着什么 |
|---|---|---|---|---|
| Llama 3.1 8B | 13 GB | 141 GB | 11× | 一张 24 GB 显卡 |
| Gemma 3 27B | 27 GB | 475 GB | 17× | 一张 48 GB 显卡 |
| Qwen 3 32B | 31 GB | 563 GB | 18× | 一张 48 GB 显卡 |
| Llama 3.3 70B | 61 GB | 1,232 GB | 20× | 一张 80 GB 显卡 |
这些是数量级估算,为激活值留出了适度的余量——足以帮您选择机器,但不足以保证某次具体运行的结果。序列长度和批大小会显著影响 QLoRA 一列的数值;全量微调一列几乎不受影响,因为它由固定的每参数 16 字节主导。
逐个模型来看
我们产品目录里,能以 QLoRA 训练每个模型的最便宜节点,以及日后为其提供推理服务所需的服务器。
| 模型 | 训练显存 | 最便宜的训练节点 | 最便宜的推理服务节点 |
|---|---|---|---|
| Llama 3.1 8B | 13 GB | NVIDIA L4 | NVIDIA L4 |
| Mistral Small 24B | 25 GB | NVIDIA RTX A6000 | NVIDIA L4 |
| Gemma 3 27B | 27 GB | NVIDIA RTX A6000 | NVIDIA L4 |
| Qwen 3 32B | 31 GB | NVIDIA RTX A6000 | NVIDIA L4 |
| Llama 3.3 70B | 61 GB | NVIDIA A100 PCIe | 2 × NVIDIA L4 |
训练需要显存;推理服务需要显存和带宽。常见的情况是:合适的训练卡是便宜的大显存卡,合适的推理卡是昂贵的高速卡——既然这里两者都是按月计费,把它们分别放在不同的机器上运行,往往比在一台机器上妥协更划算。
实际运行
Axolotl 作为配置器中预装镜像之一提供。以下是在一台空白服务器上、单张显卡完成的完整训练流程。
$ mkdir -p /scratch/ft && cd /scratch/ft
$ cat > qlora.yml <<'YAML'
base_model: meta-llama/Llama-3.3-70B-Instruct
load_in_4bit: true
adapter: qlora
lora_r: 16
lora_alpha: 32
lora_dropout: 0.05
lora_target_linear: true
sequence_len: 2048
sample_packing: true
gradient_checkpointing: true
micro_batch_size: 1
gradient_accumulation_steps: 16
num_epochs: 2
learning_rate: 0.0001
optimizer: paged_adamw_8bit
bf16: true
datasets:
- path: /scratch/ft/data.jsonl
type: chat_template
output_dir: /scratch/ft/out
YAML
$ docker run --rm --gpus all --ipc=host --shm-size=16g \
-v /scratch/ft:/workspace -v /scratch/models:/root/.cache/huggingface \
-e HF_TOKEN="$HF_TOKEN" \
axolotlai/axolotl:main-latest \
axolotl train /workspace/qlora.yml
$ nvidia-smi dmon -s um
# If memory sits just under the card's total, you are one long batch
# away from an out-of-memory error four hours into the run.
# Lower sequence_len or micro_batch_size now, not then.
真正重要的几个设置
一个月的费用
包月租用对训练比对推理服务更重要,原因在于:一个微调项目从来不是一次运行。第一次因数据问题失败,第二次过拟合,第三次终于跑通,之后还要换着不同的秩再跑五次。
| 机器 | 显卡显存 | 每月 | 适合 |
|---|---|---|---|
| NVIDIA L4 | 24 GB | $125/月 | QLoRA 最高支持到8B |
| NVIDIA RTX 5090 | 32 GB | $335/月 | QLoRA 最高支持到32B |
| NVIDIA A100 PCIe | 40 GB | $392/月 | QLoRA 最高支持到32B |
| NVIDIA RTX A6000 | 48 GB | $286/月 | QLoRA 最高支持到32B |
| NVIDIA A100 PCIe | 80 GB | $1,091/月 | QLoRA 最高支持到70B |
把它和按项目、而不是按单次运行计算的按小时计费方式做个对比:收支平衡指南已经算过这笔账。一台为了迭代而存在三周的服务器,正是计量计费比包月租期更贵的典型情况。
LoRA 失效的地方
这是一项非常好的技术,但有明确的边界,租用之前,值得先弄清楚您落在边界的哪一侧。
教会模型一个真正全新的领域。LoRA 擅长调整行为,却不擅长注入知识。一个从未接触过您所在领域的模型,不会靠一个低秩适配器学会它。
更改词表或分词器。新增的 token 需要训练嵌入,这超出了适配器能触及的范围。
在数十亿 token 上继续做预训练。这属于全量微调,需要用到上表右侧那一栏的服务器 —— 不止一个节点,超出了我们出租的范围。
为了跑分再挤出最后两分。全量微调在边际上仍然更胜一筹。如果您拿的正是这点边际收益的钱,LoRA 就不是正确的工具。
至于其他一切场景 —— 语气、格式、结构,或者基础模型本就略知一二的领域 —— 单张显卡上的 QLoRA,只用一小部分服务器成本,就能达到大部分的效果。这是一笔取舍,而对大多数人实际微调的模型来说,这是一笔划算的取舍。