Qwen2.5-1.5B · 500 条 Incoterms + HS QA · Kaggle T4
LoRALinear(~30 行)q_proj / v_projpeft 工业级工具手撕过一遍 → 用框架更有感觉:你知道 peft 底层每一步在做什么
| 方法 | 核心思想 | 代表 |
|---|---|---|
| Prompt Tuning | 学一段可训练的 soft prompt | GPT-3 soft prompt |
| Prefix Tuning | 每层注入可训练的 prefix KV | Li & Liang 2021 |
| LoRA | 权重更新低秩分解 $W + BA$ | Hu et al. 2021 |
| QLoRA | 4bit 量化底座 + LoRA | Dettmers 2023 |
| DoRA / AdaLoRA | 幅度/方向解耦、自适应秩 | 2024+ |
工业界主流:LoRA / QLoRA(简单、快、adapter 小)
三项关键技术:NF4 量化 · 双重量化 · Paged Optimizer
效果:1.5B 模型在 Kaggle T4 (16GB) 上训练占用 ~6GB
| 存储项 | 全量微调 | QLoRA |
|---|---|---|
| 模型参数 | 3 GB (fp16) | 0.9 GB (4bit) |
| 梯度 | 3 GB | ~35 MB |
| AdamW state | 6 GB (2×) | ~70 MB |
| 激活 (MAX_LEN=512, bs=2) | ~4 GB | ~4 GB |
| 合计 | ~16 GB | ~5 GB |
🎯 Kaggle T4 (16GB) 全量微调 1.5B 都已经很勉强,QLoRA 可以轻松跑 7B
训练集:500 条
盲测集:50 条
数据格式(Alpaca-style):
{
"instruction": "请解释 FOB 和 CIF 的区别。",
"input": "",
"output": "FOB(Free On Board)..."
}
覆盖面:Incoterms 11 术语 + HS 编码归类规则 + 中国出口实务
Qwen2.5-Instruct 用 ChatML:
<|im_start|>user
请解释 FOB。<|im_end|>
<|im_start|>assistant
FOB(Free On Board)...<|im_end|>
关键技巧:
labels = [-100]*len(prompt) + full_ids[len(prompt):]
→ 只对 assistant 段 计算 loss,模型学答不学问
LoraConfig(怎么挂)
LoraConfig(
r=8, lora_alpha=16, lora_dropout=0.05,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
task_type="CAUSAL_LM", bias="none",
)
get_peft_model(挂上去)
model = get_peft_model(base_model, config)
model.print_trainable_parameters()
# trainable: 8.8M / 1.55B (0.566%)
save_pretrained / merge_and_unload
# 只存 adapter(30-40 MB)
model.save_pretrained("./adapter")
# 或:合并回底座,导出完整模型(需非量化底座)
merged = PeftModel.from_pretrained(base_fp16, "./adapter").merge_and_unload()
merged.save_pretrained("./merged")
两种部署形态:
TrainingArguments(
num_train_epochs=3,
per_device_train_batch_size=2,
gradient_accumulation_steps=4, # 有效 bs=8
learning_rate=2e-4, # LoRA 专用,比全量 FT 大 10×
warmup_ratio=0.05,
fp16=True,
gradient_checkpointing=True, # QLoRA 必开
optim="paged_adamw_8bit", # QLoRA 专属
)
Kaggle T4 训练时间:3-5 分钟 / 3 epochs
中文评测必做:用 jieba 分词后再算
import jieba
preds_tok = [" ".join(jieba.lcut(p)) for p in preds]
# BLEU: sacrebleu.corpus_bleu
# ROUGE-L: rouge_scorer.RougeScorer(["rougeL"])
参考区间(500 训练 + 50 测):
| BLEU | ROUGE-L | |
|---|---|---|
| 基座 Qwen2.5-1.5B-Instruct | 12-18 | 28-35 |
| LoRA 后 | 20-28 | 42-50 |
| Δ | +8 | +12 |
中文 QA 的 BLEU 绝对值不高,看相对提升更重要
huggingface-cli upload your-name/qwen-trade ./adapter
# 别人: base + PeftModel.from_pretrained("your-name/qwen-trade")
ollama create trade-bot -f Modelfile
ollama run trade-bot "什么是 DPU 术语?"
| Kaggle T4 | Mac M1-M4 | |
|---|---|---|
| 框架分支 | bitsandbytes (4bit) | fp16 native |
| 训练速度 | 3-5 min / 3 epoch | 15-20 min |
| 显存占用 | ~6 GB | ~4 GB |
| 代码差异 | MODE="qlora" | MODE="fp16_lora" |
同一份 notebook 两边跑——关键在于 prepare_model_for_kbit_training 只在 CUDA 下调用
加分(+20):部署 demo · HF Hub 发布 · unsloth 加速
详见 homework.md
打开 notebook_qlora_kaggle.ipynb
Run All → 大约 10 分钟后你就有一个外贸小助手
有问题随时问 · 下次课带着盲测分来