AI神功 KNOWLEDGE BASE
内功07 · 模型定制与算力量化·第 23 关 / 36 约 5 分钟

INNER 07 / MODEL / 03 · ENGINE v1

LoRA 与 QLoRA 高效参数微调实战(Scientist 4: Supervised Fine-Tuning)

本关练习:编写单卡 16GB 显存微调 8B 模型的 Unsloth/TRL 配置脚本。

约 5 分钟·免费阅读·整理自 AI 现代必修课 · 内功07·来源精读 ↓·直接做题 ↓

30 SECONDS / 30 秒看懂

这一关只解决一件事:全量微调(Full Fine-Tuning)一个 8B 模型需要更新全部 80 亿参数,加上优化器状态(AdamW) 和梯度,往往需要 60GB‒80GB 显存。而根据 mlabonne/llm-course 的 SFT 与 Unsloth 教程,LoRA(Low- Rank Adaptation)冻结原模型权重 W,仅在旁路注入两个低秩矩阵 A 与 B(可训练参数量通常不到原模型的 1%‒2%);QLoRA 更进一步,将冻结的基座模型权重量化为 4-bit NormalFloat (NF4),结合分页优化器 (Paged Optimizers)和 Unsloth 手写算子加速,让你用一张免费的 16GB Google Colab T4 显卡就能轻松微调 Qwen3.5-9B 或 Qwen-2.5-7B!

  • 写出完整的 LoRA 配置字典(含 r、lora_alpha、target_modules 全 7 层挂载及 use_gradient_checkpointing);
  • 通过调整 per_device_train_batch_size 与 gradient_accumulation_steps,在单步仅占极小显存的前提下实现等效 Batch Size = 16(
  • 5 分);

3 MINUTES / 3 分钟拆解

先看来源里的例子:PDF 本关任务(来源)

输入
你只有一张 16GB 显存的 GPU,需要微调一个 8B 规模的医疗/法律垂直模型(数据集共 5,000 条高质量样本),但初版配置一启动就报 CUDA Out of Memory (OOM)。

发生了什么

来源要求:写出完整的 LoRA 配置字典(含 r、lora_alpha、target_modules 全 7 层挂载及 use_gradient_checkpointing); / 通过调整 per_device_train_batch_size 与 gradient_accumulation_steps,在单步仅占极小显存的前提下实现等效 Batch Size = 16( / 5 分);

输出

参考答案:参考答案:单卡 16GB 显存 QLoRA 微调 8B 模型黄金配置脚本 from unsloth import FastLanguageModel from trl import SFTTrainer from transformers import TrainingArguments # 1. 4-bit QLoRA 加载基座模型(权重仅占 ~5.5GB 显存) model, tokenizer = FastLanguageMode

术语拆开

LoRA
冻结原权重,只训练旁路低秩矩阵。
QLoRA
把冻结基座量化到 4-bit,再挂 LoRA。
gradient checkpointing
用重算换显存,降低训练占用。

为什么有效

来源核心原理:全量微调(Full Fine-Tuning)一个 8B 模型需要更新全部 80 亿参数,加上优化器状态(AdamW) 和梯度,往往需要 60GB‒80GB 显存。而根据 mlabonne/llm-course 的 SFT 与 Unsloth 教程,LoRA(Low- Rank Adaptation)冻结原模型权重 W,仅在旁路注入两个低秩矩阵 A 与 B(可训练参数量通常不到原模型的 1%‒2%);QLoRA 更进一步,将冻结的基座模型权重量化为 4-bit NormalFloat (NF4),结合分页优化器 (Paged Optimizers)和 Unsloth 手写算子加速,让你用一张免费的 16GB Google Colab T4 显卡就能轻松微调 Qwen3.5-9B 或 Qwen-2.5-7B!核心超参数有三个: r(LoRA Rank 秩):决定低秩矩阵的容量,常规任务取 16 或 32,复杂领域任务取 64 或 128。 lora_alpha(缩放系数):控制旁路权重的更新幅度,业界黄金经验法则是设为 lora_alpha = 1 * r 或 2 * r。 target_modules(挂载目标线性层):切勿只挂 q_proj, v_proj!现代最佳实践是挂载 Transformer 的全部 7 个核心线性投影层(q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj),效果最接近全量微调。

结构长什么样

写出完整的 LoRA 配置字典(含 r、lora_alpha、target_modules 全 7 层挂载及 use_gradient_checkpointing);
通过调整 per_device_train_batch_size 与 gradient_accumulation_steps,在单步仅占极小显存的前提下实现等效 Batch Size = 16(
5 分);
指定兼顾省显存与稳定性的优化器(如 adamw_8bit)、学习率(如 2e-4)与训练轮数 (num_train_epochs)。

lora_alpha 和 r 的关系为什么会影响更新幅度?

SOURCE READING / 来源精读

全量微调(Full Fine-Tuning)一个 8B 模型需要更新全部 80 亿参数,加上优化器状态(AdamW) 和梯度,往往需要 60GB‒80GB 显存。而根据 mlabonne/llm-course 的 SFT 与 Unsloth 教程,LoRA(Low- Rank Adaptation)冻结原模型权重 W,仅在旁路注入两个低秩矩阵 A 与 B(可训练参数量通常不到原模型的 1%‒2%);QLoRA 更进一步,将冻结的基座模型权重量化为 4-bit NormalFloat (NF4),结合分页优化器 (Paged Optimizers)和 Unsloth 手写算子加速,让你用一张免费的 16GB Google Colab T4 显卡就能轻松微调 Qwen3.5-9B 或 Qwen-2.5-7B!

逐点读懂

  1. 写出完整的 LoRA 配置字典(含 r、lora_alpha、target_modules 全 7 层挂载及 use_gradient_checkpointing);
  2. 通过调整 per_device_train_batch_size 与 gradient_accumulation_steps,在单步仅占极小显存的前提下实现等效 Batch Size = 16(
  3. 5 分);

怎么对应本关练习

先读 30 秒与 3 分钟拆解,再读本关原文与实验,最后做客观题和实操题;答案在下方。

例子在哪

本关任务与参考答案见页面下方;来源为本册 PDF 对应关卡。

本关先记住:写出完整的 LoRA 配置字典(含 r、lora_alpha、target_modules 全 7 层挂载及 use_gradient_checkpointing);

SOURCESPDF 第 3 关(用户提供)mlabonne/llm-course ↗

核心原理

全量微调(Full Fine-Tuning)一个 8B 模型需要更新全部 80 亿参数,加上优化器状态(AdamW) 和梯度,往往需要 60GB‒80GB 显存。

而根据 mlabonne/llm-course 的 SFT 与 Unsloth 教程,LoRA(Low- Rank Adaptation)冻结原模型权重 W,仅在旁路注入两个低秩矩阵 A 与 B(可训练参数量通常不到原模型的 1%‒2%);QLoRA 更进一步,将冻结的基座模型权重量化为 4-bit NormalFloat (NF4),结合分页优化器 (Paged Optimizers)和 Unsloth 手写算子加速,让你用一张免费的 16GB Google Colab T4 显卡就能轻松微调 Qwen3.5-9B 或 Qwen-2.5-7B!

核心超参数有三个: r(LoRA Rank 秩):决定低秩矩阵的容量,常规任务取 16 或 32,复杂领域任务取 64 或 128。

lora_alpha(缩放系数):控制旁路权重的更新幅度,业界黄金经验法则是设为 lora_alpha = 1 * r 或 2 * r。

target_modules(挂载目标线性层):切勿只挂 q_proj, v_proj!

现代最佳实践是挂载 Transformer 的全部 7 个核心线性投影层(q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj),效果最接近全量微调。

第 3 关实操练习题:编写单卡 16GB 显存微调 8B 模型的 Unsloth/TRL 配置脚本

任务背景

你只有一张 16GB 显存的 GPU,需要微调一个 8B 规模的医疗/法律垂直模型(数据集共 5,000 条高质量样本),但初版配置一启动就报 CUDA Out of Memory (OOM)。

通关硬性要求(满分 12.5 分)

1. 写出完整的 LoRA 配置字典(含 r、lora_alpha、target_modules 全 7 层挂载及 use_gradient_checkpointing)(5 分);

2. 通过调整 per_device_train_batch_size 与 gradient_accumulation_steps,在单步仅占极小显存的前提下实现等效 Batch Size = 16(

4.5 分);

3. 指定兼顾省显存与稳定性的优化器(如 adamw_8bit)、学习率(如 2e-4)与训练轮数 (num_train_epochs)(3 分)。

PRACTICE / 本关练习 · 本地规则 + 覆盖检查

编写单卡 16GB 显存微调 8B 模型的 Unsloth/TRL 配置脚本

本地检查在你的浏览器里完成,不上传。覆盖检查需要先登录(免费注册),并把这段答案发送到服务器计算一次,算完即弃、不存档,需你点同意;只核对本关评分项覆盖的方向,不在评分项里的题目不会被检查。

0 字未保存

评分项

评分项加载中…

结构分 — / 12.5 分

查看参考答案与得分点 先自己写,再打开+

参考答案与得分要点

参考答案:单卡 16GB 显存 QLoRA 微调 8B 模型黄金配置脚本 from unsloth import FastLanguageModel from trl import SFTTrainer from transformers import TrainingArguments # 1. 4-bit QLoRA 加载基座模型(权重仅占 ~5.5GB 显存) model, tokenizer = FastLanguageModel.from_pretrained( model_name="unsloth/Meta-Qwen3.5-9B-Instruct-bnb-4bit", max_seq_length=2048, load_in_4bit=True, ) # 2. 挂载全 7 层线性投影层与 Unsloth 梯度检查点 model = FastLanguageModel.get_peft_model( model, r=16, lora_alpha=32, # 2 * r 黄金比例 target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], lora_dropout=0.0, bias="none", use_gradient_checkpointing="unsloth", # 节省 30% 激活值显存 ) # 3. 小步快跑 + 梯度累积实现等效 Batch Size = 2 * 8 = 16 training_args = TrainingArguments( per_device_train_batch_size=2, gradient_accumulation_steps=8, warmup_ratio=0.05, num_train_epochs=2, learning_rate=2e-4, lr_scheduler_type="cosine", optim="adamw_8bit", # 8-bit 优化器大幅压缩状态显存 weight_decay=0.01, fp16=not FastLanguageModel.is_bfloat16_supported(), bf16=FastLanguageModel.is_bfloat16_supported(), output_dir="./outputs" ) 得分要点拆解:完整配置 4-bit 加载、`r=16, alpha=32`、全 7 层 `target_modules` 与梯度检查点(5 分); 通过 `batch_size=2` 配合 `grad_accum=8` 实现等效 Batch=16 防 OOM(4.5 分);选用 `adamw_8bit`、 `lr=2e-4` 与 `epochs=2`(3 分)。 第 4 关

网页永久免费。完整 PDF 会按顺序发给留邮箱的读者,不转售、不群发广告。

留邮箱,获取完整 PDF ↗
← 上一关 下一关 →