我的第一个LoRA微调项目:在消费级显卡上用LlamaFactory给Qwen2.5做文本分类

张开发
2026/4/14 14:38:57 15 分钟阅读

分享文章

我的第一个LoRA微调项目:在消费级显卡上用LlamaFactory给Qwen2.5做文本分类
在消费级显卡上实战LoRA微调用LlamaFactory打造Qwen2.5文本分类器当大语言模型遇上单卡玩家如何在24GB显存里驯服7B参数模型去年用RTX 3090微调BERT的时代已经过去现在我们要用LoRA技术让Qwen2.5在消费级显卡上完成专业级文本分类任务。这不仅是技术实践更是一场显存优化艺术——通过量化、梯度累积和巧妙的超参数设置即使是学生党也能在宿舍完成大模型微调。1. 硬件准备与环境配置我的实验平台是二手市场淘来的RTX 309024GB显存搭配AMD Ryzen 7 5800X处理器和64GB DDR4内存。这个配置看似普通却足够应对7B模型的LoRA微调。以下是关键环境组件# 基础环境 conda create -n qwen_lora python3.10 conda activate qwen_lora pip install torch2.1.2cu121 -f https://download.pytorch.org/whl/torch_stable.html pip install llama-factory0.4.2 transformers4.40.0 bitsandbytes0.43.0注意务必使用CUDA 12.1以上版本否则bitsandbytes的8位量化可能无法正常工作显存优化三件套配置bitsandbytes实现8位优化器状态gradient_checkpointing用计算时间换显存空间flash_attention加速注意力计算# 验证flash_attention是否生效 import torch from transformers.utils import is_flash_attn_available print(fFlash attention available: {is_flash_attn_available()})2. 数据集构建与工程化处理文本分类任务的数据质量比数量更重要。我收集了约5000条中文社交媒体文本涉及5个类别科技、财经、体育、娱乐和社会。采用Alpaca格式改造原始数据{ instruction: 对以下文本进行分类, input: 苹果公司今日发布新款Vision Pro头显设备, output: reason: 内容涉及科技公司新产品发布\nlabel: 科技 }数据集拆分策略数据子集比例样本数用途train70%3500训练dev15%750验证test15%750测试提示小数据集建议使用5折交叉验证可在LLaMA-Factory中设置cross_validation: true为防止过拟合我采用了以下数据增强技巧同义词替换使用Synonyms库随机插入标点局部句子调序添加无意义停用词3. LoRA微调实战配置在LLaMA-Factory中微调配置的核心是YAML文件。这是我的qwen_lora.yaml关键参数model: model_name_or_path: Qwen/Qwen2.5-7B-Instruct quantization_bit: 8 # 关键显存优化项 lora: r: 8 # LoRA秩 lora_alpha: 32 # 缩放系数 target_modules: [q_proj, k_proj, v_proj, o_proj] lora_dropout: 0.05 train: per_device_train_batch_size: 1 # 单批数据量 gradient_accumulation_steps: 8 # 梯度累积步数 learning_rate: 3e-5 num_train_epochs: 3 max_grad_norm: 0.3 warmup_ratio: 0.1 optim: paged_adamw_8bit # 8位优化器启动训练的命令行技巧CUDA_VISIBLE_DEVICES0 llamafactory-cli train qwen_lora.yaml \ --deepspeed ds_config.json \ train.log 21 其中ds_config.json是DeepSpeed配置文件关键配置如下{ train_batch_size: 8, gradient_accumulation_steps: 8, optimizer: { type: AdamW, params: { lr: 3e-5, weight_decay: 0.01 } }, fp16: { enabled: true, loss_scale_window: 100 }, zero_optimization: { stage: 2, offload_optimizer: { device: cpu } } }4. 显存优化技巧详解在24GB显存下微调7B模型需要精细的显存管理。以下是我的显存占用实测数据单位GB优化技术训练阶段峰值显存原始FP16模型前向传播OOM8bit量化前向传播18.2gradient checkpointing反向传播20.7LoRA微调参数更新22.3关键优化手段8bit量化将模型权重和优化器状态转为8位梯度检查点只保留部分激活值梯度累积模拟更大batch sizeLoRA窄适配仅更新0.1%的参数实际训练时的显存波动曲线[Memory] |███████████████████████▌ | 22.1/24.0 GB [Update] |█████████▊ | 15.3/24.0 GB [Forward]|█████████████████▎ | 18.7/24.0 GB5. 模型评估与部署训练完成后使用以下命令测试LoRA适配器llamafactory-cli infer \ --model_name_or_path Qwen/Qwen2.5-7B-Instruct \ --adapter_path output/qwen_lora \ --template qwen \ --infer_data test.json评估指标对比F1分数方法科技财经体育娱乐社会平均零样本推理0.620.580.710.650.590.63全参数微调0.890.850.930.910.870.89LoRA微调(本文)0.880.840.920.900.860.88轻量化部署方案合并LoRA权重到基础模型from peft import PeftModel model AutoModelForCausalLM.from_pretrained(Qwen/Qwen2.5-7B-Instruct) model PeftModel.from_pretrained(model, output/qwen_lora) model model.merge_and_unload()使用vLLM加速推理python -m vllm.entrypoints.api_server \ --model merged_qwen_lora \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.9在测试过程中发现当输入文本包含多个主题时模型容易产生混淆。例如同时讨论科技公司财报的文本有30%概率被错误分类到财经类。解决方法是在instruction中明确提示当文本涉及多个类别时选择最主要的一个类别

更多文章