实践 指南 · 阅读需 10 分钟

# 在单张显卡上微调 70B 模型。

QLoRA 能把原本需要一整机架的训练任务，变成只需要一张 48 GB GPU 就能完成的任务。以下是能放下什么、每月要多少钱，以及这项技术在哪里会失效。

简短的答案

- **70B 上的 QLoRA:** ~61 GB — 在较短序列长度下可放入一张 48 GB 显卡，在 80 GB 显卡上则绰绰有余
- **70B 模型的全量微调:** ~1,232 GB — 多节点集群，我们并不出租此类配置
- **这个比例:** 显存需求大约减少**20×**，而这项技术在大多数任务上都能达到大部分效果
- **在这里的费用:** 起价$286/月，整月显卡归您独享，而不只是单次运行期间

## 实际能放下什么

LoRA 冻结原模型，只在每个权重矩阵旁边训练一小对低秩矩阵。QLoRA 更进一步，把冻结的权重以 4-bit 存储。因此，您必须保留在显存里的内容也随之彻底改变。

冻结权重 每个参数 4 bit 70B 模型需要 35 GB。每一步都会被读取，但从不更新，因此不需要梯度。

适配器 约占参数量的 1–2% BF16 下一两个 GB。这是唯一会变化的权重，也是训练结束后您唯一需要保留的东西。

优化器状态 Adam 优化器，仅作用于适配器 每个训练参数对应两个矩（动量）。这一项在全量微调中占主导，在这里则几乎可以忽略。

激活值 可变的那一项 会随批大小和序列长度增长。梯度检查点用大约多 30% 的计算量，换取显存占用的大幅下降 —— 这是训练放不下时常用的手段。

## 全量微调为何不会

BF16 下的全量微调，每个参数大约需要 16 字节：权重本身 2 字节，梯度 2 字节，Adam 的两个动量用 FP32 存储占 8 字节，再加上主副本。这是一个固定的倍数，而且非常吃显存。

**训练显存：QLoRA 与全量微调对比**

| 模型 | QLoRA | 全量微调 | 比例 | 这意味着什么 |
|---|---|---|---|---|
| Llama 3.1 8B 8B 参数 | 13 GB | 141 GB | 11× | 一张 24 GB 显卡 全量微调：8卡节点 |
| Gemma 3 27B 27B 参数 | 27 GB | 475 GB | 17× | 一张 48 GB 显卡 全量微调：8卡节点 |
| Qwen 3 32B 32B 参数 | 31 GB | 563 GB | 18× | 一张 48 GB 显卡 全量微调：8卡节点 |
| Llama 3.3 70B 70B 参数 | 61 GB | 1,232 GB | 20× | 一张 80 GB 显卡 全量微调：超过一个节点 |

这些是数量级估算，为激活值留出了适度的余量——足以帮您选择机器，但不足以保证某次具体运行的结果。序列长度和批大小会显著影响 QLoRA 一列的数值；全量微调一列几乎不受影响，因为它由固定的每参数 16 字节主导。

## 逐个模型来看

我们产品目录里，能以 QLoRA 训练每个模型的最便宜节点，以及日后为其提供推理服务所需的服务器。

**训练 QLoRA 最便宜的节点，以及用于服务训练结果的节点**

| 模型 | 训练显存 | 最便宜的训练节点 | 最便宜的推理服务节点 |
|---|---|---|---|
| Llama 3.1 8B | 13 GB | [NVIDIA L4](https://gpuserver.io/zh/gpu/nvidia-l4) 每张显卡 24 GB · $125/月 | [NVIDIA L4](https://gpuserver.io/zh/gpu/nvidia-l4) $125/月 |
| Mistral Small 24B | 25 GB | [NVIDIA RTX A6000](https://gpuserver.io/zh/gpu/rtx-a6000) 每张显卡 48 GB · $286/月 | [NVIDIA L4](https://gpuserver.io/zh/gpu/nvidia-l4) $125/月 |
| Gemma 3 27B | 27 GB | [NVIDIA RTX A6000](https://gpuserver.io/zh/gpu/rtx-a6000) 每张显卡 48 GB · $286/月 | [NVIDIA L4](https://gpuserver.io/zh/gpu/nvidia-l4) $125/月 |
| Qwen 3 32B | 31 GB | [NVIDIA RTX A6000](https://gpuserver.io/zh/gpu/rtx-a6000) 每张显卡 48 GB · $286/月 | [NVIDIA L4](https://gpuserver.io/zh/gpu/nvidia-l4) $125/月 |
| Llama 3.3 70B | 61 GB | [NVIDIA A100 PCIe](https://gpuserver.io/zh/gpu/a100-80gb) 每张显卡 80 GB · $1,091/月 | [2 × NVIDIA L4](https://gpuserver.io/zh/gpu/nvidia-l4) $285/月 |

训练需要显存；推理服务需要显存*和*带宽。常见的情况是：合适的训练卡是便宜的大显存卡，合适的推理卡是昂贵的高速卡——既然这里两者都是按月计费，把它们分别放在不同的机器上运行，往往比在一台机器上妥协更划算。

## 实际运行

Axolotl 作为配置器中预装镜像之一提供。以下是在一台空白服务器上、单张显卡完成的完整训练流程。

在单张显卡上跑一次 QLoRA 训练

```
$ 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.
```

## 真正重要的几个设置

lora_r 16 到 64 秩（rank），也是质量与显存之间最主要的调节旋钮。16 是一个稳妥的默认值；超过 64 很少物有所值，除非您教给模型的是真正全新的知识，而不只是格式或风格。

lora_target_linear true 对每一层线性层都做适配，而不只是注意力层。代价很小，效果却持续优于只适配注意力层的默认设置。

sequence_len 影响显存最大的单一因素 激活值会随之等比例变化。把它减半，大致就能把显存里可变的那部分也减半。请把它设置为您数据实际的长度，而不是模型的最大长度。

gradient_checkpointing true，几乎总是如此 大约慢 30%，但正因为有它，70B 模型才能勉强塞进一张显卡。只有在显存有富余时才该关闭它。

micro_batch_size & 梯度累积 二者相互权衡 有效批大小是两者的乘积。显存吃紧时，把微批保持为 1，提高累积步数 —— 梯度效果不变，峰值显存更低，速度略慢。

优化器 paged_adamw_8bit 8-bit 优化器状态，辅以 CPU 分页作为安全阀，用来吸收原本会在第四小时让训练中断的显存峰值。

## 一个月的费用

包月租用对训练比对推理服务更重要，原因在于：一个微调项目从来不是一次运行。第一次因数据问题失败，第二次过拟合，第三次终于跑通，之后还要换着不同的秩再跑五次。

**按服务器划分的微调项目成本**

| 机器 | 显卡显存 | 每月 | 适合 |
|---|---|---|---|
| [NVIDIA L4](https://gpuserver.io/zh/gpu/nvidia-l4) 300 GB/s | 24 GB | $125/月 | QLoRA 最高支持到8B |
| [NVIDIA RTX 5090](https://gpuserver.io/zh/gpu/rtx-5090) 1,792 GB/s | 32 GB | $335/月 | QLoRA 最高支持到32B |
| [NVIDIA A100 PCIe](https://gpuserver.io/zh/gpu/a100-40gb) 1,555 GB/s | 40 GB | $392/月 | QLoRA 最高支持到32B |
| [NVIDIA RTX A6000](https://gpuserver.io/zh/gpu/rtx-a6000) 768 GB/s | 48 GB | $286/月 | QLoRA 最高支持到32B |
| [NVIDIA A100 PCIe](https://gpuserver.io/zh/gpu/a100-80gb) 1,935 GB/s | 80 GB | $1,091/月 | QLoRA 最高支持到70B |

把它和按项目、而不是按单次运行计算的按小时计费方式做个对比：[收支平衡指南](https://gpuserver.io/zh/guides/monthly-vs-hourly)已经算过这笔账。一台为了迭代而存在三周的服务器，正是计量计费比包月租期更贵的典型情况。

## LoRA 失效的地方

这是一项非常好的技术，但有明确的边界，租用之前，值得先弄清楚您落在边界的哪一侧。

**教会模型一个真正全新的领域。**LoRA 擅长调整行为，却不擅长注入知识。一个从未接触过您所在领域的模型，不会靠一个低秩适配器学会它。

**更改词表或分词器。**新增的 token 需要训练嵌入，这超出了适配器能触及的范围。

**在数十亿 token 上继续做预训练。**这属于全量微调，需要用到上表右侧那一栏的服务器 —— 不止一个节点，超出了我们出租的范围。

**为了跑分再挤出最后两分。**全量微调在边际上仍然更胜一筹。如果您拿的正是这点边际收益的钱，LoRA 就不是正确的工具。

至于其他一切场景 —— 语气、格式、结构，或者基础模型本就略知一二的领域 —— 单张显卡上的 QLoRA，只用一小部分服务器成本，就能达到大部分的效果。这是一笔取舍，而对大多数人实际微调的模型来说，这是一笔划算的取舍。

## 选定显卡，整个项目期间都用它。

每种配置都是按月租用，带 root 权限，不计量计费 —— 这正是反复迭代微调实际需要的条件。

[浏览产品目录](https://gpuserver.io/zh/#catalog) [阅读指南](https://gpuserver.io/zh/guides)

## 其他指南

- [付款 · 8 分钟 用加密货币支付服务器费用 从点击支付按钮到最终获得 root 权限之间究竟发生了什么、应该选择哪种加密货币，以及首次付款时容易亏钱的四个常见错误。 阅读指南](https://gpuserver.io/zh/guides/pay-in-crypto)
- [选型 · 9 分钟 模型实际需要多少显存 “能否放得下”背后的完整计算方法：模型的权重大小、KV 缓存占用，以及经验法则常常出现三倍误差的两个关键环节，本文将为您逐一拆解。 阅读指南](https://gpuserver.io/zh/guides/vram-sizing)
- [选型 · 7 分钟 NVLink 还是 PCIe：您的任务需要哪一个 显卡之间的互联方式何时决定您的整体吞吐量、何时又毫无影响，以及如何在为错误的节点付费之前判断自己属于哪一种情况。 阅读指南](https://gpuserver.io/zh/guides/nvlink-vs-pcie)

---

来源：https://gpuserver.io/zh/guides/lora-finetune/。本文件由与网站相同的数据生成；如果此处的数字与页面不一致，以页面为准，本文件视为过期——权威来源是 https://gpuserver.io/。
