大模型分布式训练框架——DeepSpeed

本文的主要内容是阐述DeepSpeed训练模块在跟进大模型技术中的作用,重点解析了RLHF在其中的应用。文中深入探讨了模型训练的关键概念,如显存需求、优化器迭代和混合精度训练。针对大规模模型训练,介绍了模型并行和流水线并行等分布式训练方法,并讨论了如何在资源有限的情况下使用16位精度进行训练。最后,本文还强调了DeepSpeed在分布式训练配置中的重要性,展示了如何通过配置文件轻松注入训练参数。

大模型分布式训练框架 DeepSpeed

相比微调,预训练LLaMA2-7B模型需要多少显存?
假设以bf16混合精度预训练 LLaMA2-7B模型,需要近120GB显存。即使A100/H100(80GB)单卡也无法支持,为何比 QLoRA多了100GB?不妨展开计算下显存占用。
训练步骤

  • 模型参数:70亿 x 2 Bytes ≈ 14GB;
  • 更新梯度:70亿 x 2 Bytes ≈ 14GB;
  • 优化器(e.g.AdamW),训练过程默认使用fp32精度:
    • 模型参数拷贝:7B x 4Bytes ≈ 28GB
    • 2倍梯度数量的动量:2x7B x 4Bytes≈ 56GB
  • 显存占用总计:14 x 2 + 28 x 3 = 112 GB
  • 可简记为:7 x (2+2+12) = 112

再考虑缓存等,向上估算为120GB。

不同优化器的显存占用对比
典型优化器与模型权重数量比值:

  • SGD: 1;
  • RMSProp:2;
  • Adam:3;

典型优化器(32-bit)与模型权重(16-bit)显存占用比值:

  • SGD: 2;
  • RMSProp:4;
  • Adam:6;

12
使用DeepSpeed配置文件可以简化模型的训练过程。通过调整参数配置,如梯度积累步骤数,可以控制训练的细节。实践中需要根据硬件资源和训练需求灵活调整参数配置。

使用混合精度训练模型单步流程图

使用混合精度训练模型单步流程图
Master-Weight——>Weight Update——>Updated Master-Weight就是模型权重更新流程。Master-Weight通常用于描述在深度学习模型训练完成后,计算得到的一个全局的权重梯度(Weight Gradients)。这个概念涉及到的是将每个训练步骤(batch或epoch)结束后计算出的局部权重更新(通常是通过反向传播算法得出的梯度)进行整合或加权平均的过程。通过这种方法(称为权重更新),模型可以在不同的训练阶段应用不同程度的更新,最终目标是生成一个综合了所有信息的、更新后的整体权重表示。区别于全精度训练,混合精度是在训练过程中损失一部分精度,使得降低训练成本,获取有效精度。F16就是16位的模型权重,Weight即为权重,FWD表示前馈网络,也就是所谓的额推理阶段;BWD-Actv就是backward-activation,这个阶段就是将初始的Activation Gradients进行更新,获得新的Activation Gradients;BWD-Weight即为backward-weight,将更新汇总后的activation和Activation Gradients;BWD-Weight即为backward-weight。最后汇总最新的activation和Activation Gradients,并按照16位精度重新训练模型获得Weight Update更新的权重。

Zero Redundancy Optimizer (ZeRO 优化器) 技术创新 (2020年 GPT3发布前)

显存优化是大模型训练中的重要问题,DeepSpeed通过Zero技术系列实现系统性地解决显存瓶颈,实现了以有限的资源训练大模型。Zero技术通过梯度分散和模型参数分散,减少单卡显存需求,实现大模型在有限资源上的训练。Zero技术的不同阶段(Zero One、Zero Two、Zero Three)逐步提升显存优化效果和训练效率。

大模型训练困难

• 巨大的深度学习模型虽然能带来显著的准确度提升,但训练拥有数十亿到数万亿参数的模型非常具有挑战性。
• 现有数据并行和模型并行这两种常见解决方案在将大型模型适配到有限的设备内存中时存在根本性的限制,同时还需在计算、通信和开发效率之间取得平衡。

ZeRO的创新

• 内存优化:ZeRO通过优化内存使用,大幅提高了训练速度,同时增加了可以有效训练的模型大小。
• 消除冗余:ZeRO在数据和模型并行训练中消除了内存冗余,同时保持了低通信量和高计算粒度。
• 模型规模扩展:ZeRO允许模型大小与设备数量成比例扩展,同时保持高效率。

出色的实验结果

• 大规模的模型训练:ZeRO实现了在400个GPU上对超过1000亿参数的大模型进行超线性加速训练,实现了15 Petaflops的吞吐量。
• 性能提升:与当时最先进技术相比,模型大小增加了8倍,可实现性能增加10倍。
• 易用性:ZeRO能够训练高达130亿参数的大型模型(例如,比Megatron GPT的83亿和T5的110亿都大),而无需依赖更难以应用的模型并行技术。
• 研究成果:研究人员利用ZeRO的系统突破创造了世界上最大的语言模型(170亿参数),并达到了破纪录的准确率。

ZeRO-DP(Data Parallelism)优化技术

ZeRO-DP 是一种分布式数据并行训练方法,通过减少冗余数据来降低每个设备的显存占用,从而允许训练更大的模型。ZeRO-DP 三个优化阶段(以 Adam优化器,64张GPU为例计算):

  • ZeRO Stage 1 (Pos):4倍显存压缩,将优化器参数(如动量和学习率等)分布到多张卡。通信量与数据并行相同。
  • ZeRO Stage 2 (Pos+g):8倍显存压缩, 进一步将梯度分布到多张卡 。通信量仍不变。
  • ZeRO Stage 3 (Pos+g+p):进一步将模型参数分布到多张卡,显存减少与GPU卡的数量(Nd)成线性关系。如,在64个GPU上分割(Nd=64)将实现64倍的显存压缩。通信量会适度增加50%。

ZeRO-DP 技术

ZeRO 在千亿模型上的近线性加速实验结果

ZeRO 在千亿模型上的近线性加速实验结果
Zero技术通过减少冗余数据传输和存储,降低大模型训练的显存和计算需求。Zero技术包括多个版本,如Zero One、Zero Two和Zero Three,逐步优化训练效率和显存使用。Zero技术通过分布式训练优化,实现线性加速比,提升训练速度。

ZeRO-DP 三阶段优化技术对比:从75亿到1万亿的单卡显存消耗

ZeRO-DP 三阶段优化技术对比

ZeRO-R(Residual)组件:进一步优化显存开销

ZeRO优化器的ZeRO-R 组件针对以下三个关键方面进行了优化,进一步降低了显存占用并提高训练大型模型的效率。
分区激活检查点 (Pa)
原理: 模型并行(MP)设计本质上需要复制激活,导致跨模型并行GPU的激活冗余复制。ZeRO通过分区激活并在计算中需要使用激活的前一刻才将其以复制形式具体化,从而消除了这种冗余。
过程: 一旦计算了模型的一层的前向传播,输入激活就会在所有模型并行进程中分区,直到在反向传播期间再次需要。此时,ZeRO使用all-gather操作重新生成激活的复制副本。
内存节省: 配合激活检查点,只存储分区的激活检查点而非复制副本,可以显著减少激活占用的内存量。对于极大的模型和非常有限的设备内存,这些分区的激活检查点甚至可以卸载到CPU内存,将激活内存开销减少到几乎为零,但需要额外的通信成本。
恒定大小缓冲区 (CB)
策略: ZeRO精心选择临时数据缓冲区的大小,以平衡内存和计算效率。为了提高效率,高性能库(如NVIDIA Apex或Megatron)在应用这些操作前将所有参数融合到单个缓冲区中。但是,融合缓冲区的内存开销与模型大小成正比,对于大型模型可能成为障碍。ZeRO通过使用性能高效的恒定大小融合缓冲区解决了这个问题,使缓冲区大小不依赖于模型大小。
内存碎片整理 (MD)
问题: 由于激活检查点和梯度计算,模型训练中出现内存碎片化。在前向传播中,仅存储选定的激活以供反向传播使用,而大多数激活被丢弃,因为它们可以在反向传播期间重新计算,导致短期和长期内存交错,从而引起内存碎片化。内存碎片化在内存充足时通常不是问题,但对于在有限内存下运行的大型模型训练,会导致内存碎片化问题,如OOM(内存不足)和由于内存分配器花费大量时间寻找连续内存片段而导致的效率低下。
优化: ZeRO通过为激活检查点和梯度预分配连续内存块,并在生成时将它们复制到预分配的内存中,实时进行内存碎片整理。MD不仅使ZeRO能够以更大的批量大小训练更大的模型,而且还提高了在有限内存下训练的效率。

ZeRO 压测实验结果

实验结果
ZeRO 压测实验对应配置
ZeRO 压测实验对应配置

Microsoft DeepSpeed 完整实现了 ZeRO 优化器

Microsoft DeepSpeed 框架简介deepspeed

DeepSpeed 是一个开源深度学习优化库,旨在提高大模型训练和运行效率,以支持数千亿~万亿参数的超大语言模型。为了提高大模型训练的效率和扩展性, DeepSpeed 不仅实现了ZeRO 论文中的核心技术,还组合了以下多个模块:

  1. ZeRO(Zero Redundancy Optimizer): ZeRO 是 DeepSpeed 的一个关键组成部分,它通过优化数据并行训练中的显存使用,显著减少了所需的GPU显存。ZeRO 分为几个不同的级别(ZeRO-DP, ZeRO-Offload, ZeRO-Infinity),每个级别都提供了不同程度的优化和显存节省,允许训练更大的模型或在有限的硬件资源上训练模型。
  2. 模型并行(Model Parallelism): DeepSpeed 实现了模型并行技术,如:Tensor切片,以支持大型模型的分布式训练。这些技术允许模型的不同部分在不同的计算设备上并行运行,从而处理那些单个设备无法容纳的大型模型。
  3. 流水线并行(Pipeline Parallelism): 通过将模型训练分解为多个阶段,并在不同的设备上并行处理这些阶段,流水线并行技术可以进一步提高训练效率。这种方法特别适合于顺序依赖较弱的训练任务,如某些类型的深度学习模型。
  4. 稀疏注意力(Sparse Attention): DeepSpeed 支持稀疏注意力机制,这有助于降低训练大型模型(尤其是那些基于Transformer的模型)时的计算和内存需求。稀疏性技术可以减少不必要的计算,使模型更加高效。
  5. 显存和带宽优化: DeepSpeed 采用了多种技术来优化显存使用和增加带宽效率,如异步I/O、内存池化和压缩通信等。这些优化有助于提高数据加载和模型训练过程中的效率。

微软的DeepSpeed是一个大模型分布式训练框架,结合了多种技术以提升训练效率。DeepSpeed的设计目标包括提升大模型训练效率,支持数千亿甚至数万亿参数模型,实现了Zero论文中的核心技术,并扩展了显存优化和通信效率提升功能。

ZeRO-Offload 技术使能CPU参与大模型训练

ZeRO-Offload是ZeRO技术的一个扩展,它将部分数据和计算从GPU(或其他主要训练设备)卸载到CPU,从而减轻了GPU的显存负担,并使得在有限GPU资源下训练更大的模型成为可能。核心策略如下:

  • 模型卸载: ZeRO-Offload可以将模型的一部分状态(如优化器状态、梯度或参数)从GPU卸载到CPU内存中,从而减少GPU上的内存需求。
  • 计算卸载: 除了模型卸载之外,ZeRO-Offload还可以将一部分计算任务(如参数更新)卸载到CPU,减轻GPU的计算负担,使得GPU可以专注于更加密集的前向和反向传播计算。同时尽量减少数据在GPU和CPU之间的移动,以及减少CPU上的计算时间,从而在GPU上节省显存。
  • 效率和规模: 在单个NVIDIA V100 GPU上可以实现40 TFlops的性能,训练超过100亿参数的模型,相比于PyTorch等流行框架在单GPU上能训练的最大模型规模提高了10倍。
  • 灵活性和可扩展性: 设计用于在多GPU上扩展,提供接近线性的加速比,最多支持128个GPU。

结合前篇所介绍的Zero流程,通过ZeRO-Offload技术可以将前馈网络和后播网络这种计算量大的过程采用GPU计算,而参数的更新就可以采用CPU计算,这样GPU显存与CPU内存的平衡使用。

ZeRO-Offload 模型训练数据流图:降低 GPU 和 CPU 交互开销

模型训练流程图
DeepSpeed架构支持大数据量和高参数规模模型的训练。零冗余优化技术通过减少通信冗余和数据传输量,提高训练效率和速度。DeepSpeed结合了多种优化技术,如梯度分散、模型参数分散和计算卸载,以降低训练成本。在分布式训练中,不同节点间的数据交换和模型参数同步是关键挑战。DeepSpeed通过将模型参数和计算任务分散到多个GPU和CPU上,减少了通信量和计算负担,但这种分布式训练策略需要精细的管理和优化,以确保各节点间的高效协同工作。

ZeRO-Offload 模型训练流程(单张GPU)

ZeRO-Offload 模型训练流程(单张GPU)

ZeRO-Offload 模型训练流程(多张GPUs)

ZeRO-Offload 模型训练流程(多张GPUs)

ZeRO-Offload 模型训练流程(延迟更新)

ZeRO-Offload 模型训练流程(延迟更新)

ZeRO-Infinity 异构创新支持百万亿模型训练

ZeRO-Infinity也是ZeRO技术的扩展,旨在设计面向百万亿大模型的训练框架。它的主要创新如下:
全面优化: ZeRO-Infinity结合了数据并行、模型并行、流水线并行和ZeRO-Offload的优点,提供了一套全面的显存和计算优化方案 。
高效利用各种存储层 : 通过智能地使用GPU显存、CPU内存和NVMe SSD存储, 最大化了训练设备的存储和计算能力。
超大模型规模: 可以在当前一代GPU集群上训练高达数十甚至数百万亿参数的模型。在单个NVIDIA DGX-2节点上微调万亿参数模型,降低了超大模型训练和微调的资源需求。
优秀的吞吐量和可扩展想: 在512个NVIDIA V100 GPU上保持超过25 petaflops的性能(达到峰值的40%),在不受CPU或NVMe带宽限制的情况下,展示了超线性的可扩展性。
开源友好: Microsoft 在 DeepSpeed 框架中开源实现了ZeRO-Infinity 技术。

随着大型模型规模的快速增长和GPU内存增长的限制,传统的训练方法面临瓶颈。ZeRO-Infinity 面向未来提出了一套
创新的训练方法,推动了大模型和复杂任务的研究。
ZeRO-Infinity 异构创新支持百万亿模型训练
ZeRO-Infinity
ZeRO-Infinity 异构训练框架
ZeRO-Infinity异构训练框架

分布式模型训练并行化技术对比

大模型分布式训练:数据并行 & 模型并行
数据并行:
数据并行
模型并行:
模型并行

大模型分布式训练:模型并行 与 流水线并行

流水线并行则是将模型训练的过程(特别是前向和后向传播)分割成多个阶段,并在不同的设备上并行执行这些阶段。流水线并行的关键优势在于它可以减少设备间的空闲时间,因为不同的设备可以同时处理模型的不同部分。
在实践中,这两种技术经常结合使用,以实现在有限硬件资源下训练大规模深度学习模型的目标。例如,一个大型模型可以首先使用模型并行技术在多个设备上分割,然后在这些设备上进一步应用流水线并行技术来优化训练过程的效率。
大模型分布式训练
b:纯模型并行
c: 流水线+模型并行
模型并行关注资源划分以及模块划分重点,流水线并行关注执行的计算效率。

DeepSpeed 与 Transformers 集成

  1. Transformers 的 Trainer 支持直接使用参数 model_wrapped 和 place_model_on_device 来启动 DeepSpeed 加速训练
    方式1
  2. Transformers 也支持通过 HfDeepSpeedConfig 方式,以独立配置文件注入训练配置参数。
    方式2

安装 DeepSpeed

step1 : 查看 GPU 架构和兼容性(NVIDIA T4 Major 7 Minor 5)
需源代码安装 DeepSpeed
由于从不同的镜像源中pip install,其实现过程需要经过下载、编译、解析等,且GPU不像CPU存在兼容性,导致编译时会使编译环境不兼容。通过源代码安装,编译时会自动匹配当前配置环境。
1
step2 :源代码安装 DeepSpeed
主要参数设置
• 根据你的 GPU 实际情况,设置参数 TORCH_CUDA_ARCH_LIST;
• 如果你需要使用 NVMe Offload,设置参数 DS_BUILD_UTILS=1;
• 如果你需要使用 CPU Offload 优化器参数,设置参数 DS_BUILD_CPU_ADAM=1;
2
安装完成:
安装完成
step3 :编译 DeepSpeed 源代码

  • 编译失败报错

编译错误
解决方案:升级 GCC 和 G++ 版本,支持 C++17 以上编译器

  • 检查 GCC/G++ 版本是否满足最低要求
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install gcc-7 g++-7

检查
如果需要,更新 GCC/G++ 版本(>=7)

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install gcc-7 g++-7

检查2
step4:DeepSpeed ZeRO-Offload 模式单 GPU 训练翻译模型(T5) - DeepSpeed启动

  • DeepSpeed启动报错
  • Python脚本启动报错

Python脚本启动报错
解决方案:需要重新使用源代码安装 Transformers
step5:训练开始(Zero-2)

DeepSpeed ZeRO 配置详解

T5(Text-to-Text Transfer Transformer)模型架构 (2019)

Google Research 团队提出的T5采用了一种创新的文本到文本的框架,将所有的 NLP 任务(传统的翻译、摘要、分类、问答和文本补全等)视为文本生成问题。
T5 通过预训练和微调的方式来适应特定的任务,其中预训练阶段包括了大量的无监督学习,使用了一个称为“掩码语言模型”的任务来预测文本中被随机遮盖的部分。
T5
T5 模型家族在翻译任务上的对比
T5 模型众多变体在各个任务上的性能。Small、Base、Large、3B 和 11B 表示模型参数量分别为 6000万、2.2 亿、7.7 亿、30 亿和 110 亿。每个表的第一行列出了该任务之前的 SOTA 得分。
对比

使用 DeepSpeed 以 ZeRO-2 配置训练 T5-Large(7.7亿参数)

deepspeed --num_gpus=1 translation/run_translation.py
–deepspeed config/ds_config_zero2.json --model_name_or_path t5-large --do_train --do_eval
–per_device_train_batch_size 4 --per_device_eval_batch_size 4
–output_dir output_dir --overwrite_output_dir --max_train_samples 500 --num_train_epochs 1
–dataset_name wmt16 --dataset_config “ro-en” --source_lang en --target_lang ro

{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "bf16": {
        "enabled": "auto"
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },

    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "allgather_partitions": true,
        "allgather_bucket_size": 2e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 2e8,
        "contiguous_gradients": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 20,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}

ZeRO-3 配置

{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "bf16": {
        "enabled": "auto"
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },

    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "offload_param": {
            "device": "cpu",
            "pin_memory": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": "auto",
        "stage3_prefetch_bucket_size": "auto",
        "stage3_param_persistence_threshold": "auto",
        "stage3_max_live_parameters": 1e9,
        "stage3_max_reuse_distance": 1e9,
        "stage3_gather_16bit_weights_on_model_save": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 20,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}

使用 DeepSpeed 以 ZeRO-3 配置训练 T5-Large(7.7亿参数)

计算任务总量不变,显存需求降低,训练速度变慢,CPU Offload 多核并行训练,占用了26GB左右内存:
运行
训练结束后,主进程(GPU)正常退出,子进程(CPU)手动终止(kill -9

ZeRO-2 vs ZeRO-3 配置

ZeRO-2 vs ZeRO-3

使用 DeepSpeed 单机多卡、分布式训练

DeepSpeed 启动命令:单机多卡

多卡启动无需额外安装 DeepSpeed,在启动命令中将 num_gpus 参数设置为显卡数量:

deepspeed --num_gpus=2 your_program.py <normal cl args> --deepspeed ds_config.json

以在单机4卡训练 T5-3B 模型为例,DeepSpeed 启动命令(参考)如下:

deepspeed --num_gpus=4 translation/run_translation.py \
--deepspeed config/ds_config_zero2.json --model_name_or_path t5-3b \
--do_train --per_device_train_batch_size 4 \
--do_eval --per_device_eval_batch_size 4 \
--output_dir output_dir --overwrite_output_dir \
--max_train_samples 500 --num_train_epochs 1 \
--dataset_name wmt16 --dataset_config “ro-en” \
--source_lang en --target_lang ro \
--fp16

单机单卡训练脚本

# DeepSpeed ZeRO-2 模式单 GPU 训练翻译模型(T5-Small)
deepspeed --num_gpus=1 translation/run_translation.py \
--deepspeed config/ds_config_zero2.json \
--model_name_or_path t5-small --per_device_train_batch_size 1 \
--output_dir output_dir --overwrite_output_dir --fp16 \
--do_train --max_train_samples 500 --num_train_epochs 1 \
--dataset_name wmt16 --dataset_config "ro-en" \
--source_lang en --target_lang ro

# DeepSpeed ZeRO-2 模式单 GPU 训练翻译模型(T5-Large)
deepspeed --num_gpus=1 translation/run_translation.py \
--deepspeed config/ds_config_zero2.json \
--model_name_or_path t5-large \
--per_device_train_batch_size 4 \
--per_device_eval_batch_size 4 \
--output_dir output_dir --overwrite_output_dir \
--do_train \
--do_eval \
--max_train_samples 500 --num_train_epochs 1 \
--dataset_name wmt16 --dataset_config "ro-en" \
--source_lang en --target_lang ro



# DeepSpeed ZeRO-3 模式单 GPU 训练翻译模型(T5-Large)
deepspeed --num_gpus=1 translation/run_translation.py \
--deepspeed config/ds_config_zero3.json \
--model_name_or_path t5-3b --per_device_train_batch_size 1 \
--output_dir output_dir --overwrite_output_dir --fp16 \
--do_train --max_train_samples 500 --num_train_epochs 1 \
--dataset_name wmt16 --dataset_config "ro-en" \
--source_lang en --target_lang ro



# 直接使用 Python 命令启动 ZeRO-2 模式单 GPU 训练翻译模型(T5-Small)
python translation/run_translation.py \
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --source_lang en \
    --target_lang ro \
    --source_prefix "translate English to Romanian: " \
    --dataset_name wmt16 \
    --dataset_config_name ro-en \
    --output_dir tmp/tst-translation \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate

DeepSpeed 启动命令:分布式训练

分布式训练需要在所有节点都源代码安装 DeepSpeed,通过编译出来的 whl 包安装。新建 hostfile 文件,将所有节点的 SSH 别名(类似 VSCode 访问远程服务器)和GPU数量配置如下:

hostname1 slots=8
hostname2 slots=8

使用 DeepSpeed 启动分布式训练:

deepspeed --num_gpus 8 --num_nodes 2 --hostfile hostfile --master_addr hostname1 --master_port=9901 \
your_program.py <normal cl args> --deepspeed ds_config.json

DeepSpeed 启动命令:分布式训练(基于 SLURM)
SLURM(Simple Linux Utility for Resource Management)是一个开源、高度可配置的集群管理和作业调度系统,广泛应用于高性能计算(HPC)环境中进行资源分配、作业调度和监控。
使用 SLURM 启动分布式训练:sbatch launch.slurm

分布式训练脚本

################# 在编译和源代码安装 DeepSpeed 的机器运行 ######################3
# 更新 GCC 和 G++ 版本(如需)
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install gcc-7 g++-7
# 更新系统的默认 gcc 和 g++ 指向
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-7
sudo update-alternatives --config gcc

# 源代码安装 DeepSpeed
# 根据你的 GPU 实际情况(查看方法见前一页),设置参数 TORCH_CUDA_ARCH_LIST;
# 如果你需要使用 NVMe Offload,设置参数  DS_BUILD_UTILS=1;
# 如果你需要使用 CPU Offload 优化器参数,设置参数 DS_BUILD_CPU_ADAM=1;
git clone https://github.com/microsoft/DeepSpeed/
cd DeepSpeed
rm -rf build
TORCH_CUDA_ARCH_LIST="7.5" DS_BUILD_CPU_ADAM=1 DS_BUILD_UTILS=1 
python setup.py build_ext -j8 bdist_wheel
# 运行将生成类似于dist/deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whl的文件,
# 在其他节点安装:pip install deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whl。

# 源代码安装 Transformers
# https://huggingface.co/docs/transformers/installation#install-from-source
pip install git+https://github.com/huggingface/transformers


################# launch.slurm 脚本(按照实际情况修改模板值) ######################
#SBATCH --job-name=test-nodes        # name
#SBATCH --nodes=2                    # nodes
#SBATCH --ntasks-per-node=1          # crucial - only 1 task per dist per node!
#SBATCH --cpus-per-task=10           # number of cores per tasks
#SBATCH --gres=gpu:8                 # number of gpus
#SBATCH --time 20:00:00              # maximum execution time (HH:MM:SS)
#SBATCH --output=%x-%j.out           # output file name

export GPUS_PER_NODE=8
export MASTER_ADDR=$(scontrol show hostnames $SLURM_JOB_NODELIST | head -n 1)
export MASTER_PORT=9901

srun --jobid $SLURM_JOBID bash -c 'python -m torch.distributed.run \
 --nproc_per_node $GPUS_PER_NODE --nnodes $SLURM_NNODES --node_rank $SLURM_PROCID \
 --master_addr $MASTER_ADDR --master_port $MASTER_PORT \
your_program.py <normal cl args> --deepspeed ds_config.json'

DeepSpeed 创新模块 Inference、Compression & Science

DeepSpeed 四大核心模块
• Training 模块不仅实现了 ZeRO 系列优化技术,还支持了 MoE 模型和RLHF等前沿训练方法。
• Inference 模块提供了整套高效运行超大模型的解决方案:
- 并行技术:Tensor、Pipeline、Expert、ZeRO-Parallelism。
- 低时延高吞吐技术:通信优化、自定义推理内核、异构存储优化。

• Compression 模块进一步提升了模型推理效率,降低了部署成本。社区紧跟最新的模型压缩技术并开源实现了 ZeroQuant and XTC 等算法。
• DeepSpeed4Science 模块是响应微软人类科学挑战使命的新模块,旨在通过AI系统技术创新构建独特能力,帮助领域专家揭开当今最大的科学之谜。
四大模块

### Deepspeed 服务器部署教程和配置指南 #### 安装依赖项 为了成功安装 DeepSpeed 及其相关组件,在目标服务器上需先准备必要的环境。通常情况下,这涉及到 Python 和 PyTorch 的安装。 对于 Python 版本的选择,建议使用 Python 3.8 或更高版本[^1]。至于 PyTorch,则应选择与 CUDA 版本相匹配的稳定版次。可以通过官方渠道获取最新版本: ```bash pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113 ``` #### 获取并编译 DeepSpeed 库 接下来是从 GitHub 上克隆 DeepSpeed 仓库,并按照说明文档完成本地构建过程。此操作会自动处理大部分依赖关系,但仍可能需要手动调整某些设置来适应特定硬件条件。 ```bash git clone https://github.com/microsoft/DeepSpeed.git cd DeepSpeed pip install -e . ``` 上述命令中的 `-e` 参数允许开发者在不重新打包的情况下修改源码后立即生效,非常适合开发调试阶段使用。 #### 设置远程访问权限 当多台机器参与训练任务时,确保各节点间能够无障碍通信至关重要。通过 SSH 密钥认证机制可以简化跨机交互流程,减少人工干预次数。具体做法是在主控端执行 `ssh-copy-id` 命令向其他成员分发公钥副本,从而建立信任连接[^2]。 ```bash ssh-copy-id user@target_node_ip_address ``` 这里需要注意替换实际用户名 (`user`) 和目标节点 IP 地址 (`target_node_ip_address`) 来适配具体情况。 #### 启动服务实例 最后一步就是启动基于 DeepSpeed 实现的服务实例了。根据应用场景的不同可以选择不同的入口点,比如利用 FastGen 进行推理加速或是调用 MII 接口支持大规模微调作业等。这些功能模块都集成到了统一框架之下,使得用户可以根据需求灵活选用相应特性。 ```python from deepspeed import init_inference, inference_context model = ... # 加载预训练模型或其他形式初始化 engine = init_inference(model=model) with inference_context(engine): output = engine.generate(input_ids=...) ``` 这段代码展示了如何快速创建一个用于推断模式下的引擎对象,并将其应用于具体的输入数据之上得到预测结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whitney_mao

您的认可和鼓励是持续分享的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值