Gemma-4-E4B-it LoRA 微调实验笔记

1. 项目简介

本实验基于 Google Gemma-4-E4B-it 指令模型,在 ModelScope 平台提供的情绪分类数据集 AI-ModelScope/emotion 上进行 LoRA(Low-Rank Adaptation)微调。

目标是让通用大语言模型学习情绪分类任务,输入一段文本后,仅输出对应的情绪标签。


2. 实验目标

实现一个情绪识别模型:

输入:

I feel completely heartbroken and alone.

输出:

sadness

支持六类情绪:

标签ID 情绪类别
0 sadness
1 joy
2 love
3 anger
4 fear
5 surprise

3. 技术路线

整体流程如下:

ModelScope下载模型
        ↓
下载Emotion数据集
        ↓
构造Prompt-Completion格式
        ↓
Gemma Tokenizer处理
        ↓
LoRA挂载
        ↓
SFTTrainer训练
        ↓
保存Adapter
        ↓
推理评估

4. 环境搭建

安装依赖

uv pip install -U \
vllm \
modelscope \
transformers \
accelerate \
datasets \
trl \
peft \
scikit-learn \
pandas \
tqdm \
torchvision

主要组件:

组件 作用
transformers 加载Gemma模型
datasets 数据集管理
trl SFTTrainer训练
peft LoRA微调
modelscope 下载模型和数据
accelerate 单卡/多卡训练

5. 模型下载

使用 ModelScope 下载官方 Gemma 模型:

MODELSCOPE_MODEL_ID = "google/gemma-4-E4B-it"

model_dir = snapshot_download(
    MODELSCOPE_MODEL_ID,
    cache_dir="./models"
)

特点:

  • 不依赖 HuggingFace Token
  • 全程使用国内 ModelScope 镜像
  • 下载后离线训练

模型类型:

Gemma-4-E4B-it


6. 数据集下载

使用:

AI-ModelScope/emotion

该数据集是:

dair-ai/emotion

在 ModelScope 上的镜像版本。

数据规模:

Split 数量
Train 16000
Validation 2000
Test 2000

数据格式:

{
  "text": "I am very happy today",
  "label": 1
}

7. 数据格式转换

由于 Gemma 是聊天模型,因此需要把分类任务转换成指令微调格式。

System Prompt

You are an emotion classification assistant.

Return only one label:

sadness
joy
love
anger
fear
surprise

User Prompt

Classify the emotion of this text:

I feel very lonely today.

Assistant Answer

sadness

最终形成:

[
  {
    "role":"system",
    "content":"..."
  },
  {
    "role":"user",
    "content":"..."
  }
]

对应:

{
    "completion":"sadness"
}

8. Tokenizer加载

tokenizer = AutoTokenizer.from_pretrained(
    LOCAL_MODEL_DIR,
    use_fast=True,
    trust_remote_code=True
)

若模型未定义 pad token:

tokenizer.pad_token = tokenizer.eos_token

这样能够保证批量训练时正常填充。


9. 基础模型加载

base_model = AutoModelForCausalLM.from_pretrained(
    LOCAL_MODEL_DIR,
    torch_dtype=torch.bfloat16
)

训练配置:

BF16 = True
FP16 = False

优势:

  • 节省显存
  • 保持训练稳定性

10. LoRA微调配置

采用 PEFT 的 LoRA 方案。

配置如下:

LoraConfig(
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
    target_modules="all-linear"
)

参数说明:

参数 作用
r=16 LoRA秩
alpha=32 缩放系数
dropout=0.05 防过拟合
all-linear 对全部线性层注入LoRA

11. 训练参数

使用:

SFTTrainer

进行监督微调。

核心参数:

per_device_train_batch_size = 4
gradient_accumulation_steps = 4

等效Batch:

4 × 4 = 16

学习率:

1e-4

训练轮数:

num_train_epochs = 1

最大长度:

max_length = 256

梯度检查点:

gradient_checkpointing = True

作用:

  • 降低显存占用
  • 允许更大模型训练

12. 开始训练

创建 Trainer:

trainer = SFTTrainer(
    model=base_model,
    train_dataset=sft_dataset["train"],
    eval_dataset=sft_dataset["validation"],
    peft_config=lora_config,
    args=training_args,
    processing_class=tokenizer
)

训练:

train_result = trainer.train()

训练过程中:

  • 每5步记录日志
  • 每25步验证一次
  • 每25步保存Checkpoint

13. 训练前评估

先评估原始 Gemma:

pre_metrics = evaluate_model(...)

评估指标:

Accuracy

正确预测数量 / 总样本数

Macro F1

各类别F1平均

Classification Report

输出:

precision
recall
f1-score
support

Confusion Matrix

观察:

  • 哪些情绪容易混淆
  • 微调前后的变化

14. 训练后评估

使用:

post_metrics = evaluate_model(...)

对比:

comparison_df

内容:

指标 微调前 微调后
Accuracy xx xx
Macro F1 xx xx
Invalid Rate xx xx

用于验证 LoRA 是否真正提升了分类能力。


15. 模型保存

保存 Adapter:

trainer.model.save_pretrained(
    OUTPUT_DIR
)

保存 Tokenizer:

tokenizer.save_pretrained(
    OUTPUT_DIR
)

输出目录:

OUTPUT_DIR/
├── adapter_model.safetensors
├── adapter_config.json
├── tokenizer.json
├── tokenizer_config.json
└── train_metrics.json

注意:

这里只保存 LoRA Adapter。

不保存完整 Gemma 权重。


16. 推理测试

定义:

predict_emotion_ft()

测试样例:

I feel completely heartbroken and alone.

输出:

sadness
This is the best day of my life!

输出:

joy
I am really scared about what might happen tomorrow.

输出:

fear

17. 重新加载LoRA

后续无需重新训练。

加载基础模型:

reload_base_model = AutoModelForCausalLM.from_pretrained(
    LOCAL_MODEL_DIR
)

加载Adapter:

reload_model = PeftModel.from_pretrained(
    reload_base_model,
    OUTPUT_DIR
)

即可直接推理。


18. 实验总结

本实验完成了基于 Gemma-4-E4B-it 的情绪分类 LoRA 微调。

主要特点:

  • 使用 ModelScope 全流程下载模型与数据
  • 单卡 BF16 训练
  • PEFT LoRA 参数高效微调
  • SFTTrainer 指令微调
  • 六分类情绪识别任务
  • 保存 Adapter 便于后续部署

最终实现:

通用Gemma模型
        ↓
LoRA微调
        ↓
专用情绪分类模型

这种方案后续也可以迁移到:

  • 新闻分类
  • 垃圾邮件识别
  • 意图识别
  • 客服工单分类
  • 情感分析
  • 医疗文本分类

等文本分类任务。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐