deepspeed分布式训练demo

deepspeed demo

GPT2训练

我们需要修改三个文件:argument.py pretrain_gpt2.py 以及utils.py

这三个分别对应着参数,训练,以及保存加载等过程。

1、对于argument.py我们需要将超参数丢给deepspeed:

    parser = add_data_args(parser)
    # Include DeepSpeed configuration arguments
    parser = deepspeed.add_config_arguments(parser)

2、修改pretrain.py,主要就是,model 、优化器丢到deepspeed

def setup_model_and_optimizer(args):
    """Setup model and optimizer."""
​
    model = get_model(args)
    optimizer = get_optimizer(model, args)
    lr_scheduler = get_learning_rate_scheduler(optimizer, args)
    if args.deepspeed:
        import deepspeed
​
        print_rank_0("DeepSpeed is enabled.")
​
        model, optimizer, _, lr_scheduler = deepspeed.initialize(
            model=model,
            optimizer=optimizer,
            args=args,
            lr_scheduler=lr_scheduler,
            mpu=mpu,
            dist_init_required=False
       )
 

在设置优化器的时候,我们直接使用Adam系列就行

    optimizer = Adam(param_groups,
                     lr=args.lr, weight_decay=args.weight_decay)

3、设置成deepspeed的反向传播

    #如果使用deepspeed则使用model.backward ,不然是loss.backward()
    if args.deepspeed:
            model.backward(loss)
        else:
            optimizer.zero_grad()
            if args.fp16:
                optimizer.backward(loss, update_master_grads=False)
            else:
                loss.backward()
     #更新参数
    if args.deepspeed:
         model.step()
     else:
         optimizer.step()
​
         # Update learning rate.
         if not (args.fp16 and optimizer.overflow):
             lr_scheduler.step()
         else:
             skipped_iter = 1

所以训练模型的时候都可以这三步走。

底层优化:(可以不看)

反向传播的时候,我们要选择是allreduce还是其他的通信方法

        if args.deepspeed:
            # DeepSpeed backward propagation already addressed all reduce communication.
            # Reset the timer to avoid breaking timer logs below.
            #DeepSpeed反向传播已经处理了所有的reduce通信。
            #重置计时器以避免破坏下面的计时器日志
            timers('allreduce').reset()
        else:
            torch.distributed.all_reduce(reduced_losses.data)
            reduced_losses.data = reduced_losses.data / args.world_size
            if not USE_TORCH_DDP:
                timers('allreduce').start()
                model.allreduce_params(reduce_after=False,
                                       fp32_allreduce=args.fp32_allreduce)
                timers('allreduce').stop()

提过更新主节点的梯度

        # Update master gradients.
        if not args.deepspeed:
            if args.fp16:
                optimizer.update_master_grads()
​
            # Clipping gradients helps prevent the exploding gradient.
            if args.clip_grad > 0:
                if not args.fp16:
                    mpu.clip_grad_norm(model.parameters(), args.clip_grad)
                else:
                    optimizer.clip_master_grads(args.clip_grad)
​
        return lm_loss_reduced
更新模型参数
if args.deepspeed:
         model.step()
     else:
         optimizer.step()
​
         # Update learning rate.
         if not (args.fp16 and optimizer.overflow):
             lr_scheduler.step()
         else:
             skipped_iter = 1

cifar10

将pytorch原始的代码

1配置参数

2训练

3保存节点

环境配置

下载code(0.3.0)
git clone https://github.com/microsoft/DeepSpeed.git
安装python环境
  • 需要注意pytroch cuda的版本,需要彼此对上

pip install torch==1.5.1 torchvision==0.6.1 ​ 
pip install cupy_cuda102==7.8.0 ​ 
pip install virtualenv==20.0.31
  • 查看cuda版本

import torch
print(torch.version.cuda)
安装deep speed依赖
cd DeepSpeed
pip install -r requirements/requirements-dev.txt 
pip install -r requirements/requirements  
pip install -r requirements/requirements-sparse-attn.txt 
pip install mpi4py
pip install --ignore-installed PyYAML
设置分布式多机ssh登录
  • 多机之间需要通过ssh免密互相登录

git config --global user.name "xxx"
git config --global user.email "xxx@mobvoi.com"
ssh-keygen -t rsa -C "xxx@mobvoi.com"
#这一步是配置ssh免密连接
把生成的公钥拷贝到其他机器.ssh目录下即可
安装DeepSpeed
cd DeepSpeed
./install.sh 
等一会即可完成安装
测试demo
单机测试
  • demo是一个简单的分类测试,是单机的

cd DeepSpeed/DeepSpeedExamples/pipeline_parallelism
./run.sh
多机训练测试demo
  • 增加hostfile文件,填写host的相应的gpu数量(slots=4代表有4个gpu)

host1 slots=4
host2 slots=4
  • include参数,指定机器和gpu,如下代表使用host1机器的3号和host2的2、3号gpu

--include="host1:3@host2:2,3"
  • exclude参数,同include参数,代表不使用相应的gpu

  • ds_config.json 文件里面配置训练的参数,如batch_size、优化器参数、log参数度呢

{
  "train_batch_size" : 256,
  "train_micro_batch_size_per_gpu" : 8,
​
   "optimizer": {
    "type": "Adam",
    "params": {
      "lr": 0.001,
      "betas": [
        0.9,
        0.999
      ],
      "eps": 1e-8
    }
  },
​
  "steps_per_print" : 10,
  "wall_clock_breakdown" : false
 }
  • 完整run.sh 命令如下,运行即可实验多机、多gpu训练的demo啦。

#!/bin/bash
​
deepspeed --hostfile=hostfile  --include="host1:3@host2:2,3"  train.py -p 2 --steps=200  --deepspeed_config=ds_config.json
### 回答1: 很高兴为您介绍Java分布式事务demo。Java分布式事务demo是一个演示如何使用Java编写分布式事务的示例应用程序。它使用Java Transaction API(JTA)和Java Message Service(JMS)技术来实现分布式事务。 ### 回答2: Java分布式事务Demo是一个演示分布式事务处理的示例程序。在实际的分布式系统中,多个节点之间可能需要协调完成某些事务操作,而分布式事务Demo就是为了展示如何在Java应用程序中实现这种分布式事务的。 Demo中可能包含以下几个主要的组件或步骤: 1. 事务管理器:一个用于管理整个分布式事务的组件。它负责确保在分布式事务中所有参与者的操作都能被正确地协调和提交或回滚。 2. 参与者节点:分布式事务中的各个参与者,可能是不同的Java应用程序。它们需要按照事务管理器的协调指令来执行相应的事务操作。 3. 事务的提交和回滚:事务管理器会向所有参与者节点发送事务协调指令,要求它们执行事务操作。一旦所有节点都完成了相应操作,事务管理器会根据结果决定是否提交或回滚整个事务。 Demo可以通过模拟不同的分布式事务场景来展示分布式事务的执行过程和结果。例如,可以模拟一个转账的场景,将转账操作拆分成两个参与者节点(例如两个不同的银行账户),然后演示在分布式事务中的转账操作如何被正确地协调和提交或回滚。 通过这个Demo,可以更好地理解和学习分布式事务的实现和处理方式,帮助开发人员在实际的分布式系统中设计和实现可靠的分布式事务处理。 ### 回答3: Java分布式事务是指在分布式系统中同时执行多个操作,并将这些操作作为一个整体进行提交或回滚的过程。这种方式可以确保系统中的多个操作要么都成功执行,要么都不执行,以保持数据的一致性。 通常,分布式事务需要满足ACID的特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。在Java中,可以使用一些框架和技术来实现分布式事务,如Java Transaction API(JTA)、Spring Framework和Atomikos等。 一个简单的Java分布式事务demo可以是一个购物应用,该应用涉及到两个系统,一个是订单系统,另一个是库存系统。在用户下单后,需要同时将订单数据写入订单系统和库存系统中。 在这个demo中,可以使用Spring框架来管理分布式事务。首先,需要在配置文件中配置两个数据源,分别对应订单系统和库存系统的数据库。然后,使用@Transactional注解来标识需要进行事务管理的方法。 在用户下单的方法中,首先会执行保存订单数据的操作,然后执行减少库存的操作。如果其中一个操作失败,整个事务会被回滚,即订单数据和库存数据都不会被保存。 为了实现分布式事务的协调,可以使用JTA来进行事务管理。JTA提供了事务管理器来协调不同系统中的事务,并确保它们都能够按照预期进行提交或回滚。 当然,这只是一个简单的demo,实际的分布式事务可能涉及到更复杂的场景和技术。但是,通过这个demo可以初步了解到Java中如何实现分布式事务并确保数据的一致性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值