联合XTuner,魔搭社区全面支持数据集的长文本训练

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
简介: XTuner和魔搭社区(SWIFT)合作引入了一项长序列文本训练技术,该技术能够在多GPU环境中将长序列文本数据分割并分配给不同GPU,从而减少每个GPU上的显存占用。通过这种方式,训练超大规模模型时可以处理更长的序列,提高训练效率。魔搭社区的SWIFT框架已经集成了这一技术,支持多种大模型和数据集的训练。此外,SWIFT还提供了一个用户友好的界面,方便用户进行训练和部署,并且支持评估功能。

背景

XTuner近期开源了长序列文本训练技术,该技术可以在多张显卡并行训练的条件下,将tokens均分到不同的显卡上,达到减少训练时显存占用的效果。魔搭社区正在和XTuner在训练推理技术层面进行深入合作,目前已经将该技术引入魔搭社区训练框架SWIFT,并支持社区LLM、MLLM(多模态大模型)及各类数据集的训练支持。

技术原理

该序列并行设计思路参考了 DeepSpeed 的工作 DeepSpeed Ulysses,并加以优化,以达到直接基于 transformers 算法库的开源模型训练 1M 以上超长序列的目标。

image.png

上图展示了序列并行策略的实现方案。由于 Transformer 结构较为规整,除 attention 计算外,其他计算过程中 token 之间不会互相影响(即每个 token 的计算是独立的),这一条件为序列并行提供了有利条件。上图展示了序列并行的核心设计。设由 P 个 GPUs 共同计算一个长度为 N 的长序列,在 Attention 计算的第一阶段,长度为 N / P 的子序列会通过线性层投影为 Query、Key、Value。接下来, QKV Tensor 会在参与序列并行计算的多个 GPUs 之间通过高度优化的 all-to-all 通信算子汇聚,得到序列长度为 N ,但更少注意力头的子序列。注意力计算后,通过另一个 all-to-all 通信算子将其转换为长度为 N / P 的子序列,进行后续计算。伪代码如下所示。

# Pseudo code for an Attention Layer
# Input: hidden_states with shape (bs, seq_len, dim)
# Output: attn_out with shape (bs, seq_len, dim)
def attn_forward(hidden_states):
    q, k, v = qkv_proj(hidden_states)
    q, k, v = reshape(q, k, v)  # (bs, q_len, dim) -> (bs, q_len, nhead, hdim)
    q, k = apply_rotary_pos_emb(q, k, cos, sin)
    sp_size = get_sequence_parallel_world_size()
    # (bs, q_len, nhead, hdim) -> (bs, q_len * sp_size, nhead / sp_size, hdim)
    q, k, v = all_to_all(q, k, v, sp_size)
    attn_out = local_attn(q, k, v)
    # (bs, q_len * sp_size, nhead / sp_size, hdim) -> (bs, q_len, nhead, hdim)
    attn_out = all_to_all(attn_out)
    attn_out = reshape(attn_out)  # (bs, q_len, nhead, hdim) -> (bs, q_len, dim)
    attn_out = o_proj(attn_out)
    return attn_out

通过上述技术方案,每个GPU上只会计算Sequence中的一部分token,在多进程条件下可以显著减少显存使用。

框架介绍

SWIFT

SWIFT是魔搭社区开发的一站式大模型训练框架,其主要特点包括:

  1. 支持包含Llama3、Qwen、DeepSeek、Llava、Qwen-vl、DeepSeek-vl等一系列自然语言与多模态开源大模型
  2. 支持近百个预训练、微调、对齐数据集的直接训练使用
  3. 支持多种最新的技术,如Galore、LISA、Unsloth、LoRA、QLoRA等轻量级训练方式,以及VLLM部署方式
  4. 支持使用界面直接训练和部署,支持评测能力

SWIFT官方REPO:

https://github.com/modelscope/swift

XTuner

XTuner是一站式大模型训练框架,其主要特点包括:

  1. 支持包含Llava、Llama3、Qwen、DeepSeek、Gemma等一系列自然语言与多模态开源大模型
  2. 支持LoRA、QLoRA、DeepSpeed等一系列轻量级训练方式
  3. 支持XTuner自主开发的LMDeploy部署技术,在很多场景下可以超越VLLM的性能
  4. 支持评测能力

XTuner的官方REPO:

https://github.com/InternLM/xtuner

在魔搭中使用序列并行技术

在本次的合作中,魔搭社区引入了XTuner底层的超长序列切分训练能力到SWIFT框架中,开发者可以使用魔搭社区的训练框架添加一个参数来实现超长序列的切分训练。

安装依赖:

pip install 'swift[seq_parallel]'

魔搭为序列并行技术提供了一个新的参数:

--sequence_parallel_size n 
# n设置为显卡数量,或者可以被显卡数量整除的正整数, 举个例子,比如显卡数量是4, 则n可以是4/2/1,当n是1时序列并行不生效

下面给出了一个完整的训练命令:

nproc_per_node=2
NPROC_PER_NODE=$nproc_per_node \
MASTER_PORT=29500 \
CUDA_VISIBLE_DEVICES=0,1 \
swift sft \
    --model_type chatglm3-6b-32k \
    --model_revision master \
    --sft_type lora \
    --tuner_backend peft \
    --dtype AUTO \
    --output_dir output \
    --ddp_backend nccl \
    --dataset AI-ModelScope/LongAlpaca-12k \
    --train_dataset_sample -1 \
    --num_train_epochs 1 \
    --max_length 16000 \
    --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 1e-4 \
    --gradient_accumulation_steps 1 \
    --max_grad_norm 0.5 \
    --warmup_ratio 0.03 \
    --eval_steps 10000 \
    --save_steps 10000 \
    --save_total_limit 2 \
    --logging_steps 10 \
    --save_only_model true \
    --sequence_parallel_size 1

上面的命令中我们针对AI-ModelScope/LongAlpaca-12k数据集做了特殊处理,使其每个语料输出统一长度,这样更方便统计训练时长和显存占用。

注意,序列并行需要在多卡环境下运行。

也可以在web-ui界面中使用这项功能或者进行实验:

swift web-ui

image.png

实验

下面针对不同的情况给出了显存占用和训练速度:

硬件环境:A100*4

Model

Dataset

Hyper params

Total steps

Train speed

Gpu memory

chatglm3-6b-32k

long-alpaca-12k(8055 tokens * 12000 rows)

gpu=2 sequence_parallel_size=1

双GPU DDP基准测试

5940

0.30iter/s

(5h13min total)

27G*2

gpu=2 sequence_parallel_size=2

双GPU序列并行2

11880

0.5iter/s

(6h total)

20G*2

gpu=4

sequence_parallel_size=4

四GPU序列并行4

11880

1iter/s 

(3h20min total)

18G*4

gpu=4

sequence_parallel_size=2

四GPU序列并行2

5940

0.45iter/s

(3h total)

21G*4

理论上分析,由于序列长度折半,因此在训练时可以承载sequence_parallel_size*n尺寸的序列。我们对此进行了压力测试, 在脚本中添加如下参数:

--packing true # packing到max-length
--gpu_memory_fraction 0.3 # 限制显存在24G

之后动态调节max_length参数,可以观察到,使用DDP训练,chatglm3-6b模型可以最大支持9000的序列长度,使用sequence_parallel_size=2的双卡序列并行后,可以达到18000的序列长度,可训练序列增加到200%,这与我们的假设是相符的。

结论

通过实验结果可以看到:

  • sequence_parallel_size在>1时显存占用比DDP低, 但会牺牲一部分的训练时间(实验中可以看到,约为20%的时间增加)
  • 在sequence_parallel_size持续增加时,显存降低的的收益比会有所降低(sequence_parallel_size=4比sequence_parallel_size=2的单卡显存占用下降2G)

序列并行技术可以在长序列条件下减缓显存压力,一般在开发者有多张显卡,但显卡规格不高或序列长度过长显存吃紧时推荐使用,但需要注意序列并行的拆分数量,过多的数量的边际效益会有一定降低,建议开发者在使用时根据自己的硬件条件实际实验和调节。

对这项技术有兴趣的开发者欢迎进入我们的开发者群共同讨论,扫描下方二维码即可进入:

image.png

相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
相关文章
|
18天前
魔塔社区的模型支持使用DJL 进行推理吗?
想使用DJL 加载魔塔社区的模型并进行推理
|
5天前
|
数据采集 数据处理
Data Is All You Need! 生成式图文对数据最佳实践,数据集魔搭开源!
23年10月底,OpenAI发布了 DALL-E 3 的技术报告《 Improving Image Generation with Better Captions 》,这篇技术报告的重点放在了 DALL-E 3 通过高质量的、详细的、生成式图像 caption(文本描述)进行训练后,提升 prompt following 能力。
|
6天前
|
人工智能 安全 测试技术
微软开源4.2B参数多模态SLM模型Phi-3-vision,魔搭社区推理、微调实战教程来啦!
在 Microsoft Build 2024 上,微软持续开源了 Phi-3 系列的新模型们。包括 Phi-3-vision,这是一种将语言和视觉功能结合在一起的多模态模型。
|
18天前
|
机器学习/深度学习 人工智能 自然语言处理
预训练驱动的统一文本表示-GTE魔搭社区最佳实践
文本表示是自然语言处理(NLP)领域的核心问题, 其在很多NLP、信息检索的下游任务中发挥着非常重要的作用。
|
18天前
|
存储 自然语言处理 负载均衡
元象开源首个MoE大模型:4.2B激活参数,效果堪比13B模型,魔搭社区最佳实践来了
近日,元象发布其首个Moe大模型 XVERSE-MoE-A4.2B, 采用混合专家模型架构 (Mixture of Experts),激活参数4.2B,效果即可媲美13B模型。该模型全开源,无条件免费商用,支持中小企业、研究者和开发者可在元象高性能“全家桶”中按需选用,推动低成本部署。
|
18天前
|
数据可视化 物联网 Swift
澜舟科技开源孟子3-13B大模型,魔搭社区推理训练最佳实践!
4月1日,澜舟科技宣布开源Mengzi3-13B大模型,对学术研究完全开放,同时支持免费商用。
|
18天前
|
人工智能 知识图谱 Windows
Mistral 7B v0.2 基础模型开源,魔搭社区微调教程和评测来啦!
Mistral AI在3月24日突然发布并开源了 Mistral 7B v0.2模型,有如下几个特点
|
18天前
|
人工智能 数据可视化 物联网
Mistral AI发布首个开源MoE模型,魔搭社区推理微调最佳实践来啦!
继Mistral 7B 后,Mistral AI 近日又放出一记大招——发布了引爆开源社区的首个 MoE 开源模型 Mixtral 8x7B,在 Apache 2.0 许可证下可商用。
|
10月前
|
数据挖掘 测试技术
【论文速递】EMNLP 2022 - 一种大规模中文标题数据集的开放事件抽取基准
事件抽取(EE)对于新聚合和事件知识图构建等下游任务至关重要。大多数现有的EE数据集手动定义固定的事件类型,并为每种事件设计特定的模式
132 0
|
机器学习/深度学习 人工智能 自然语言处理