手把手教学:用ms-swift在本地跑通Qwen2-7B微调

1. 引言:为什么选择ms-swift做微调?

你是不是也遇到过这样的问题:想微调一个大模型,结果环境配置搞了一整天,依赖冲突、版本不兼容、显存爆了……最后还没开始训练就放弃了?今天这篇文章就是来帮你解决这个问题的。

我们用 ms-swift 这个框架,目标是:在本地单机环境下,10分钟内跑通 Qwen2-7B 的 LoRA 微调。整个过程不需要写复杂代码,一条命令就能搞定,小白也能轻松上手。

ms-swift 是魔搭社区推出的大模型微调框架,它的最大优势就是——简单、高效、支持广。它支持600多个文本大模型和300多个多模态模型,像 Qwen、Llama、ChatGLM 这些主流模型都能直接用。而且它内置了 LoRA、QLoRA、DPO、DPO 等主流微调方法,连强化学习都支持,真正做到了“一键训练”。

更重要的是,ms-swift 对硬件要求友好。7B级别的模型,用一张3090就能跑起来,显存占用低至9GB,非常适合个人开发者和小团队本地实验。

接下来,我会带你一步步完成从环境安装到模型微调、再到推理测试的完整流程。准备好了吗?我们开始吧!

2. 环境准备与快速部署

2.1 安装ms-swift

首先,我们需要创建一个独立的 Python 环境,避免和其他项目产生依赖冲突。这里推荐使用 conda:

conda create -n swift python=3.10
conda activate swift

激活环境后,安装 ms-swift。官方提供了两种方式,推荐使用 pip 安装,简单快捷:

pip install 'ms-swift[all]' -U -i https://pypi.tuna.tsinghua.edu.cn/simple

如果你更喜欢源码安装,也可以克隆仓库后手动安装:

git clone https://github.com/modelscope/ms-swift.git
cd swift
pip install -e '.[llm]' -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后,运行 swift --help,如果能正常输出帮助信息,说明安装成功。

2.2 检查CUDA与GPU环境

确保你的系统已经正确安装了 NVIDIA 驱动和 CUDA 工具包。运行以下命令检查 GPU 是否可用:

nvidia-smi

你应该能看到类似 RTX 3090 或 A100 的显卡信息,并且驱动版本和 CUDA 版本匹配。ms-swift 要求 PyTorch 版本 >= 2.0,建议使用 CUDA 11.8 或 12.x。

如果你使用的是 RTX 40系列显卡(如4090),可能会遇到 NCCL 通信问题,提示如下错误:

NotImplementedError: Using RTX 4000 series doesn't support faster communication broadband via P2P or IB.

解决方法很简单,在运行命令前加上环境变量:

export NCCL_IB_DISABLE=1; export NCCL_P2P_DISABLE=1;

这样就能绕过 P2P 和 InfiniBand 通信限制,顺利启动训练。

3. 快速启动Qwen2-7B微调任务

3.1 一句话启动微调

ms-swift 的设计哲学就是“极简”,我们只需要一条命令,就能启动 Qwen2-7B-Instruct 的 LoRA 微调:

CUDA_VISIBLE_DEVICES=0 \
swift sft \
    --model Qwen/Qwen2-7B-Instruct \
    --train_type lora \
    --dataset 'AI-ModelScope/alpaca-gpt4-data-zh#500' \
              'AI-ModelScope/alpaca-gpt4-data-en#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

别被这么多参数吓到,我来帮你拆解一下关键配置:

  • --model: 指定要微调的模型,这里用的是 Qwen2-7B-Instruct。
  • --train_type lora: 使用 LoRA 进行参数高效微调,大幅降低显存消耗。
  • --dataset: 指定训练数据集,支持多个数据集拼接,#500 表示每个数据集只取500条样本用于快速实验。
  • --lora_rank 8: LoRA 的秩,控制可训练参数量,8是一个平衡性能和效率的好选择。
  • --gradient_accumulation_steps 16: 梯度累积步数,相当于变相增大 batch size,提升训练稳定性。
  • --output_dir output: 训练后的模型权重保存路径。

这条命令在单张3090上大约需要20分钟完成一轮训练,显存占用约18GB,完全在消费级显卡的承受范围内。

3.2 自定义数据集(可选)

如果你想用自己的数据进行微调,也很简单。ms-swift 支持标准的 sharegpt 格式 JSON 数据:

[
  {
    "conversations": [
      { "from": "human", "value": "你好" },
      { "from": "gpt", "value": "你好!有什么我可以帮你的吗?" }
    ],
    "system": "你是一个乐于助人的助手"
  }
]

假设你的数据文件是 my_data.json,只需将 --dataset 参数改为:

--dataset ./my_data.json

ms-swift 会自动加载并处理数据,无需额外预处理。

4. 模型训练过程详解

4.1 训练日志解读

启动训练后,你会看到类似下面的日志输出:

Train:  11%|█▏        | 100/873 [00:47<05:43,  2.25it/s]
{'loss': 1.509, 'acc': 0.603, 'grad_norm': 1.12, 'learning_rate': 1.9e-07, 'memory(GiB)': 18.21}

这些信息非常直观:

  • loss 是训练损失,越低越好;
  • acc 是预测准确率,反映模型对下一个 token 的预测能力;
  • memory(GiB) 显示当前显存占用;
  • remaining_time 预估剩余时间。

随着训练进行,你会发现 loss 逐渐下降,accuracy 缓慢上升,说明模型正在学习。

4.2 模型保存与检查点

每训练50步(由 --save_steps 50 控制),ms-swift 会自动保存一次检查点,目录结构如下:

output/
├── checkpoint-50/
├── checkpoint-100/
└── last_checkpoint -> checkpoint-100

你可以随时中断训练,下次继续从最新检查点恢复。如果想指定从某个检查点继续训练,可以加 --resume_from_checkpoint output/checkpoint-100 参数。

默认情况下,最多保留2个检查点(--save_total_limit 2),避免磁盘空间被占满。

5. 微调后模型推理测试

5.1 命令行交互式推理

训练完成后,我们可以用 swift infer 命令来测试模型效果。假设最后一个检查点是 output/checkpoint-100,运行:

CUDA_VISIBLE_DEVICES=0 \
swift infer \
    --adapters output/checkpoint-100 \
    --stream true \
    --temperature 0 \
    --max_new_tokens 2048

进入交互界面后,输入问题,比如:

用户:请介绍一下你自己

模型可能会回复:

我是通义千问Qwen2,经过指令微调的版本,能够回答问题、创作文字、表达观点等。

你会发现,相比原始模型,微调后的模型在回答风格、语气一致性上有了明显提升。

5.2 合并LoRA权重(可选)

如果你希望得到一个完整的、可以直接部署的模型,可以将 LoRA 权重合并回原模型:

swift export \
    --adapters output/checkpoint-100 \
    --output_dir qwen2-7b-instruct-lora-merged

合并后的模型可以直接用 Hugging Face 的 pipeline 或 vLLM 加载,无需额外依赖 ms-swift。

5.3 使用vLLM加速推理

为了获得更快的推理速度,可以启用 vLLM 引擎:

swift infer \
    --adapters output/checkpoint-100 \
    --infer_backend vllm \
    --vllm_max_model_len 8192 \
    --stream true

vLLM 支持 PagedAttention 技术,能显著提升吞吐量,特别适合高并发场景。

6. Web界面操作(零代码上手)

如果你不喜欢敲命令,ms-swift 还提供了图形化界面,真正做到“零代码”微调。

启动 Web UI:

swift web-ui

然后在浏览器打开 http://localhost:7860,你会看到一个简洁的操作面板:

  • 可视化选择模型、数据集、训练参数;
  • 实时查看训练进度和 loss 曲线;
  • 内置模型对话测试窗口;
  • 一键导出和部署。

这对于不熟悉命令行的用户来说非常友好,即使是产品经理也能自己动手微调模型。

7. 常见问题与解决方案

7.1 显存不足怎么办?

如果出现 OOM(Out of Memory)错误,可以尝试以下方法:

  • 降低 per_device_train_batch_size 到 1;
  • 使用 --torch_dtype fp16 替代 bfloat16
  • 启用梯度检查点:--gradient_checkpointing true
  • 使用 QLoRA:将 --train_type lora 改为 --train_type qlora,显存可降至9GB以下。

7.2 训练速度太慢?

  • 增加 dataloader_num_workers 提高数据加载速度;
  • 使用 --use_flash_attn true 开启 Flash Attention 加速;
  • 如果有多张 GPU,可以用 NPROC_PER_NODE=2 CUDA_VISIBLE_DEVICES=0,1 swift sft ... 启动多卡训练。

7.3 如何评估微调效果?

除了观察 loss 和 acc,还可以用 swift eval 对模型进行评测:

swift eval \
    --model Qwen/Qwen2-7B-Instruct \
    --adapters output/checkpoint-100 \
    --eval_dataset ceval

支持 MMLU、C-Eval、GSM8K 等主流评测基准,帮你客观衡量模型能力变化。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐