一、先配置训练器

示例里使用的是 SFTTrainer

from trl import SFTTrainer
from transformers import TrainingArguments
from transformers import DataCollatorForLanguageModeling

data_collator = DataCollatorForLanguageModeling(
    tokenizer=tokenizer,
    mlm=False,
)

trainer = SFTTrainer(
    model=model,
    tokenizer=tokenizer,
    train_dataset=dataset,
    dataset_text_field="text",
    max_seq_length=max_seq_length,
    args=TrainingArguments(
        per_device_train_batch_size=8,
        gradient_accumulation_steps=4,
        warmup_steps=10,
        max_steps=80,
        learning_rate=5e-5,
        fp16=not torch.cuda.is_bf16_supported(),
        bf16=torch.cuda.is_bf16_supported(),
        logging_steps=5,
        optim="adamw_8bit",
        weight_decay=0.01,
        lr_scheduler_type="linear",
        seed=3407,
        output_dir="outputs",
    ),
    data_collator=data_collator,
)

二、几个关键超参数怎么理解

  • gradient_accumulation_steps
  • 用梯度累积模拟更大的 batch。
  • warmup_steps
  • 训练初期逐步升高学习率,让训练更稳定。
  • logging_steps
  • 控制日志记录频率。
  • optim="adamw_8bit"
  • 用 8 位优化器节省显存。
  • weight_decay
  • 抑制过拟合。
  • lr_scheduler_type="linear"
  • 使用线性学习率衰减。

三、启动训练

trainer.train()

如果你想把这套流程写成一个完整脚本,笔记里的核心结构如下:

  • 先加载 Qwen3-4B;
  • 再配置 LoRA;
  • 然后加载并格式化数据集;
  • 再用 SFTTrainer 启动训练;
  • 训练完成后保存适配器和合并模型。

四、保存微调结果

4.1 保存 LoRA 适配器

model.save_pretrained("qwen3_lora_finetuned")
tokenizer.save_pretrained("qwen3_lora_finetuned")

4.2 保存合并后的新模型

model.save_pretrained_merged(
    "/models/Qwen3-4B-Aminglinux",
    tokenizer,
    save_method="merged_16bit",
)

五、推理测试

笔记里给了一个简单 JSON 文件示例,用来准备多条问答样本:

import json

data = [
    {"input": "What's 1+1?", "output": "2"},
    {"input": "Define AI.", "output": "AI is the simulation of human intelligence in machines."}
]

with open("qa_dataset.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

这类小样本文件比较适合快速做推理验证。

六、用 vLLM 加载微调后的模型

6.1 安装 vLLM

pip3 install vllm openai

6.2 启动服务

vllm serve /models/Qwen3-4B-Aminglinux/ \
  --served-model-name Qwen3-Aminglinux \
  --max-model-len 4096 \
  --port 8000

如果使用的是 AutoDL,还需要把 8000 端口映射到本地。

6.3 用 Chatbox 连接服务

接好端口映射后,就可以用 Chatbox 连接这个微调后的模型服务。

image/png

七、Unsloth 这条路线为什么值得学

Unsloth 的价值不只是“省显存”,更重要的是它让单卡环境也能比较顺畅地完成大模型微调。从实验验证到服务化落地,这条路线对个人开发者和中小团队都很友好。