2卡分布式训练专用教程:环境搭建 → 数据准备 → 2卡 LoRA 微调 → 推理测试 → 部署上线
基于 MS-SWIFT 框架 | DeepSpeed ZeRO-2 | 每个参数详细解释 | 复制即用


第一步:环境准备

亲测可用:以下环境配置已在实际项目中验证通过

1.1 创建 Conda 环境

# 创建新环境conda create -n swift python=3.11 -y# 激活环境conda activate swift

1.2 安装核心依赖

根据官方文档,Qwen3.5 需要安装以下依赖:

# MS-SWIFTpip install uv uv pip install -U ms-swift# Transformers 和相关库uv pip install -U "transformers==5.2.0""qwen_vl_utils>=0.0.14" peft liger-kernel# Flash-Linear-Attention(请安装 main 分支)uv pip install -U git+https://github.com/fla-org/flash-linear-attention# Causal-Conv1dpip install -U git+https://github.com/Dao-AILab/causal-conv1d --no-build-isolation# Flash-Attention (可以跳过安装,不安装也能训练,这个安装需要耗时3小时,建议跳过)uv pip install "flash-attn==2.8.3" --no-build-isolation# DeepSpeed(多卡训练必须安装)uv pip install deepspeed# vLLM(可选,推理/部署时需要),这个可以暂时不安装uv pip install -U "vllm>=0.17.0"# 再安装一遍,防止 vllm的版本把这个覆盖掉;uv pip install transformers==5.2.0

重要提示

  • ⚠️ transformers==5.3.0 目前会报错,已实测验证
  • ✅ 推荐使用 transformers==5.2.0 版本
  • 如果安装了 vLLM,训练需要覆盖 vLLM 默认版本,再次安装一遍:uv pip install -U "transformers==5.2.0"
  • 🔥 多卡训练必须安装 DeepSpeed

1.3 验证安装

# 查看 swift 命令行工具swift sft --help# 如果能显示帮助信息,说明安装成功# 验证 DeepSpeed 安装ds_report# 应该显示 DeepSpeed 版本和 CUDA 信息

验证成功示例:


数据集准备

支持的数据格式

MS-SWIFT 支持多种数据格式,以下是常用的文本数据格式。

1. 纯文本数据
{"messages": [{"role": "user", "content": "浙江的省会在哪?"}, {"role": "assistant", "content": "浙江的省会在杭州。"}]}{"messages": [{"role": "system", "content": "你是个有用无害的助手"}, {"role": "user", "content": "介绍一下杭州"}, {"role": "assistant", "content": "杭州是浙江省省会..."}]}
2. 多轮对话数据
{"messages": [{"role": "system", "content": "你是一个专业的AI助手"}, {"role": "user", "content": "什么是机器学习?"}, {"role": "assistant", "content": "机器学习是人工智能的一个分支..."}, {"role": "user", "content": "它有哪些应用?"}, {"role": "assistant", "content": "机器学习广泛应用于图像识别、自然语言处理、推荐系统等领域..."}]}

说明:

  • 支持多轮对话历史
  • system 角色可选,用于设置助手行为
  • 对话轮次不限
3. Agent 工具调用数据(常用)
{"messages": [{"role": "user", "content": "帮我查一下北京今天的天气"}, {"role": "assistant", "content": "好的,我来帮你查询北京的天气信息。"}, {"role": "tool_call", "content": "{\"name\": \"get_weather\", \"arguments\": {\"city\": \"北京\"}}"}, {"role": "tool_response", "content": "{\"temperature\": \"15°C\", \"condition\": \"晴\"}"}, {"role": "assistant", "content": "北京今天的天气是晴天,温度15°C。"}], "tools": [{"type": "function", "function": {"name": "get_weather", "description": "获取指定城市的天气信息", "parameters": {"type": "object", "properties": {"city": {"type": "string", "description": "城市名称"}}, "required": ["city"]}}}]}

说明:

  • tool_call: 模型调用工具的请求
  • tool_response: 工具返回的结果
  • tools: 可用工具列表(函数定义)
  • 支持多次工具调用和多个工具

使用内置数据集

MS-SWIFT 提供了 150+ 内置数据集,可直接使用:

# 常用数据集AI-ModelScope/alpaca-gpt4-data-zh      # 中文指令数据AI-ModelScope/alpaca-gpt4-data-en      # 英文指令数据swift/self-cognition                   # 自我认知数据AI-ModelScope/LaTeX_OCR:human_handwrite # LaTeX OCR 数据

数据集采样语法:

# 基本格式:数据集id:子数据集#采样数量--dataset AI-ModelScope/alpaca-gpt4-data-zh#500# 多个数据集--dataset AI-ModelScope/alpaca-gpt4-data-zh#500 \          AI-ModelScope/alpaca-gpt4-data-en#500 \          swift/self-cognition#500# 使用子数据集--dataset AI-ModelScope/LaTeX_OCR:human_handwrite#2000

自定义数据集

将数据保存为 .jsonl 格式,在训练时指定:

--dataset train.jsonl --val_dataset val.jsonl

2卡训练快速开始

本教程提供完整的2卡训练脚本,所有参数都有详细解释。如需了解更多参数配置,请参考后文的"参数详细解释"部分。


完整多卡训练脚本示例

⭐ 核心部分:以下是完整的可运行多卡训练脚本,包含详细的训练过程截图展示

示例 1: 基础多卡 LoRA 微调(2卡,入门推荐)

#!/bin/bash# 2卡训练脚本 - 使用 DeepSpeed ZeRO-2# 数据集参数说明请参考前文"数据集准备"章节export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:TrueNCCL_P2P_DISABLE=1 \NPROC_PER_NODE=2 \CUDA_VISIBLE_DEVICES=0,1 \swift sft \    --model Qwen/Qwen3.5-4B \    --dataset AI-ModelScope/alpaca-gpt4-data-zh#2000 \    --tuner_type lora \    --lora_rank 16 \    --lora_alpha 32 \    --target_modules all-linear \    --torch_dtype bfloat16 \    --deepspeed zero2 \    --num_train_epochs 3 \    --per_device_train_batch_size 2 \    --gradient_accumulation_steps 4 \    --learning_rate 1e-4 \    --warmup_ratio 0.05 \    --max_length 2048 \    --gradient_checkpointing true \    --output_dir output/qwen3.5-4b-multi-2gpu \    --logging_steps 10 \    --save_steps 200 \    --eval_steps 200 \    --save_total_limit 3

参数详细解释

环境变量配置
参数 含义 说明
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True PyTorch CUDA 内存分配优化 强烈推荐 :启用可扩展内存段,避免显存碎片化导致的OOM错误。PyTorch 2.0+必备
NCCL_P2P_DISABLE=1 禁用 NCCL P2P 通信 某些GPU拓扑结构下P2P通信可能不稳定,禁用后使用更稳定的通信方式
NPROC_PER_NODE=2 每个节点的进程数 指定使用2个GPU,每个GPU对应1个训练进程
CUDA_VISIBLE_DEVICES=0,1 可见的GPU设备 指定使用GPU 0和1进行训练
模型和数据参数
参数 含义 说明
--model Qwen/Qwen3.5-4B 模型路径 指定要微调的基础模型,可以是ModelScope ID或本地路径
--dataset AI-ModelScope/alpaca-gpt4-data-zh#2000 训练数据集 使用alpaca中文数据集,采样2000条数据。格式:数据集ID#采样数量
LoRA 微调参数
参数 含义 说明
--tuner_type lora 微调方法 使用LoRA(Low-Rank Adaptation)进行参数高效微调
--lora_rank 16 LoRA秩 低秩矩阵的秩,控制LoRA参数量。值越大效果越好但参数越多,推荐8-32
--lora_alpha 32 LoRA缩放系数 控制LoRA权重的缩放,通常设为rank的2-4倍,影响学习强度
--target_modules all-linear 应用LoRA的模块 对所有线性层应用LoRA,覆盖范围最广,效果最好
训练精度和优化
参数 含义 说明
--torch_dtype bfloat16 模型数据类型 使用bfloat16混合精度训练,节省显存且训练稳定。如GPU不支持可改为float16
--deepspeed zero2 DeepSpeed配置 使用ZeRO-2优化,将优化器状态和梯度分片到多卡,节省显存30-40%
--gradient_checkpointing true 梯度检查点 通过重计算中间激活值节省显存,可降低显存占用30-40%,训练速度略慢10%
训练超参数
参数 含义 说明
--num_train_epochs 3 训练轮数 完整遍历数据集的次数,3轮通常足够,过多可能过拟合
--per_device_train_batch_size 2 每卡批次大小 每个GPU每次处理2个样本,显存不足可降为1
--gradient_accumulation_steps 4 梯度累积步数 累积4次梯度后更新参数,等效批次=2×4×2=16
--learning_rate 1e-4 学习率 LoRA推荐1e-4,控制参数更新幅度,过大不稳定,过小收敛慢
--warmup_ratio 0.05 预热比例 前5%步数学习率线性增长,帮助训练初期稳定
--max_length 2048 最大序列长度 单个样本最大token数,超过会被截断,显存不足可降为1024
保存和日志参数
参数 含义 说明
--output_dir output/qwen3.5-4b-multi-2gpu 输出目录 保存模型检查点、日志等文件的目录
--logging_steps 10 日志记录间隔 每10步记录一次训练指标(loss、学习率等)
--save_steps 200 保存间隔 每200步保存一次模型检查点
--eval_steps 200 评估间隔 每200步在验证集上评估一次(需要有验证集)
--save_total_limit 3 最多保存检查点数 只保留最新的3个检查点,节省磁盘空间

关键配置说明

有效批次大小计算:

有效批次 = per_device_train_batch_size × gradient_accumulation_steps × GPU数量        = 2 × 4 × 2 = 16

显存占用估算(Qwen3.5-4B + LoRA):

  • 基础配置:约18-20GB/卡
  • 启用梯度检查点:约12-14GB/卡
  • 使用ZeRO-2:约10-12GB/卡

提示:

  • 如果GPU不支持bfloat16(如GTX系列),将 --torch_dtype bfloat16 改为 --torch_dtype float16
  • 如果显存不足,可以降低 per_device_train_batch_size 为1,或降低 max_length 为1024

推理部署

命令行推理

基础推理
CUDA_VISIBLE_DEVICES=0 \swift infer \    --adapters output/qwen3.5-4b-multi-2gpu/vx-xxx/checkpoint-xxx \    --stream true \    --max_new_tokens 512
推理参数说明
参数 说明 默认值 示例
--adapters LoRA 权重路径 [] output/qwen3.5-4b-multi-2gpu/vx-xxx/checkpoint-200
--stream 流式输出 None true
--max_new_tokens 最大生成 token 数 None 512 , 1024
--temperature 温度参数 从 config 读取 0.7 , 0 (确定性)
--top_k Top-K 采样 None 50
--top_p Top-P 采样 None 0.9
--enable_thinking 开启思考模式 None false
--load_data_args 加载训练时的数据参数 False true (验证集推理)

推理技巧:

  • 确定性输出: --temperature 0--top_k 1
  • 验证集推理: --load_data_args true 会自动加载训练时切分的验证集

Python 推理

import osos.environ['CUDA_VISIBLE_DEVICES'] = '0'from peft import PeftModelfrom swift import get_model_processor, get_templatefrom swift.infer_engine import TransformersEngine, InferRequest, RequestConfig# 加载模型和 LoRAadapter_dir = 'output/qwen3.5-4b-multi-2gpu/vx-xxx/checkpoint-xxx'model, processor = get_model_processor('Qwen/Qwen3.5-4B')model = PeftModel.from_pretrained(model, adapter_dir)# 创建模板和引擎template = get_template(processor, enable_thinking=False)engine = TransformersEngine(model, template=template)# 推理infer_request = InferRequest(messages=[{    "role": "user",    "content": '你好,你是谁?',}])request_config = RequestConfig(max_tokens=256, temperature=0.7)resp_list = engine.infer([infer_request], request_config=request_config)response = resp_list[0].choices[0].message.contentprint(response)# 流式推理request_config = RequestConfig(max_tokens=256, temperature=0.7, stream=True)gen_list = engine.infer([infer_request], request_config=request_config)for chunk in gen_list[0]:    if chunk isNone:        continue    print(chunk.choices[0].delta.content, end='', flush=True)print()

部署 API 服务

CUDA_VISIBLE_DEVICES=0 \swift deploy \    --adapters output/qwen3.5-4b-multi-2gpu/vx-xxx/checkpoint-xxx \    --served_model_name Qwen3.5-4B-lora \    --port 8025

部署参数:

参数 说明 默认值
--port 服务端口 8000
--host 服务地址 0.0.0.0
--api_key API 密钥 None

注意: 目前 vllm、sglang、lmdeploy 对 Qwen3.5 的 LoRA 加载存在兼容性问题,推荐使用默认的 transformers 后端,等待官方后续修复。

Web 界面

CUDA_VISIBLE_DEVICES=0 \swift app \    --adapters output/qwen3.5-4b-multi-2gpu/vx-xxx/checkpoint-xxx \    --stream true

浏览器打开显示的地址(通常是 http://localhost:7860)即可对话。


常见问题与解决方案

Q1: 多卡训练显存不足 (OOM)

解决方案(按优先级):

  1. 启用 PyTorch CUDA 内存优化(必备!)

    export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
    

    为什么必须添加:

    实际效果:

  • 不启用:训练到一半突然 OOM,显存使用率只有 70%

  • 启用后:同样配置可以正常训练完成,显存利用率提升到 95%

  • PyTorch 默认的显存分配器会产生显存碎片化问题

  • 即使总显存充足,但由于碎片化导致无法分配连续大块显存,引发 OOM

  • expandable_segments:True 启用可扩展内存段,允许 PyTorch 动态扩展内存块

  • 特别是在多卡训练、DeepSpeed、梯度检查点等场景下,显存碎片化问题更严重

  • PyTorch 2.0+ 强烈推荐启用,可以避免 90% 的显存碎片化 OOM 问题

  1. 使用 DeepSpeed ZeRO-3

    --deepspeed zero3
    
  2. 启用梯度检查点

    --gradient_checkpointing true
    
  3. 减小批次大小

    --per_device_train_batch_size 1 \--gradient_accumulation_steps 8
    
  4. 使用 Liger Kernel

    --use_liger_kernel true
    
  5. 降低最大长度

    --max_length 1024
    
  6. CPU Offload(自定义 DeepSpeed 配置)

    "offload_optimizer": {  "device": "cpu",  "pin_memory": true}
    

Q2: 多卡训练速度慢

加速方法:

  1. 增加每卡批次大小

    --per_device_train_batch_size 4 \--gradient_accumulation_steps 2
    
  2. 使用 bf16 精度

    --torch_dtype bfloat16
    
  3. 使用数据缓存

    --load_from_cache_file true \--dataset_num_proc 16
    
  4. 优化 DeepSpeed 配置

  • 使用 ZeRO-2 而非 ZeRO-3(如果显存足够)
  • 启用通信优化:overlap_comm: true
  1. 安装 Flash Attention

    pip install flash-attn --no-build-isolation
    

Q3: GPU 利用率不均衡

解决方案:

  1. 检查数据分布

    --dataset_shuffle true \--group_by_length true
    
  2. 使用 DeepSpeed ZeRO-3

  • 自动平衡各卡负载
  1. 检查 CUDA_VISIBLE_DEVICES
  • 确保指定的 GPU 都可用

Q4: 训练效果不好

调优建议:

  1. 增加数据量(多卡可用更多数据)

    --dataset AI-ModelScope/alpaca-gpt4-data-zh#5000
    
  2. 增加训练轮数

    --num_train_epochs 5
    
  3. 调整学习率

    --learning_rate 5e-5 \--warmup_ratio 0.1
    
  4. 增大 LoRA rank(多卡显存充足)

    --lora_rank 64
    
  5. 使用 DoRA

    --use_dora true
    

Q5: 如何断点续训

swift sft \    --resume_from_checkpoint output/qwen3.5-4b-multi-2gpu/vx-xxx/checkpoint-200 \    <其他参数保持不变>

注意:

  • 保持其他参数不变,包括 GPU 数量和 DeepSpeed 配置
  • 会自动加载优化器状态和随机种子
  • 从上次的步数继续训练

Q6: 如何合并 LoRA 权重

swift export \    --adapters output/qwen3.5-4b-multi-2gpu/vx-xxx/checkpoint-200 \    --merge_lora true \    --output_dir output/qwen3.5-4b-merged

Q7: DeepSpeed 初始化失败

常见原因和解决方案:

  1. 未安装 DeepSpeed

    pip install deepspeed
    
  2. CUDA 版本不兼容

    # 检查 CUDA 版本nvcc --version# 重新安装对应版本的 DeepSpeed
    
  3. 环境变量问题

    export CUDA_HOME=/usr/local/cudaexport PATH=$CUDA_HOME/bin:$PATH
    

训练监控

TensorBoard

# 安装pip install tensorboard# 启动tensorboard --logdir output/qwen3.5-4b-multi-2gpu# 浏览器打开http://localhost:6006

SwanLab

swift sft \    --report_to swanlab \    --swanlab_token your_token \    --swanlab_project qwen3.5-multi-gpu-training \    <其他参数>

性能参考

Qwen3.5-4B LoRA 多卡训练性能

GPU配置 批次大小 显存占用/卡 训练速度
2卡 + ZeRO-2 2×4×2=16 ~16GB ~200 samples/s
4卡 + ZeRO-2 2×4×4=32 ~14GB ~400 samples/s
8卡 + ZeRO-2 4×2×8=64 ~12GB ~800 samples/s
4卡 + ZeRO-3 1×8×4=32 ~10GB ~350 samples/s

DeepSpeed 优化效果

配置 显存节省 速度影响 适用场景
ZeRO-2 30-40% 基准 2-8卡常规训练
ZeRO-3 50-60% 略慢 10-15% 大模型或显存不足
ZeRO-2 + CPU Offload 40-50% 略慢 20% 显存紧张
ZeRO-3 + CPU Offload 60-70% 略慢 30% 超大模型

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

在这里插入图片描述

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐