问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

揭秘分布式训练与微调技巧:语言大模型的高效训练与优化指南

创作时间:
作者:
@小白创作中心

揭秘分布式训练与微调技巧:语言大模型的高效训练与优化指南

引用
CSDN
1.
https://m.blog.csdn.net/2401_85325726/article/details/141825294

语言大模型(LLM)的分布式训练与微调是当前AI领域的热门话题。本文从分布式训练策略的具体细节出发,深入探讨了DeepSpeed和FSDP的实现原理,并总结了多种高效微调方法。同时,文章还提供了实用的实践指南和开源代码库的使用建议,为读者提供了全面的技术参考。

分布式训练

分布式训练涵盖的范围非常广泛,本文主要关注在训练/微调LLM时,面对超10亿参数的庞大模型和大规模数据集时的解决方案。为了最大化吞吐量,我们需要智能的分布式训练策略,以确保每个GPU worker只需处理部分训练状态和数据。

主要的并行策略包括:

  1. 数据并行(Data Parallelism, DP):每个GPU worker获取整个小批量数据的一部分,并在该部分数据上计算梯度。然后在所有worker上对梯度进行平均,以更新模型权重。

  2. 模型并行/垂直模型并行(MP):模型被分割成多个部分,每个部分被放置在不同的GPU上。朴素模型并行中,所有GPU在处理相同的数据批次时都需要等待前一个GPU完成计算,然后才能处理数据。

  3. 张量并行(TP):每个GPU通过在GPU worker之间对模型进行水平切片,仅处理张量的一部分。每个worker处理相同的数据批次,计算他们所拥有权重部分的激活值,并交换彼此需要的部分。

ZeRO驱动的数据并行

ZeRO是一种数据并行处理形式,它极大提高了内存效率。DeepSpeed团队提出了一些后续优化措施,如ZeRO-Offload/Infinity和ZeRO++,进一步提升了ZeRO的吸引力。

ZeRO-DP的可视化图表

ZeRO-Infinity的可视化图表

全分片数据并行(FSDP)

FSDP有两种分片策略:全分片(Full Sharding)和混合分片(Hybrid Sharding)。混合分片包括分片和复制,这意味着,对于给定数量的worker/GPU_W_,分片仅在大小为F 的子集之间发生,并在不同子集之间复制。

高效微调

高效微调是另一个热门话题。以下是几种最受欢迎的优化方法:

  1. 混合精度:对于大模型训练而言,这是一个不言而喻的选择。BF16(由Google Brain开发的“Brain Float 16”)和FP16是两种常用的半精度格式。

  2. 参数高效微调(PEFT):PEFT旨在通过冻结大部分模型权重,将其中的子集/少量额外参数设置为可训练,从而在微调过程中降低内存需求。LoRA是最流行的PEFT,其中对模型参数进行了低秩版本的权重更新微调。

  3. Flash Attention:Flash Attention是一种快速、内存高效、精确、IO感知的注意力算法。使用 Flash Attention 2,你可以在A100 80GB上获得220 TFLOPS以上的性能。

  4. 梯度/激活检查点:梯度/激活检查点是一种通过仅保留部分中间激活,并根据需要重新计算其余部分来减少内存消耗的技术。

  5. 量化:量化是黑客的最爱,主要有两种量化方法:后训练量化(PTQ)和量化感知训练。

  6. 梯度累积:梯度累积是一种提高有效批次大小的方法,尽管吞吐量会有所下降。

实践指南

以下是尝试在1000万以上规模的数据集上对10-100B+模型参数进行实验和微调的实用指南:

  1. 默认情况下使用BF16/ FP16。
  2. 使用LoRA,并将可训练参数添加到所有线性层。
  3. 如果你的GPU支持Flash Attention,那么可以使用它。
  4. 使用梯度/激活检查点。
  5. 在你的数据加载器中使用高效的采样器,如多重包采样器。
  6. 如果你有多个GPU,首先尝试使用BF16+LoRA+梯度检查点+DeepSpeed ZeRO 3。
  7. GPU内存有限时,可使用量化。
  8. 随着GPU的增加,DS ZeRO-3成为了最佳选择。
  9. 在小规模多节点设置中,启用了层次分区的DeepSpeed ZeRO-3似乎是最佳选择。
  10. 如果在上述所有优化之后仍然批次大小不足,应该使用梯度累积。
  11. 如果你的GPU内存非常有限,可以激活CPU/磁盘卸载(通过硬盘,这必须是ZeRO-Infinity 的NVMe)。
  12. 计算有效的批次大小,并相应调整超参数。
  13. 最后,在开始训练时,使用htop监控RAM使用情况,同时使用nvidia-smi确保GPU没有被数据预处理拖慢。

开源代码库

短短几个月内,开源代码库已取得了长足进步。以下是两个最实用、最受欢迎的平台:

  1. FastChat:FastChat是一个用于微调、服务和评估LLM-based chatbots from LMSys的平台。其功能包括Serving和微调。

  2. Axolotl:Axolotl是一个用于微调语言模型的大规模开源项目,具有以下显著特点:

  • 支持Llama、MPT、Falcon等各种因果语言模型。
  • 具有多种格式,支持在多个数据集上训练。
  • 支持LoRA、QLoRA,以及多包采样器。
  • Axolotl还使用Trainer API,并具有许多用于自定义评估和记录的功能。

超大型模型训练

通过上述优化措施,目前我们可以在搭载8枚A100-80GB显卡的DGX节点上微调Falcon 180B。根据HuggingFace的指南,你可以在153分钟内,使用15000个样本,在dolly数据集上对一个包含180亿参数的模型进行3轮微调,其中有效批次大小为64,序列长度为2048个词元。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号