随着大模型技术的普及,如何让模型更好地适应特定场景需求成为开发者的焦点。本文将分享我使用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<template>\n \n <ta-range-picker>\n <template slot=\"dateRender\" slot-scope=\"current\">\n <div class=\"ant-calendar-date\" :style=\"getCurrentStyle(current)\">\n {{current.date()}}\n \n </template>\n </ta-range-picker>\n \n</template>\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</script>\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
这次微调的特点在于:
- 使用了自己准备的训练数据(ta404框架相关的问答对)设置了特定的system提示词,明确了助手的角色定位增加了最大长度至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_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
的频率七、成果展示
微调后的模型在各自的目标任务上都表现出了明显提升:
自我认知微调后:模型能够清晰地知道自己是"小黄",由"魔搭"创建,并保持了原有的编程能力。
TA404前端助手:模型能够根据需求生成符合TA404框架规范的Vue 2.7代码,熟练使用框架特有的组件和API。
结语
ModelScope Swift框架极大地简化了大模型微调的复杂度,让即使是初学者也能快速上手。通过本文介绍的方法,您也可以根据自己的需求,打造专属的AI助手,无论是改变模型的人格特征,还是增强特定领域的能力。
如果你对AI辅助编程感兴趣,欢迎关注【松哥AI自动化】公众号,获取更多深度技术文章。每周我们都会带来一篇从源码角度剖析各种实用工具实现原理的文章。
接下来,我计划进一步探索如何优化训练数据的构建方法,以及如何评估微调后模型的效果。如果您有任何问题或建议,欢迎在评论区留言讨论!
参考资源
本文首发于微信公众号,欢迎关注获取更多AI开发与应用实践。
上期回顾:(如何构造一款类似One API的大模型集成平台)