大模型分布式训练的基本概念

1.1 为什么需要分布式训练?

模型规模爆炸:现代大模型(如GPT-3、LLaMA等)参数量达千亿
级别,单卡GPU无法存储完整模型。
计算资源需求:训练大模型需要海量计算(如GPT-3需数万GPU小
时),分布式训练可加速训练过程。
内存瓶颈:单卡显存不足以容纳大模型参数、梯度及优化器状态。

1.2 分布式训练的核心技术

数据并行(Data Parallelism)

原理:将数据划分为多个批次,分发到不同设备,每个设备拥有完整的模型副本。

同步方式:通过All-Reduce操作同步梯度(如PyTorch的Distributed DataParallel)。

挑战:通信开销大,显存占用高(需存储完整模型参数和优化器状态)。

模型并行(Model Parallelism)

原理:将模型切分到不同设备(如按层或张量分片)。

类型:

横向并行(层拆分):将模型的层分配到不同设备。

纵向并行(张量拆分):如Megatron-LM将矩阵乘法分片。

挑战:设备间通信频繁,负载均衡需精细设计。

流水线并行(Pipeline Parallelism)

原理:将模型按层划分为多个阶段(stage),数据分块后按流水线执行。

优化:微批次(Micro-batching)减少流水线气泡(Bubble)。

挑战:需平衡阶段划分,避免资源闲置。

混合并行(3D 并行)

组合策略:结合数据并行、模型并行、流水线并行,典型应用如训练千亿级模型。

案例:微软Turing-NLG、Meta的LLaMA-2。

DeepSpeed框架介绍

2.1 DeepSpeed概述

定位:微软开源的分布式训练优化框架,支持千亿参数模型训练。
核心目标:降低大模型训练成本,提升显存和计算效率。
集成生态:与PyTorch无缝兼容,支持Hugging Face
Transformers库。

2.2 核心技术

ZeRO(Zero Redundancy Optimizer)
原理:通过分片优化器状态、梯度、参数,消除数据并行中的显存冗余。
阶段划分:
ZeRO-1:优化器状态分片。
ZeRO-2:梯度分片 + 优化器状态分片。
ZeRO-3:参数分片 + 梯度分片 + 优化器状态分片。
优势:显存占用随设备数线性下降,支持训练更大模型。

显存优化技术

梯度检查点(Activation Check pointing):用时间换空间,减少激活值显存占用。

CPU Offloading:将优化器状态和梯度卸载到CPU内存。

混合精度训练:FP16/BP16与动态损失缩放(Loss Scaling)。

其他特性

大规模推理支持:模型并行推理(如ZeRO-Inference)。

自适应通信优化:自动选择最佳通信策略(如All-Reduce vs. All-Gather)。

2.3 优势与特点

显存效率高:ZeRO-3可将显存占用降低至1/设备数。

易用性强:通过少量代码修改即可应用(如DeepSpeed配置JSON文件)。

扩展性优秀:支持千卡级集群训练。

开源社区支持:持续更新,与Hugging Face等生态深度集成。

2.4 使用场景

训练百亿/千亿参数模型(如GPT-3、Turing-NLG)。

资源受限环境:单机多卡训练时通过Offloading扩展模型规模。

快速实验:通过ZeRO-2加速中等规模模型训练。

需掌握:

1. 掌握多卡训练的基本概念
2. 掌握LLamaFactory与Xtuner多卡微调大模型

xtuner微调大模型教程

1.构建虚拟环境

conda create --name xtuner-env python=3 .10 -y
conda activate xtuner-env

拉取XTuner,过程大约需要几分钟

git clone https://github.com/InternLM/xtuner.git

然后安装依赖的软件,这步需要的时间比较长。

cd xtuner 
pip install -e '.[all]'

等以上所有步骤完成后,再进行下面的操作。

2.下载模型

from modelscope import snapshot_download
model_dir = snapshot_download('Shanghai_AI_Laboratory/internlm2-chat-
1_8b ',cache_dir='/root/llm/internlm2-1 .8b-chat ')

3.微调

创建微调训练相关的配置文件在左侧的文件列表,xtuner 的文件夹里,打开 xtuner/xtuner/configs/internlm/internlm2_chat_1_8b/internlm2_chat_1_8b_qlora_alpaca_e3.py复制一份至根目录。

打开这个文件,然后修改预训练模型地址,数据文件地址等。

PART 1 中

#预训练模型存放的位置
pretrained_model_name_or_path = '/root/llm/internlm2-1.8b-chat' #基座模型路径
#微调数据存放的位置
data_files = '/root/public/data/target_data.json'

# 训练中最大的文本长度
max_length = 512

# 每一批训练样本的大小
batch_size = 2
#最大训练轮数
max_epochs = 3

#验证数据
evaluation_inputs = [
    '只剩一个心脏了还能活吗?', '爸爸再婚,我是不是就有了个新娘?',
    '樟脑丸是我吃过最难吃的硬糖有奇怪的味道怎么还有人买','马上要上游泳课了,昨天洗的泳裤还没干,怎么办',
    '我只出生了一次,为什么每年都要庆生'
]

PART 3 中

dataset=dict(type=load_dataset, path="json",data_files=data_files)
dataset_map_fn=None

4.微调训练

在当前目录下,输入以下命令启动微调脚本

#单卡微调
xtuner train internlm2_chat_1_8b_qlora_alpaca_e3.py
#多卡微调
NPROC_PER_NODE=2 xtuner train /home/cw/utils/xtuner -
main/qwen1_5_1_8b_chat_qlora_alpaca_e3.py --deepspeed deepspeed_zero2
#多卡指定显卡微调
CUDA_VISIBLE_DEVICES=0 ,2 NPROC_PER_NODE=2 xtuner train /home/cw/utils/xtuner
main/qwen1_5_1_8b_chat_qlora_alpaca_e3.py --deepspeed deepspeed_zero2

5.模型转换

模型训练后会自动保存成PTH 模型(例如iter_2000 .pth,如果使用了DeepSpeed,则将会是一个文件夹),我们需要利用xtuner convert pth_to_hf 将其转换为HuggingFace 模型,以便于后续使用。具体命令为:

xtuner convert pth_to_hf ${FINETUNE_CFG} ${PTH_PATH} ${SAVE_PATH}
# 例如:xtuner convert pth_to_hf internlm2_chat_7b_qlora_custom_sft_e1_copy.py
./iter_2000.pth ./iter_2000_

6.模型合并

如果使用了LoRA / QLoRA 微调,则模型转换后将得到adapter 参数,而并不包含原LLM 参数。如果您期望获得合并后的模型权重(例如用于后续评测),那么可以利用xtuner convert merge

$ xtuner convert merge ${LLM} ${LLM_ADAPTER} ${SAVE_PATH}

附:xtuner中文文档https://xtuner.readthedocs.io/zh-cn/latest/index.html

Logo

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

更多推荐