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

> > 随着大模型技术的普及,如何让模型更好地适应特定场景需求成为开发者的焦点。本文将分享我使用ModelScope Swift框架微调Qwen2.5-Coder-0.5B-Instruct模型的完整过程,让您也能轻松打造专属AI助手。

前言

近期,我尝试对通义千问的Qwen2.5-Coder-0.5B-Instruct模型进行微调,实现两个不同的目标:一个是基础的自我认知调整,另一个是针对特定前端框架TA404的开发助手。本文将详细记录整个过程,从环境准备到模型训练再到效果验证和部署,希望能为有相似需求的开发者提供参考。

一、环境准备

首先,我们需要安装ModelScope的Swift框架,它是阿里巴巴魔搭社区提供的大模型微调工具:

pip install 'ms-swift'

安装完成后,我们就可以使用Swift框架提供的各种命令来操作模型了。

二、初始模型测试

在开始微调前,我们先测试一下原始模型的效果,了解它的基础能力:

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)功能对模型进行自我认知微调:

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. 训练结果测试

    微调完成后,我们可以使用以下命令测试新模型的效果:

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框架的各种开发案例和最佳实践。

...{"id":"range-picker-example-3-1","instruction":"提供 RangePicker 组件的 自定义日期单元格渲染 使用示例","input":"","output":"### 自定义日期单元格渲染\n```\n\n  \n    \n      \n        \n          {{current.date()}}\n        \n      \n    \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. 模型训练

然后使用以下命令进行微调:

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提供的应用模式来与模型交互:

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权重与原始模型合并,以便进行一体化部署:

swift export \  --adapters test/output/v0-20250507-105125/checkpoint-286 \  --merge_lora true

导出完成后,我选择使用vLLM作为推理引擎进行部署,这能提供更高效的服务:

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_ranklora_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

  • 使用bfloat16float16混合精度训练

  • 适当减少eval_stepssave_steps的频率

    七、成果展示

    微调后的模型在各自的目标任务上都表现出了明显提升:

  1. 自我认知微调后:模型能够清晰地知道自己是“小黄”,由“魔搭”创建,并保持了原有的编程能力。

  2. TA404前端助手:模型能够根据需求生成符合TA404框架规范的Vue 2.7代码,熟练使用框架特有的组件和API。

    结语

    ModelScope Swift框架极大地简化了大模型微调的复杂度,让即使是初学者也能快速上手。通过本文介绍的方法,您也可以根据自己的需求,打造专属的AI助手,无论是改变模型的人格特征,还是增强特定领域的能力。