从零开始:Qwen2.5-3B大模型LoRA微调与ollama本地部署实战
1. 环境准备与工具安装
想要玩转Qwen2.5-3B大模型的微调和部署,首先得把工具和环境准备好。我建议使用Linux系统(Ubuntu 20.04+)或者MacOS,Windows用户可以考虑WSL2。以下是需要安装的核心工具:
- Python 3.9+:这是运行所有AI相关工具的基础
- CUDA 11.7+:如果你有NVIDIA显卡,这是必须的
- Git:用来下载各种开源项目
- Docker:简化环境配置的好帮手
安装完基础环境后,我们来搞定几个关键工具:
# 安装Python依赖 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117 pip install transformers datasets accelerate peft # 安装LlamaFactory git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e ".[torch,metrics]"如果你打算在本地运行模型,还需要安装ollama:
# Linux/Mac安装ollama curl -fsSL https://ollama.com/install.sh | sh # Windows用户可以去官网下载安装包2. 获取Qwen2.5-3B模型
现在我们来获取Qwen2.5-3B模型。国内用户推荐使用魔搭社区,速度更快:
from modelscope import snapshot_download model_dir = snapshot_download('Qwen/Qwen2.5-3B-Instruct')下载完成后,模型会保存在~/.cache/modelscope/hub/Qwen/Qwen2.5-3B-Instruct目录下。这个模型大约占用6GB空间,确保你的磁盘有足够容量。
如果你想验证模型是否下载成功,可以运行以下代码:
from transformers import AutoModelForCausalLM, AutoTokenizer tokenizer = AutoTokenizer.from_pretrained(model_dir) model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto") input_text = "你好,介绍一下你自己" inputs = tokenizer(input_text, return_tensors="pt").to("cuda") outputs = model.generate(**inputs, max_new_tokens=50) print(tokenizer.decode(outputs[0], skip_special_tokens=True))3. 使用LoRA进行轻量化微调
LoRA(Low-Rank Adaptation)是目前最流行的大模型微调技术之一,它只训练模型的一小部分参数,大大降低了计算资源需求。下面我们使用LlamaFactory来微调Qwen2.5-3B。
3.1 准备数据集
首先准备一个JSON格式的数据集。比如我们要让模型学会用甄嬛体说话:
[ { "instruction": "用甄嬛体回答:今天天气真好", "output": "今儿个这天儿可真是极好的,晴空万里,倒叫本宫想起那年御花园里的景致。" }, { "instruction": "用甄嬛体表达:我饿了", "output": "哀家这身子骨儿倒是有些乏了,腹中空空如也,想来是到了用膳的时辰了。" } ]把这个文件保存为zhenhuan.json,放到LLaMA-Factory/data目录下,然后在dataset_info.json中注册这个数据集:
{ "zhenhuan": { "file_name": "zhenhuan.json", "formatting": "alpaca" } }3.2 启动微调训练
现在可以开始微调了!使用以下命令:
llamafactory-cli train \ --stage sft \ --do_train \ --model_name_or_path /path/to/Qwen2.5-3B-Instruct \ --dataset zhenhuan \ --template qwen \ --finetuning_type lora \ --lora_rank 16 \ --lora_alpha 32 \ --output_dir ./output \ --per_device_train_batch_size 2 \ --gradient_accumulation_steps 4 \ --lr_scheduler_type cosine \ --logging_steps 10 \ --save_steps 100 \ --learning_rate 5e-5 \ --num_train_epochs 3.0 \ --fp16关键参数说明:
lora_rank: LoRA矩阵的秩,一般8-64之间,越大效果越好但需要更多计算batch_size: 根据你的GPU显存调整,12GB显存可以设2-4learning_rate: LoRA学习率通常设5e-5到1e-4
训练过程中可以在output目录下查看日志和保存的检查点。如果中断了,可以加--resume_from_checkpoint output继续训练。
4. 模型转换与量化
训练完成后,我们需要把LoRA适配器合并到原模型中,并转换成ollama支持的GGUF格式。
4.1 合并LoRA适配器
from peft import PeftModel from transformers import AutoModelForCausalLM, AutoTokenizer base_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-3B-Instruct") model = PeftModel.from_pretrained(base_model, "./output") merged_model = model.merge_and_unload() merged_model.save_pretrained("./merged_model")4.2 安装llama.cpp
GGUF转换需要llama.cpp:
git clone https://github.com/ggerganov/llama.cpp cd llama.cpp make -j4.3 转换为GGUF格式
python convert-hf-to-gguf.py ./merged_model --outtype f16 --outfile qwen2.5-3b-zh.f16.gguf如果你显存有限,可以进行4-bit量化:
./quantize qwen2.5-3b-zh.f16.gguf qwen2.5-3b-zh.q4_k_m.gguf q4_k_m量化后模型大小从6GB降到约1.5GB,效果损失很小。
5. 使用ollama本地部署
现在我们可以用ollama来运行这个微调后的模型了。
5.1 创建Modelfile
新建一个Modelfile文件,内容如下:
FROM ./qwen2.5-3b-zh.q4_k_m.gguf TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|> {{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|> {{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|> {{ .Response }}<|eot_id|>""" SYSTEM """你是一个用甄嬛体说话的AI助手""" PARAMETER temperature 0.7 PARAMETER num_ctx 20485.2 创建并运行模型
ollama create zhenhuan -f Modelfile ollama run zhenhuan现在你就可以和微调后的模型对话了!试试输入"今日心情甚好",看看它会不会用甄嬛体回应你。
6. 进阶技巧与优化
6.1 微调参数调优
不同的任务需要不同的微调策略。以下是一些经验参数:
| 任务类型 | lora_rank | 学习率 | batch_size | epoch |
|---|---|---|---|---|
| 风格模仿 | 32-64 | 3e-5 | 4-8 | 3-5 |
| 知识注入 | 16-32 | 5e-5 | 2-4 | 1-3 |
| 指令跟随 | 8-16 | 1e-4 | 8-16 | 1-2 |
6.2 多LoRA适配器切换
ollama支持运行时切换不同的LoRA适配器。你可以训练多个专用适配器,比如:
- 一个用于客服场景
- 一个用于创意写作
- 一个用于代码生成
然后在运行时通过--lora参数指定:
ollama run zhenhuan --lora ./customer_service_lora.bin6.3 系统提示词优化
SYSTEM提示词对模型行为影响很大。比如想让模型扮演专业医生:
SYSTEM """你是一位资深内科医生,回答患者问题时要专业且富有同理心。如果遇到不确定的情况,应该说'这个需要进一步检查确认'"""7. 常见问题解决
问题1:训练时显存不足
解决方案:
- 减小
batch_size - 开启梯度累积(
gradient_accumulation_steps) - 使用
--load_in_4bit参数
问题2:模型回答质量下降
解决方案:
- 检查数据集质量,确保指令-输出对匹配
- 尝试增大
lora_rank - 调整
temperature参数(0.3-0.7效果较好)
问题3:ollama加载失败
解决方案:
- 确认GGUF文件路径正确
- 检查Modelfile的TEMPLATE格式是否正确
- 尝试用
ollama serve查看详细日志
我在实际项目中发现,Qwen2.5-3B对中文理解相当不错,配合LoRA微调后,在特定任务上可以达到接近70B模型的效果。最关键的是找到合适的数据集和训练参数,这往往需要多次实验调整。建议从小数据集开始,快速迭代验证效果,再逐步扩大训练规模。
