首页 > 其他分享 >DeepSpeed分布式训练

DeepSpeed分布式训练

时间:2023-12-20 13:00:26浏览次数:35  
标签:engine DeepSpeed 训练 deepspeed step None model 分布式

一、DeepSpeed 总纲

官方文档:DeepSpeed 官方英文文档

cpoy下来的原版

DeepSpeed 模型的训练是使用DeeSpeed引擎完成的

DeepSpeed引擎可以包装任何 torch.nn.module 类型的模型

二、训练

1、通过 deepspeed.initialize 初始化

# deepspeed.initialize确保分布式数据并行或混合精度训练所需的所有必要设置都在后台适当完成。
# 除了包装模型外,DeepSpeed还可以根据传递给DeepSpeed.initialize的参数
# 和DeepSpeed配置文件来构建和管理训练优化器、数据加载器和学习率调度器

# NOTE:通过 deepspeed.initialize 初始化,默认使用 nccl 后端,
#       若需要替换其他如 gloo, mpi 后端, 需要使用 deepspeed.init_distributed()进行初始化
deepspeed.initialize(args=None, 
                     model: Optional[Module] = None, 
                     optimizer: Optional[Union[Optimizer, Callable[[Union[Iterable[Parameter], Dict[str, Iterable]]], Optimizer]]] = None, 
                     model_parameters: Optional[Module] = None, 
                     training_data: Optional[Dataset] = None, 
                     lr_scheduler: Optional[Union[_LRScheduler, Callable[[Optimizer], _LRScheduler]]] = None, 
                     mpu=None, 
                     dist_init_required: Optional[bool] = None, 
                     collate_fn=None, 
                     config=None, 
                     config_params=None)
# return: engine, optimizer, training_daaloader, lr_scheduler 

model_engine, optimizer, _, _ = deepspeed.initialize(args=cmd_args,
                                                     model=net,
                                                     model_parameters=net.parameters())

2、分布式初始化

deespeed 默认使用nccl 后端, 如果已经使用了分布式环境,需将 torch.distributed.init_process_group(...)

替换为:

deepspeed.init_distributed()

若在调用 deepspeed.intialize() 函数之后,则无需调用 deepspeed.init_distributed()

因为 deepspeed.intialize() 会自动初始化分布式环境。

3、训练

DeepSpeed 的训练非常简单,具体使用三个 API 即可。

在引擎盖下,DeepSpeed通过预定义的学习率调度器,

以混合精度自动执行分布式数据并行训练所需的必要操作

for step, batch in enumerate(data_loader):
    #forward() method
    loss = model_engine(batch)

    #runs backpropagation
    model_engine.backward(loss)

    #weight update
    model_engine.step()

NOTE

需要注意一下 Learning Rate Scheduler

1)当使用 DeepSpeed 的 learning rate scheduler (在 ds_config.json 文件中) 时,当 model_engine.step() 执行时, 即在每个 training step 进行更新。

2)当使用用户自定义 learning rate scheduler 时,若需要在每个 training step 进行更新,应

在进行 deepspeed.initialize 初始化时,将 scheduler 传递给 deepspeed.initialize , 通过 Deeppeed 进行 update 或 save/restore

3)当 learning rate scheduler 需要在其他时间步进行更新, 如 training epoch, 不能传递给deepspeed.initialize ,需要手动管理

4、保存

模型保存主要通过 DeepSpeed 的 save_checkpointload_checkpoint 这两个API进行管理,需要两个额外参数:ckpt_dirckpt_id

Args:

ckpt_dir:保存目录

ckpt_id:唯一标识目录中检查点的标识符,下面例子里使用 loss 值

client_sd :用户希望保存的额外数据,字典形式保存。

#load checkpoint
_, client_sd = model_engine.load_checkpoint(args.load_dir, args.ckpt_id)
step = client_sd['step']

#advance data loader to ckpt step
dataloader_to_step(data_loader, step + 1)

for step, batch in enumerate(data_loader):

    #forward() method
    loss = model_engine(batch)

    #runs backpropagation
    model_engine.backward(loss)

    #weight update
    model_engine.step()

    #save checkpoint
    if step % args.save_interval:
        client_sd['step'] = step
        ckpt_id = loss.item()
        model_engine.save_checkpoint(args.save_dir, ckpt_id, client_sd = client_sd)

NOTE:

所有进程都必须调用此方法,而不仅仅是 rank = 0 的进程。这是因为每个进程都需要保存其weights 和 scheduler+optimizer 的状态。如果只为 rank = 0 的进程调用此方法,则此方法将挂起,等待与其他进程同步。

5、DeepSpeed Configuration

DeepSpeed 的 Config 配置,json 格式,传递给 deepspeed.initializeargs

  1. 训练批次大小 (train_batch_size):在配置文件中,可以通过指定一个整数值来设置训练批次的大小。这个值代表每个训练步骤中用于训练的样本数。
  2. 梯度累积步数 (gradient_accumulation_steps):通过设置这个参数,可以定义梯度累积的步数。这意味着在执行优化器步骤之前,模型将进行多少次前向传播和反向传播。这对于处理大批量训练数据而内存有限的情况很有用。
  3. 优化器类型和参数 (optimizer):在配置文件中,可以指定优化器的类型(如"Adam")并定义相应的参数,比如学习率 (lr)。这样可以配置模型训练中所使用的优化器及其超参数。
  4. FP16(半精度浮点数) (fp16):可以通过设置这个参数来启用或禁用FP16混合精度训练。将其设置为true表示启用FP16,以减少模型训练时的内存占用。
  5. 零优化 (zero_optimization):这个参数用于启用或禁用零优化技术,即在模型训练中将零梯度忽略以减少计算。将其设置为true表示启用零优化。
# 一个示例
{
    "train_batch_size": 8,
    "gradient_accumulation_steps": 4,
    "optimizer": {
    "type": "Adam",
    "params": {
        "lr": 0.0001,
        "weight_decay": 0.01
    }
    },
    "fp16": {
    "enabled": true
    },
    "zero_optimization": true
}

6、资源配置

单节点

在仅在单节点运行时,DeepSpeed需要注意哪些不同的配置?CUDA_VISIBLE_DEVICES与DeepSpeed的使用有何异同?

在仅在单节点运行 DeepSpeed 时,需要注意以下几点不同的配置和使用情况:

  • 不需要指定hostfile:在单节点运行时,不需要使用 hostfile 来指定计算资源。DeepSpeed会自动检测本地机器上的GPU数量,并使用这些GPU进行训练。
  • -include和--exclude参数的使用:虽然在单节点情况下不需要 hostfile,但仍可以使用 --include--exclude参数来指定使用的GPU资源。此时应将主机名指定为'localhost',例如:deepspeed --include localhost:1 ...
  • CUDA_VISIBLE_DEVICES与DeepSpeed的异同:

异同点:

  • CUDA_VISIBLE_DEVICES 是环境变量,用于指定哪些GPU设备可以被程序看到和使用。它可以限制程序在单节点内使用的GPU设备。
  • DeepSpeed 提供了 --include 和 --exclude 参数,用于在启动时指定要使用的GPU资源,类似于CUDA_VISIBLE_DEVICES的功能,但更加灵活且可以在命令行中指定不同的节点和GPU。

相同点:

  • 两者都可以用于限制DeepSpeed或其他深度学习框架在单节点上使用的GPU设备。

在单节点情况下,DeepSpeed的配置更多地集中在指定的节点内,因此不需要显式指定hostfile,而可以通过命令行参数更灵活地控制使用的GPU资源。相比之下,CUDA_VISIBLE_DEVICES是一个环境变量,需要在运行程序之前设置,控制整个进程可见的GPU设备。

三、推理

TODO

标签:engine,DeepSpeed,训练,deepspeed,step,None,model,分布式
From: https://www.cnblogs.com/abyss-130/p/17916281.html

相关文章

  • 分布式资源管理和调度
    分布式资源管理和调度分布式资源管理和调度是指在分布式系统中有效地管理和调度系统中的资源,以满足各种任务的需求。在一个分布式系统中,资源可以包括计算资源(如CPU、内存)、存储资源(如磁盘空间)、网络带宽等。分布式资源管理的目标是实现高效的资源利用和公平的资源分配。它需要考......
  • LLAMA预训练:大模型的潜力与挑战
    随着人工智能技术的不断发展,大型深度学习模型在各个领域的应用越来越广泛。其中,Bloom和LLAMA(LargeLanguageModelfromOuterSpace)两个大模型备受瞩目。这些模型在预训练阶段具有许多共同点,本文将重点介绍它们的预训练方法。一、预训练目标大型深度学习模型的预训练目标是通过大......
  • Fine-Tuning: 精调大模型训练的关键步骤
    在LLM大模型训练的第三个步骤中,我们将探讨指令精调(SuperviserFine-Tuning)的重要性,以及如何利用中文指令语料库进行训练和无监督学习的应用。一、指令精调(SuperviserFine-Tuning)指令精调是一种训练LLM大模型的优化方法,旨在提高模型对于特定任务的性能。该方法的核心思想是将预训练......
  • 李强 分布式计算、云计算与大数据 作者:林伟伟 著出版社:机械工业出版社出版时间:20
    前言背景分布式计算从20世纪六七十年代发展到现在,一直是计算机科学技术的理论与应用的热点问题,特别是*近几年,随着互联网、移动互联网、社交网络应用的发展,急需分布式计算的新技术——云计算、大数据,以满足和实现新时代计算机的应用需求。云计算、大数据等新技术本质上是分布式计......
  • (大模型训练)(工作流升级)(精品)MJ数据自动化处理流程!!!
     0.准备条件:文件夹为中文名,图片内含有多个下划线。  处理目标:处理成为一个  “公共标|逗号|一个句子"的形式。1.(统计中文,准备翻译)文件夹结构作为数据统计入excelimportosimportpandasaspddeffind_image_folders(parent_directory):"""遍历父目......
  • 代码随想录算法训练营第七天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和
    一、454.四数相加II题目链接:LeetCode454.四数相加II学习前:思路:首先定义两个HashMap对象record12和record34,对应的key存放两个数组元素的和,value存放计算的和出现的次数接着遍历record12,若record存在与之和为0的元素,则计算两个value相乘的结果,并进行累积,作为输出的结果......
  • 阿里-可视化建模-模型部署及训练
    快速开始预置了多种预训练模型。您可以基于预训练模型快速上手并使用PAI的训练和部署功能。本文为您介绍如何在快速开始查找适合您业务需求的模型、部署和调试模型、微调训练模型。前提条件如果您需要对模型进行微调训练或增量训练,需要创建OSSBucket存储空间,具体操作请参见控......
  • Gemini 自曝中文用百度文心一言训练丨 RTE 开发者日报 Vol.109
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的**观点**」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表......
  • 大语言模型训练数据常见的4种处理方法
    本文分享自华为云社区《浅谈如何处理大语言模型训练数据之一常见的数据处理方法》,作者:码上开花_Lancer。大语言模型训练需要数万亿的各类型数据。如何构造海量“高质量”数据对于大语言模型的训练具有至关重要的作用。虽然,截止到2023年9月为止,还没有非常好的大模型的理论分析......
  • 分布式架构的演变过程
    1.单应用架构此时用户量很少,所有功能全部都在一个应用中,应用和数据库部署在一台机器上。2.应用服务器和数据库服务器分离随着系统访问量的再度增加,webserver机器的压力在高峰期会上升到比较高,这个时候开始考虑增加一台服务器,将数据库分离出去。3.应用服务器集群突然有一天......