小白友好:ms-swift框架快速上手,5步完成大模型微调与部署
小白友好:ms-swift框架快速上手,5步完成大模型微调与部署
你是不是也想试试微调自己的大模型,但被复杂的代码和配置劝退了?今天我要介绍的ms-swift框架,就是专门为简化大模型微调而生的神器。它让大模型微调变得像搭积木一样简单,即使你是AI新手,也能在10分钟内完成一个模型的微调。
ms-swift是魔搭社区推出的大模型微调框架,支持600多个纯文本大模型和300多个多模态大模型。无论是Qwen、Llama、GLM这些热门模型,还是图片、视频、语音等多模态模型,它都能轻松搞定。
最棒的是,你不需要懂复杂的深度学习理论,也不需要写大量代码。ms-swift提供了命令行和Web界面两种方式,让微调变得超级简单。下面我就带你用5个步骤,从零开始完成一个大模型的微调。
1. 环境准备:3分钟搞定安装
开始之前,你需要准备一个Linux环境(推荐CentOS 7或Ubuntu 20.04+),以及一张NVIDIA显卡(RTX 4090、A100等都可以)。如果你的显卡是RTX 4000系列,还需要设置两个环境变量。
1.1 安装Anaconda
如果你还没有安装Anaconda,可以按照以下步骤操作:
# 下载Anaconda安装脚本 wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh # 运行安装脚本 bash Anaconda3-2023.09-0-Linux-x86_64.sh # 按照提示完成安装,然后激活conda环境 source ~/.bashrc1.2 创建并激活虚拟环境
# 创建名为swift的Python 3.10环境 conda create --name swift python=3.10 -y # 激活环境 conda activate swift1.3 安装ms-swift
ms-swift提供了两种安装方式,推荐使用pip直接安装,最简单快捷:
# 使用清华镜像源加速安装 pip install 'ms-swift[all]' -U -i https://pypi.tuna.tsinghua.edu.cn/simple如果你想要从源码安装,也可以这样做:
# 克隆源码 git clone https://github.com/modelscope/swift.git cd swift # 安装依赖 pip install -e '.[llm]' -i https://pypi.tuna.tsinghua.edu.cn/simple重要提示:ms-swift依赖PyTorch 1.13以上版本,推荐使用PyTorch 2.0.0+。如果你在安装过程中遇到问题,可以先安装PyTorch:
# 安装PyTorch(根据你的CUDA版本选择) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu1181.4 特殊显卡设置
如果你使用的是RTX 4000系列显卡(如RTX 4090),需要设置以下环境变量:
# 解决RTX 4000系列显卡的通信问题 export NCCL_IB_DISABLE=1 export NCCL_P2P_DISABLE=1你可以把这行命令添加到~/.bashrc文件中,这样每次登录都会自动设置。
2. 数据准备:准备你的训练数据
微调大模型就像教小孩说话,你需要准备一些"教材"——也就是训练数据。ms-swift支持多种数据格式,最常用的是ShareGPT格式。
2.1 数据格式说明
ShareGPT格式很简单,就是一个JSON数组,每个元素代表一次对话:
[ { "system": "你是一名优秀的陪聊大师,你的名字叫小蜜。", "conversations": [ { "from": "user", "value": "您和模型关系?" }, { "from": "assistant", "value": "其实我也不是无所不知,但如果能和你多聊几句,我情愿绞尽脑汁。" } ] }, { "system": "你是一名优秀的陪聊大师,你的名字叫小蜜。", "conversations": [ { "from": "user", "value": "请问一下您身份是啥?" }, { "from": "assistant", "value": "我是小蜜,任何时间!任何地点!不论什么事,只要你有疑问都可以来问我哦~" } ] } ]每个对话包含:
system:系统提示词(可选),告诉模型它的角色conversations:对话内容,包含用户提问和模型回答
2.2 创建数据集文件
假设我们要微调一个聊天助手,让它学会用特定的风格回答问题。我们创建一个简单的数据集:
# 创建数据目录 mkdir -p /data/service/swift/data # 创建数据集文件 cat > /data/service/swift/data/qwen_zh_demo.json << 'EOF' [ { "system": "你是一名优秀的陪聊大师,你的名字叫小蜜。", "conversations": [ { "from": "user", "value": "您和模型关系?" }, { "from": "assistant", "value": "其实我也不是无所不知,但如果能和你多聊几句,我情愿绞尽脑汁。" } ] }, { "system": "你是一名优秀的陪聊大师,你的名字叫小蜜。", "conversations": [ { "from": "user", "value": "请问一下您身份是啥?" }, { "from": "assistant", "value": "我是小蜜,任何时间!任何地点!不论什么事,只要你有疑问都可以来问我哦~" } ] } ] EOF2.3 创建数据集描述文件
为了让ms-swift识别我们的数据集,还需要创建一个描述文件:
cat > /data/service/swift/data/custom_dataset_info.json << 'EOF' { "qwen_zh_demo": { "dataset_path": "/data/service/swift/data/qwen_zh_demo.json" } } EOF这个文件告诉ms-swift:有一个叫qwen_zh_demo的数据集,它的数据在/data/service/swift/data/qwen_zh_demo.json这个位置。
3. 模型下载:获取预训练模型
在开始微调之前,你需要先下载一个基础模型。ms-swift支持从ModelScope和HuggingFace下载模型,这里我们使用Qwen2-7B-Instruct模型。
3.1 下载模型
你可以选择从ModelScope下载(国内速度快):
# 创建模型保存目录 mkdir -p /data/model/qwen2-7b-instruct # 使用ModelScope下载(推荐国内用户) git clone https://www.modelscope.cn/qwen/Qwen2-7B-Instruct.git /data/model/qwen2-7b-instruct或者从HuggingFace下载:
# 使用HuggingFace下载 git clone https://huggingface.co/Qwen/Qwen2-7B-Instruct /data/model/qwen2-7b-instruct3.2 模型说明
Qwen2-7B-Instruct是通义千问团队推出的7B参数指令微调模型,具有以下特点:
- 强大的对话能力:在多个基准测试中表现优秀
- 代码和数学能力强:得益于高质量的训练数据
- 多语言支持:支持27种语言
- 长上下文:支持32K上下文长度
这个模型大小约14GB,下载需要一些时间,建议在网络条件好的时候进行。
4. 开始微调:两种方式任选
ms-swift提供了两种微调方式:命令行和Web界面。命令行适合熟悉Linux的用户,Web界面则更加直观易用。
4.1 命令行方式微调
命令行方式最灵活,适合批量处理和自动化。下面是一个完整的微调命令:
# 激活环境 conda activate swift # 设置环境变量(RTX 4000系列显卡需要) export NCCL_IB_DISABLE=1 export NCCL_P2P_DISABLE=1 # 开始微调 CUDA_VISIBLE_DEVICES=0,1 \ nohup swift sft \ --model_id_or_path /data/model/qwen2-7b-instruct \ --model_type qwen2-7b-instruct \ --sft_type lora \ --tuner_backend peft \ --dtype fp16 \ --output_dir /data/model/sft/qwen2-7b-instruct-sft \ --dataset qwen_zh_demo \ --custom_dataset_info /data/service/swift/data/custom_dataset_info.json \ --num_train_epochs 1 \ --max_length 2048 \ --check_dataset_strategy warning \ --lora_rank 8 \ --lora_alpha 32 \ --lora_dropout_p 0.05 \ --lora_target_modules ALL \ --gradient_checkpointing true \ --batch_size 1 \ --weight_decay 0.1 \ --learning_rate 5e-6 \ --gradient_accumulation_steps 1 \ --max_grad_norm 0.5 \ --warmup_ratio 0.03 \ --eval_steps 100 \ --save_steps 100 \ --save_total_limit 2 \ --logging_steps 100 \ --use_flash_attn false > output.txt 2>&1 &关键参数说明:
| 参数 | 说明 | 推荐值 |
|---|---|---|
--model_id_or_path | 模型路径 | 你下载的模型位置 |
--model_type | 模型类型 | 根据模型选择,如qwen2-7b-instruct |
--sft_type | 微调类型 | lora(轻量微调)或full(全参数微调) |
--output_dir | 输出目录 | 微调后的模型保存位置 |
--dataset | 数据集名称 | 自定义数据集的名字 |
--custom_dataset_info | 数据集描述文件 | 告诉框架数据集在哪里 |
--num_train_epochs | 训练轮数 | 1-3轮通常足够 |
--max_length | 最大长度 | 根据模型和显存调整 |
--lora_rank | LoRA秩 | 8-32,越大效果越好但参数越多 |
--learning_rate | 学习率 | 5e-6到1e-5比较合适 |
4.2 Web界面方式微调
如果你不熟悉命令行,ms-swift还提供了Web界面,点点鼠标就能完成微调:
# 启动Web界面 conda activate swift nohup swift web-ui --host 0.0.0.0 --port 7860 > webui_output.txt 2>&1 &启动后,在浏览器中访问http://你的服务器IP:7860,你会看到这样的界面:
在Web界面中,你只需要:
- 选择模型类型
- 上传或选择数据集
- 设置训练参数
- 点击开始训练
界面会自动生成训练命令,并在后台执行。你可以在界面上实时查看训练进度和日志。
4.3 训练过程监控
无论使用哪种方式,训练开始后你都可以查看日志:
# 查看训练日志 tail -f output.txt你会看到类似这样的输出:
{'loss': 1.5091, 'acc': 0.6034, 'learning_rate': 5e-06, 'epoch': 0.0} {'loss': 1.6385, 'acc': 0.5922, 'learning_rate': 4.91e-06, 'epoch': 0.11}关键指标说明:
loss:损失值,越小越好acc:准确率,越大越好learning_rate:当前学习率epoch:训练进度
训练完成后,你会在输出目录看到保存的模型文件。
5. 模型推理:测试微调效果
微调完成后,最重要的一步就是测试效果。ms-swift提供了多种推理方式。
5.1 命令行推理
使用微调后的模型进行推理:
# 使用交互式命令行推理 CUDA_VISIBLE_DEVICES=0 \ swift infer \ --adapters /data/model/sft/qwen2-7b-instruct-sft/qwen2-7b-instruct/v0-20240901-140352/checkpoint-873 \ --stream true \ --temperature 0 \ --max_new_tokens 2048参数说明:
--adapters:微调后的模型检查点路径--stream:是否流式输出--temperature:生成温度,0表示确定性输出--max_new_tokens:最大生成token数
运行后,你会进入交互模式,可以输入问题测试模型:
请输入问题:你好,我是谁? 模型回答:我是小蜜,任何时间!任何地点!不论什么事,只要你有疑问都可以来问我哦~5.2 使用vLLM加速推理
如果你需要更快的推理速度,可以合并LoRA权重并使用vLLM加速:
# 合并LoRA并使用vLLM加速 CUDA_VISIBLE_DEVICES=0 \ swift infer \ --adapters /data/model/sft/qwen2-7b-instruct-sft/qwen2-7b-instruct/v0-20240901-140352/checkpoint-873 \ --stream true \ --merge_lora true \ --infer_backend vllm \ --vllm_max_model_len 8192 \ --temperature 0 \ --max_new_tokens 20485.3 Web界面推理
ms-swift也提供了Web界面的推理工具:
# 启动推理Web界面 CUDA_VISIBLE_DEVICES=0 swift app \ --model Qwen/Qwen2.5-7B-Instruct \ --stream true \ --infer_backend pt \ --max_new_tokens 2048 \ --lang zh访问http://你的服务器IP:7860,你就可以在网页上直接与模型对话了。
5.4 模型部署
如果你想将微调后的模型部署为API服务:
# 部署为API服务 CUDA_VISIBLE_DEVICES=0 swift deploy \ --model Qwen/Qwen2.5-7B-Instruct \ --infer_backend vllm这会启动一个兼容OpenAI API的服务,你可以用任何支持OpenAI API的客户端来调用。
6. 进阶技巧:提升微调效果
掌握了基础操作后,我们来看看如何进一步提升微调效果。
6.1 调整LoRA参数
LoRA微调有几个关键参数可以调整:
# 调整LoRA参数示例 CUDA_VISIBLE_DEVICES=0 swift sft \ --model_id_or_path /data/model/qwen2-7b-instruct \ --sft_type lora \ --lora_rank 16 \ # 增加秩,提升表达能力 --lora_alpha 64 \ # 增加alpha,提升学习率 --lora_dropout_p 0.1 \ # 增加dropout,防止过拟合 --lora_target_modules "q_proj,v_proj" \ # 指定目标模块 # ... 其他参数参数调优建议:
- 小数据集(<1000条):
lora_rank=8, lora_alpha=32 - 中等数据集(1000-10000条):
lora_rank=16, lora_alpha=64 - 大数据集(>10000条):
lora_rank=32, lora_alpha=128
6.2 使用量化训练节省显存
如果你的显卡显存有限,可以使用量化训练:
# 使用QLoRA量化训练(7B模型只需9GB显存) CUDA_VISIBLE_DEVICES=0 swift sft \ --model_id_or_path /data/model/qwen2-7b-instruct \ --sft_type lora \ --quantization_bit 4 \ # 4位量化 --quantization_method bnb \ # 使用bitsandbytes量化 # ... 其他参数6.3 多GPU训练加速
如果你有多张显卡,可以加速训练:
# 使用2张GPU训练 CUDA_VISIBLE_DEVICES=0,1 \ NPROC_PER_NODE=2 \ swift sft \ --model_id_or_path /data/model/qwen2-7b-instruct \ --deepspeed zero2 \ # 使用DeepSpeed ZeRO-2优化 # ... 其他参数6.4 使用内置数据集
ms-swift内置了150多个数据集,你可以直接使用:
# 使用内置数据集 CUDA_VISIBLE_DEVICES=0 swift sft \ --model Qwen/Qwen2.5-7B-Instruct \ --dataset 'AI-ModelScope/alpaca-gpt4-data-zh#500' \ # 中文指令数据集 'AI-ModelScope/alpaca-gpt4-data-en#500' \ # 英文指令数据集 'swift/self-cognition#500' \ # 自我认知数据集 # ... 其他参数7. 常见问题与解决方案
在实际使用中,你可能会遇到一些问题,这里整理了一些常见问题的解决方法。
7.1 显存不足问题
问题:训练时出现CUDA out of memory错误。
解决方案:
- 减小批次大小:
--batch_size 1 - 使用梯度累积:
--gradient_accumulation_steps 4 - 启用梯度检查点:
--gradient_checkpointing true - 使用量化训练:
--quantization_bit 4 - 使用QLoRA:
--sft_type lora+--quantization_bit 4
# 最小显存配置示例(7B模型约需9GB) CUDA_VISIBLE_DEVICES=0 swift sft \ --model_id_or_path /data/model/qwen2-7b-instruct \ --sft_type lora \ --quantization_bit 4 \ --batch_size 1 \ --gradient_accumulation_steps 8 \ --gradient_checkpointing true \ # ... 其他参数7.2 训练速度慢
问题:训练速度太慢,一个epoch要很久。
解决方案:
- 使用Flash Attention加速:
--use_flash_attn true - 增加批次大小:
--batch_size 4(在显存允许的情况下) - 使用多GPU训练
- 使用混合精度训练:
--dtype bf16(需要显卡支持)
# 加速训练配置 CUDA_VISIBLE_DEVICES=0,1 \ NPROC_PER_NODE=2 \ swift sft \ --model_id_or_path /data/model/qwen2-7b-instruct \ --use_flash_attn true \ --dtype bf16 \ --batch_size 2 \ --gradient_accumulation_steps 4 \ # ... 其他参数7.3 模型过拟合
问题:模型在训练集上表现很好,但在新数据上表现差。
解决方案:
- 增加Dropout:
--lora_dropout_p 0.1 - 使用权重衰减:
--weight_decay 0.01 - 早停策略:监控验证集loss,提前停止训练
- 增加数据量或使用数据增强
# 防止过拟合配置 CUDA_VISIBLE_DEVICES=0 swift sft \ --model_id_or_path /data/model/qwen2-7b-instruct \ --lora_dropout_p 0.1 \ --weight_decay 0.01 \ --num_train_epochs 3 \ # 减少训练轮数 --eval_steps 50 \ # 更频繁地验证 --save_steps 50 \ # ... 其他参数7.4 模型效果不佳
问题:微调后模型效果没有提升。
解决方案:
- 检查数据质量:确保数据格式正确,内容相关
- 调整学习率:尝试
1e-5、5e-6、1e-6等不同值 - 增加LoRA秩:
--lora_rank 32 - 使用全参数微调:
--sft_type full(需要更多显存) - 尝试不同的优化器:
--optim adamw_torch_fused
# 提升效果配置 CUDA_VISIBLE_DEVICES=0 swift sft \ --model_id_or_path /data/model/qwen2-7b-instruct \ --sft_type lora \ --lora_rank 32 \ --lora_alpha 64 \ --learning_rate 1e-5 \ --optim adamw_torch_fused \ --num_train_epochs 5 \ # ... 其他参数8. 实际应用案例
让我们看几个实际的应用场景,了解ms-swift能做什么。
8.1 客服机器人微调
假设你要为电商平台微调一个客服机器人:
// customer_service_data.json [ { "system": "你是一个专业的电商客服助手,负责回答用户关于订单、物流、退换货的问题。", "conversations": [ { "from": "user", "value": "我的订单什么时候发货?" }, { "from": "assistant", "value": "您好!您的订单将在24小时内发货,发货后会有短信通知您物流单号。" } ] }, { "system": "你是一个专业的电商客服助手,负责回答用户关于订单、物流、退换货的问题。", "conversations": [ { "from": "user", "value": "商品有质量问题怎么退货?" }, { "from": "assistant", "value": "如果商品有质量问题,请在收到货7天内联系客服,我们会安排上门取件并全额退款。" } ] } ]训练命令:
CUDA_VISIBLE_DEVICES=0 swift sft \ --model_id_or_path /data/model/qwen2-7b-instruct \ --dataset customer_service_data \ --custom_dataset_info /path/to/customer_service_info.json \ --sft_type lora \ --output_dir /data/model/customer_service_bot \ --num_train_epochs 3 \ --max_length 1024 \ # ... 其他参数8.2 代码助手微调
如果你要微调一个代码生成助手:
// code_assistant_data.json [ { "system": "你是一个专业的编程助手,擅长Python、JavaScript、Java等多种编程语言。", "conversations": [ { "from": "user", "value": "用Python写一个快速排序算法" }, { "from": "assistant", "value": "```python\ndef quick_sort(arr):\n if len(arr) <= 1:\n return arr\n pivot = arr[len(arr) // 2]\n left = [x for x in arr if x < pivot]\n middle = [x for x in arr if x == pivot]\n right = [x for x in arr if x > pivot]\n return quick_sort(left) + middle + quick_sort(right)\n```" } ] } ]8.3 多轮对话微调
对于需要记忆上下文的对话场景:
// multi_turn_data.json [ { "system": "你是一个贴心的生活助手。", "conversations": [ { "from": "user", "value": "我今天心情不好" }, { "from": "assistant", "value": "听到你心情不好,我很难过。愿意和我聊聊发生了什么吗?" }, { "from": "user", "value": "工作压力太大了" }, { "from": "assistant", "value": "工作压力确实让人喘不过气。试试深呼吸,或者休息一下喝杯茶?我也可以帮你分析一下工作安排。" } ] } ]9. 模型评估与优化
微调完成后,如何评估模型效果并进行优化?
9.1 使用内置评估工具
ms-swift提供了评估功能:
# 评估模型在特定数据集上的表现 CUDA_VISIBLE_DEVICES=0 swift eval \ --model /data/model/sft/qwen2-7b-instruct-sft \ --eval_dataset ARC_c \ # 使用ARC推理数据集 --infer_backend lmdeploy \ --eval_backend OpenCompass9.2 人工评估
除了自动评估,人工评估也很重要。你可以准备一些测试问题:
# test_questions.txt 1. 介绍一下你自己 2. 你能帮我做什么? 3. 今天的天气怎么样? 4. 用Python写一个Hello World程序 5. 解释一下什么是机器学习然后批量测试模型回答:
# 批量测试 while IFS= read -r question; do echo "问题:$question" swift infer --adapters /path/to/model --prompt "$question" echo "---" done < test_questions.txt9.3 模型量化部署
如果要将模型部署到资源有限的环境,可以进行量化:
# 将模型量化为4位 CUDA_VISIBLE_DEVICES=0 swift export \ --model /data/model/sft/qwen2-7b-instruct-sft \ --quant_bits 4 \ --quant_method awq \ --dataset AI-ModelScope/alpaca-gpt4-data-zh \ --output_dir /data/model/qwen2-7b-instruct-4bit量化后的模型大小会大幅减小,推理速度也会提升。
10. 总结
通过这5个步骤,你已经掌握了使用ms-swift进行大模型微调的全流程。让我们回顾一下关键点:
10.1 核心步骤回顾
- 环境准备:安装Anaconda和ms-swift,3分钟搞定
- 数据准备:准备ShareGPT格式的数据集
- 模型下载:从ModelScope或HuggingFace下载基础模型
- 开始微调:命令行或Web界面任选,10分钟完成训练
- 模型推理:测试微调效果,部署使用
10.2 ms-swift的优势
- 简单易用:命令行和Web界面两种方式,适合不同用户
- 支持广泛:600+文本模型,300+多模态模型
- 资源友好:支持LoRA、QLoRA等轻量微调,显存要求低
- 功能全面:训练、推理、评估、量化、部署一站式解决
- 性能优秀:支持Flash Attention、DeepSpeed等加速技术
10.3 给新手的建议
如果你是第一次尝试大模型微调,我建议:
- 从小开始:先用小数据集(10-100条)测试整个流程
- 循序渐进:先尝试命令行,熟悉后再用Web界面
- 多试多调:不同的参数组合效果不同,多尝试几次
- 关注日志:训练过程中的loss和acc是重要参考
- 及时备份:好的模型检查点要及时保存
10.4 下一步学习方向
掌握了基础微调后,你可以进一步学习:
- 多模态模型:尝试图片、视频、语音模型的微调
- 强化学习:使用DPO、KTO等算法进一步提升模型效果
- 模型融合:将多个微调模型融合,获得更好效果
- 分布式训练:学习多卡、多机训练加速
- 自定义模型:支持自定义模型架构和训练逻辑
大模型微调不再是高不可攀的技术,有了ms-swift这样的工具,每个人都可以轻松上手。现在就去试试吧,给你的模型注入专属的知识和风格!
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
