选择任务:任务 A(Instruction Fine-tuning 实践)
本小组参考 Stanford Alpaca 的思想,基于小型开源底座模型 Qwen2.5-0.5B,使用 LoRA 参数高效微调方法在 Alpaca-cleaned 指令数据集上完成指令微调实验,并对比了微调前后模型在多种类型指令上的输出效果。最终报告见 report/project_report.pdf。
| 成员 | 职责 |
|---|---|
| 韩玉轩 | 全流程工程实现:数据集处理、环境配置、训练/推理代码编写、模型微调、实验记录,产出所有原始实验文件及基础素材 |
| 潘旭 | 撰写项目 README.md,整合实验信息,确保内容完整、格式规范、信息准确 |
| 刘承龙 | 实验深度分析、最终项目报告编写、GitHub 仓库规整与合规检查、小雅平台提交 |
- 模型名称:
Qwen/Qwen2.5-0.5B - 参数量:0.5B
- 加载方式:从 Hugging Face 在线加载(不完整上传权重)
- 数据集名称:
yahma/alpaca-cleaned - 数据格式:Alpaca-style(包含
instruction、input、output三个字段) - 数据规模:原始 2000 条,清洗后保留 1995 条
- 划分方式:训练集 95%(1895 条),测试集 5%(100 条)
- 清洗操作:去重、过滤空样本、过滤过短输出
- 方法:LoRA(Low‑Rank Adaptation)
- 框架:Hugging Face
transformers+peft+trl+datasets+accelerate - 训练设备:NVIDIA GeForce RTX 4060 Laptop GPU(8GB 显存)
为了规避系统盘空间不足,所有虚拟环境、pip 缓存和 Hugging Face 缓存均放置在 E 盘。
在项目根目录下执行(Windows PowerShell):
.\setup_env.ps1该脚本会自动创建虚拟环境、安装依赖并设置缓存路径。
-
创建虚拟环境(示例路径):
powershell
python -m venv E:\Ax\深度学习实验2_env -
激活环境:
powershell
E:\Ax\深度学习实验2_env\Scripts\Activate.ps1 -
设置环境变量(加速 Hugging Face 下载):
powershell
$env:HF_HOME = "E:\Ax\huggingface_cache" $env:HF_ENDPOINT = "https://hf-mirror.com" -
安装依赖:
powershell
pip install -r requirements.txt --cache-dir E:\Ax\pip_cache
- Python 3.13
- torch 2.6.0+cu124
- transformers, peft, trl, datasets, accelerate
完整的依赖列表见
requirements.txt。
运行以下命令对原始数据集进行清洗、格式化和划分:
bash
python data_preprocess.py --config configs/train_config.yaml
处理结果:
- 原始样本:2000 条
- 清洗后:1995 条
- 训练集:1895 条
- 测试集:100 条
预处理代码会按照 train_config.yaml 中的 max_samples 和划分比例进行处理,并保存为 Hugging Face Dataset 格式供后续训练使用。
| 参数 | 值 |
|---|---|
| LoRA rank (r) | 16 |
| LoRA alpha | 32 |
| LoRA dropout | 0.05 |
| 学习率 | 2e-4 |
| 批大小 (per device) | 4 |
| 梯度累积步数 | 2 |
| 有效批大小 | 8 |
| 最大序列长度 | 512 |
| 训练轮数 | 1 epoch |
| 总训练步数 | 237 |
| FP16 | True |
| 梯度检查点 | True |
bash
python train_lora.py --config configs/train_config.yaml
训练日志和 Loss 曲线图 分别保存在:
results/training_log.txtresults/loss_curve.png
训练耗时约 4.92 分钟,最终训练损失为 1.2177。
我们设计了 6 大类共 12 条测试指令,涵盖:
- 问答(2 条)
- 翻译(2 条)
- 文本总结(2 条)
- 代码解释(2 条)
- 逻辑推理(2 条)
- 日常助手(2 条)
测试指令模板保存在 examples/test_prompts.json。
bash
python inference_compare.py --config configs/train_config.yaml
该脚本会依次加载底座模型和微调后的 LoRA 适配器,对每条测试指令生成输出,并将对比结果整理为 Markdown 表格,保存在:
results/output_comparison.md
推理时通过 peft 加载适配器权重(路径:adapters/lora_adapter/):
python
from peft import PeftModel
model = PeftModel.from_pretrained(base_model, "adapters/lora_adapter/")
适配器核心文件 adapter_model.safetensors 大小约 33 MB,已纳入版本控制(不上传完整底座模型)。
- 微调后模型在回答结构上明显改善,更倾向于使用分点列举、逻辑层次清晰的格式,指令跟随能力(如格式要求)显著提升。
- 在问答、日常助手等任务上,回答的相关性和完整性优于底座模型。
- 由于模型规模较小(0.5B),在复杂逻辑推理(如集合计数判断)上仍会出现错误。
- 部分回答存在事实性偏差或冗余表述。
- 代码解释类任务表现一般,有时不能准确识别代码意图或定位越界等具体错误。
- 在部分中文任务中,微调后模型仍会输出英文,说明语言约束服从并不稳定。
详细的逐条对比结果请参见 results/output_comparison.md,完整实验分析请参见 report/project_report.pdf。
| 问题 | 解决方案 |
|---|---|
| C 盘空间不足 | 将虚拟环境、pip 缓存、Hugging Face 缓存全部设置到 E 盘 |
| Hugging Face 模型下载超时 | 设置镜像源 HF_ENDPOINT=https://hf-mirror.com |
| transformers 新版 tokenizer 参数报错 | 改用 processing_class=tokenizer 兼容新版接口 |
| 推理时显存溢出 | 顺序加载底座模型和适配器,每个模型使用后立即释放(del 并调用 torch.cuda.empty_cache()) |
| Windows 下 QLoRA 兼容性问题 | 0.5B 模型不使用 QLoRA,直接采用 LoRA + FP16 即可稳定运行 |
text
Project2_TaskA_Finetuning/
├── README.md
├── .gitignore
├── SUBMISSION_CHECKLIST.md
├── requirements.txt
├── setup_env.ps1
├── data_preprocess.py
├── train_lora.py
├── inference_compare.py
├── configs/
│ └── train_config.yaml
├── examples/
│ └── test_prompts.json
├── results/
│ ├── training_log.txt
│ ├── loss_curve.png
│ └── output_comparison.md
├── adapters/
│ └── lora_adapter/ # LoRA 适配器权重(~33MB)
├── notes/
│ └── 实验素材_HYX.md # 内部素材,仅供组内参考
└── report/
├── project_report.md # 报告源文件
└── project_report.pdf # 最终项目报告
注意:不包含完整模型权重、缓存文件或临时文件,所有大文件均已在
.gitignore中过滤。
- Stanford Alpaca: https://github.com/tatsu-lab/stanford_alpaca
- Qwen2.5: https://huggingface.co/Qwen/Qwen2.5-0.5B
- Alpaca-cleaned 数据集: https://huggingface.co/datasets/yahma/alpaca-cleaned
- LoRA: Hu et al., "LoRA: Low-Rank Adaptation of Large Language Models"
- Hugging Face PEFT: https://github.com/huggingface/peft
- Hugging Face TRL: https://github.com/huggingface/trl