微调Qwen2.5 Coder小模型实战指南

笔记哥 / 05-16 / 50点赞 / 0评论 / 318阅读
> > 随着大模型技术的普及,如何让模型更好地适应特定场景需求成为开发者的焦点。本文将分享我使用ModelScope Swift框架微调Qwen2.5-Coder-0.5B-Instruct模型的完整过程,让您也能轻松打造专属AI助手。 ## 前言 近期,我尝试对通义千问的Qwen2.5-Coder-0.5B-Instruct模型进行微调,实现两个不同的目标:一个是基础的自我认知调整,另一个是针对特定前端框架TA404的开发助手。本文将详细记录整个过程,从环境准备到模型训练再到效果验证和部署,希望能为有相似需求的开发者提供参考。 ## 一、环境准备 首先,我们需要安装ModelScope的Swift框架,它是阿里巴巴魔搭社区提供的大模型微调工具: ```csharp pip install 'ms-swift' ``` 安装完成后,我们就可以使用Swift框架提供的各种命令来操作模型了。 ## 二、初始模型测试 在开始微调前,我们先测试一下原始模型的效果,了解它的基础能力: ```csharp swift infer \  --model Qwen/Qwen2.5-Coder-0.5B-Instruct \  --stream true \  --temperature 0 \  --infer_backend pt \  --max_model_len 2048 ``` 这个命令会启动模型的推理服务,让我们可以直接与模型对话。参数说明: - `--model`:指定使用的模型 - `--stream true`:启用流式输出,模型生成的文本会实时显示 - `--temperature 0`:控制输出的随机性,0表示完全确定性输出 - `--infer_backend pt`:使用PyTorch作为推理后端 - `--max_model_len 2048`:设置模型处理的最大长度 ## 三、自我认知微调 ### 1. 训练配置 接下来,我使用Swift的SFT(Supervised Fine-Tuning)功能对模型进行自我认知微调: ```csharp swift sft \  --model Qwen/Qwen2.5-Coder-0.5B-Instruct \  --train_type lora \  --dataset 'swift/self-cognition#500' \  --torch_dtype bfloat16 \  --num_train_epochs 1 \  --per_device_train_batch_size 1 \  --per_device_eval_batch_size 1 \  --learning_rate 1e-4 \  --lora_rank 8 \  --lora_alpha 32 \  --target_modules all-linear \  --gradient_accumulation_steps 16 \  --eval_steps 50 \  --save_steps 50 \  --save_total_limit 2 \  --logging_steps 5 \  --max_length 2048 \  --output_dir output \  --system 'You are a helpful assistant.' \  --warmup_ratio 0.05 \  --dataloader_num_workers 4 \  --dataset_num_proc 4 \  --model_name '小黄''Xiao Huang' \  --model_author '魔搭''ModelScope' ``` 这里使用了很多参数,我来解释几个关键的: - `--train_type lora`:使用LoRA (Low-Rank Adaptation) 技术进行微调,这是一种参数高效的微调方法 - `--dataset 'swift/self-cognition#500'`:使用Swift提供的自我认知数据集,包含500条样本 - `--model_name '小黄' 'Xiao Huang'`:设置模型的名字为"小黄" - `--model_author '魔搭' 'ModelScope'`:设置模型作者为"魔搭" - `--system 'You are a helpful assistant.'`:设置系统提示词 ### 2. 训练结果测试 微调完成后,我们可以使用以下命令测试新模型的效果: ```csharp swift infer \  --adapters /mnt/e/projects/pythonProject/ms-swift/output/v2-20250425-115306/checkpoint-31 \  --stream true \  --temperature 0 \  --infer_backend pt \  --max_new_tokens 2048 ``` 注意这里的`--adapters`参数指向我们训练好的模型权重,而不是加载完整模型。这是LoRA微调的优势之一,我们只需要保存和加载很小的权重文件即可。初步测试表明,模型已经能够以"小黄"的身份回答问题了! ## 四、开发专属TA404前端开发助手 在成功实现自我认知微调后,我又尝试了一个更加实用的案例:针对特定前端框架TA404开发一个专属助手。 ### 1. 准备训练数据 首先,我准备了一个名为`training-data.jsonl`的训练数据集,包含了TA404框架的各种开发案例和最佳实践。 ```csharp ...{"id":"range-picker-example-3-1","instruction":"提供 RangePicker 组件的 自定义日期单元格渲染 使用示例","input":"","output":"### 自定义日期单元格渲染\n```\n\n\nexport default {\n  methods: {\n    getCurrentStyle (current, today) {\n      const style = {}\n      if (current.date() === 1) {\n        style.border = '1px solid #1890ff'\n        style.borderRadius = '50%'\n      }\n      return style\n    },\n  },\n}\n\n```\n\n通过 `dateRender` 插槽实现对日期单元格的样式和内容自定义。\n\n---"}... ``` ### 2. 模型训练 然后使用以下命令进行微调: ```csharp swift sft \  --model Qwen/Qwen2.5-Coder-0.5B-Instruct \  --train_type lora \  --dataset '/mnt/e/projects/pythonProject/ta404-dataset-gen/training-data.jsonl' \  --torch_dtype bfloat16 \  --num_train_epochs 1 \  --per_device_train_batch_size 1 \  --per_device_eval_batch_size 1 \  --learning_rate 1e-4 \  --lora_rank 8 \  --lora_alpha 32 \  --target_modules all-linear \  --gradient_accumulation_steps 16 \  --eval_steps 50 \  --save_steps 50 \  --save_total_limit 2 \  --logging_steps 5 \  --max_length 8192 \  --output_dir output \  --system '你是私有前端框架 ta404 开发助手,使用Vue 2.7版本进行前端页面开发,在开发中合理使用 ta404 组件进行代码编写。' \  --warmup_ratio 0.05 \  --dataloader_num_workers 4 \  --dataset_num_proc 4 ``` 这次微调的特点在于: 1. 使用了自己准备的训练数据(ta404框架相关的问答对) 2. 设置了特定的system提示词,明确了助手的角色定位 3. 增加了最大长度至8192,以处理更复杂的代码生成任务 ## 五、应用测试与部署 ### 1. 交互式测试 在花费近3个小时后,微调完成。然后我使用了Swift提供的应用模式来与模型交互: ```csharp swift app \  --adapters test/output/v0-20250507-105125/checkpoint-286 \  --stream true \  --temperature 0.7 \  --infer_backend pt \  --max_new_tokens 2048 ``` 在应用模式下,Swift提供了一个简单的CLI界面,可以方便地与模型进行对话测试。这里我将温度设置为0.7,允许模型有一定的创造性,同时又不会过于发散。 ### 2. 导出与部署 为了更好地部署和使用微调后的模型,我选择将LoRA权重与原始模型合并,以便进行一体化部署: ```csharp swift export \  --adapters test/output/v0-20250507-105125/checkpoint-286 \  --merge_lora true ``` 导出完成后,我选择使用vLLM作为推理引擎进行部署,这能提供更高效的服务: ```csharp vllm serve /mnt/e/projects/pythonProject/ms-swift/test/output/v0-20250507-105125/checkpoint-286-merged --gpu-memory-utilization 0.15 ``` 由于我的显卡内存有限,我设置了较低的GPU内存使用率(15%),这足以满足Qwen2.5-Coder-0.5B这样的小模型部署需求。 ## 六、经验总结与优化建议 通过这两次微调实践,我总结了以下几点经验: ### 1. 数据质量比数量更重要 即使是只有500条的自我认知数据集,只要质量高,也能让模型形成清晰的角色认知。对于特定领域助手,提供高质量的示例比堆积大量低质量数据效果更好。 ### 2. LoRA参数的选择 `lora_rank`和`lora_alpha`的设置会影响微调效果,通常来说: - 较小的rank值(如4-8)适合简单任务或小数据集 - 较大的rank值(如16-32)适合复杂任务或大数据集 - alpha/rank比值通常保持在4左右较为合适 ### 3. 系统提示词的作用 不要小看`--system`参数的作用,一个精心设计的系统提示词能显著提升模型的表现。 ### 4. 硬件需求与优化 对于0.5B级别的小模型,即使是普通的GPU也能完成训练。我使用的是一张RTX 3060,训练速度完全可以接受。 如果资源有限,可以通过以下方式优化: - 降低`per_device_train_batch_size`并增加`gradient_accumulation_steps` - 使用`bfloat16`或`float16`混合精度训练 - 适当减少`eval_steps`和`save_steps`的频率 ## 七、成果展示 微调后的模型在各自的目标任务上都表现出了明显提升: 1. **自我认知微调后**:模型能够清晰地知道自己是"小黄",由"魔搭"创建,并保持了原有的编程能力。 2. **TA404前端助手**:模型能够根据需求生成符合TA404框架规范的Vue 2.7代码,熟练使用框架特有的组件和API。 ## 结语 ModelScope Swift框架极大地简化了大模型微调的复杂度,让即使是初学者也能快速上手。通过本文介绍的方法,您也可以根据自己的需求,打造专属的AI助手,无论是改变模型的人格特征,还是增强特定领域的能力。