Chapter 07
PEFT 集成与 4bit/8bit 量化
Axolotl 的 PEFT / 量化是 YAML 几个字段的组合。本章按 4 种组合讲。
7.1四种典型组合
| 组合 | adapter | load_in_* | 显存(7B) |
|---|---|---|---|
| 全参 bf16 | 未设 | 未设 | ~80 GB |
| LoRA bf16 | lora | 未设 | ~22 GB |
| LoRA + 8bit | lora | load_in_8bit: true | ~16 GB |
| QLoRA (4bit) | qlora | load_in_4bit: true | ~14 GB |
7.2LoRA 完整字段
adapter: lora
lora_r: 16
lora_alpha: 32
lora_dropout: 0.05
lora_target_modules:
- q_proj
- k_proj
- v_proj
- o_proj
- gate_proj
- up_proj
- down_proj
lora_modules_to_save: # 扩词表时加这两个
- embed_tokens
- lm_head
lora_fan_in_fan_out: false # GPT-2 类要 true
peft_use_dora: false # 开 DoRA
peft_use_rslora: false # 开 rsLoRA
peft_layers_to_transform: null # 只对部分 layer 上 LoRA
peft_layers_pattern: model.layers
7.3QLoRA:bnb 量化集成
adapter: qlora # 必须 qlora(不是 lora)
load_in_4bit: true
bnb_4bit_quant_type: nf4
bnb_4bit_compute_dtype: bfloat16
bnb_4bit_use_double_quant: true
lora_r: 16
lora_alpha: 32
lora_target_modules: [q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj]
lora_dropout: 0.05
optimizer: paged_adamw_8bit # 配合 QLoRA 用 paged optimizer
7.4LoftQ / PiSSA 初始化
QLoRA 长跑配 LoftQ 更稳,快收敛配 PiSSA。Axolotl 直接支持:
peft_init_lora_weights: loftq # 或 pissa / pissa_niter_4 / olora
loftq_bits: 4
loftq_iter: 1
7.5其他 8bit 优化器
| optimizer | 说明 |
|---|---|
| adamw_torch | 标准 |
| adamw_bnb_8bit | bnb 8bit Adam |
| paged_adamw_8bit | + 分页(QLoRA 必备) |
| adamw_torch_fused | PyTorch fused AdamW(A100+) |
| schedule_free_adamw | schedule-free AdamW |
| came | CAME (Confidence-guided Adaptive Memory Efficient) |
7.6实战配方(7B QLoRA + DoRA)
base_model: Qwen/Qwen2.5-7B-Instruct
load_in_4bit: true
bnb_4bit_quant_type: nf4
bnb_4bit_compute_dtype: bfloat16
bnb_4bit_use_double_quant: true
adapter: qlora
lora_r: 16
lora_alpha: 32
lora_dropout: 0.05
peft_use_dora: true # ★ + DoRA
peft_init_lora_weights: pissa # ★ + PiSSA
lora_target_modules:
- q_proj
- k_proj
- v_proj
- o_proj
- gate_proj
- up_proj
- down_proj
datasets:
- path: tatsu-lab/alpaca
type: alpaca
sequence_len: 2048
sample_packing: true
micro_batch_size: 2
gradient_accumulation_steps: 8
num_epochs: 2
learning_rate: 2e-4
optimizer: paged_adamw_8bit
bf16: auto
flash_attention: true
gradient_checkpointing: true
output_dir: ./out
7.7合并 LoRA 推理
axolotl merge-lora my_qlora.yml \
--lora_model_dir ./out \
--output_dir ./merged
注意 QLoRA 不能直接 merge(4bit 不能加 LoRA)。Axolotl 自动 dequantize 再 merge。
7.8常见踩坑
| 现象 | 处理 |
|---|---|
| QLoRA NaN | 必须用 bf16 而非 fp16 作 compute_dtype |
| "adapter qlora not found" | 没装 bitsandbytes |
| 训完 merge 后模型 OOM 加载 | 正常,merged 是 bf16 全权重 |
| DoRA + QLoRA 慢 50% | 正常,DoRA + 量化路径有额外开销 |
7.9Axolotl 量化 backend 全表
v2026 之后 Axolotl 支持多个量化路径,由 load_in_8bit / load_in_4bit / quantization_config 字段触发。来源 loaders/model.py 第 5 步 "configure quantization":
| 量化路径 | YAML 触发 | 能 merge? | 典型场景 |
|---|---|---|---|
| BNB 8bit | load_in_8bit: true | ✅ | 8bit LoRA |
| BNB 4bit (NF4) | load_in_4bit: true + bnb_4bit_quant_type: nf4 | ✅(自动 dequant) | QLoRA 主线 |
| GPTQ | base_model 是 GPTQ checkpoint,自动检测 | ❌ | GPTQ 模型 + LoRA 微调 |
| AWQ | base_model 是 AWQ checkpoint | ❌ | AWQ 模型 + LoRA |
| AQLM | checkpoint 自带 AQLM 标记 | ❌ | 2bit AQLM |
| torchao | quantization_config: torchao | ✅ | FP8 / affine quant(2025-Q1 新增) |
| QAT NVFP4 | qat: { type: nvfp4 } | — | 训练时量化感知(2025-Q3 新增) |
| QAT MXFP4 | qat: { type: mxfp4 } | — | MX Format 4bit QAT |
| Expert quant | expert_quantization: ... | — | MoE expert 单独量化(2026-03,FSDP2 兼容) |
7.10LoRA target 自动发现
loaders/adapter.py:52–69 的 find_all_linear_names() 决定 lora_target_modules: "all" 时实际选哪些层:
- 遍历所有 module,找
isinstance(m, bnb.nn.Linear*) or nn.Linear; - 跳过
lm_head(除非显式加进lora_modules_to_save); - Gemma4 特殊处理(line 72–89):
ClippableLinear包装层要进 inner.linear; - 返回所有匹配 module 的 short name set。
结果通常是 {q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj},跟手写 7 个完全等价。
7.11QAT:训练时量化感知
2025-Q3 之后引入的 QAT(Quantization-Aware Training)是 axolotl 的进阶特性。配置示例:
qat:
type: nvfp4 # nvfp4 / mxfp4 / fp8
fake_quant: true
granularity: per_token
# 配合 FSDP2 使用
fsdp_version: 2
fsdp_config:
fsdp_offload_params: false
原理:训练 forward / backward 中插入"假量化"算子,模拟量化误差让模型适应。训完导出真正量化模型时精度损失极小。示例脚本 examples/llama-3/3b-qat-nvfp4.yaml。
7.12这章你需要带走的
- 四档组合:full / LoRA / LoRA+8bit / QLoRA(4bit);
- QLoRA 必须
adapter: qlora+load_in_4bit: true; - QLoRA 配
paged_adamw_8bit优化器; - 追极致用
peft_use_dora + peft_init_lora_weights: pissa。