教案:Horovod on Ray

教案:Horovod on Ray

课程目标

  1. 了解Horovod与Ray的集成原理和优势。
  2. 学习如何在Ray集群上安装和配置Horovod。
  3. 掌握使用RayExecutor进行分布式训练的方法。
  4. 理解Ray的弹性执行特性及其在Horovod中的应用。

教学内容

1. Horovod on Ray简介
  • 集成目的
    • 结合Horovod的分布式训练优势与Ray的集群管理和弹性扩展能力。
    • 使用RayExecutor API进行分布式任务执行。
    • 目前仅支持Gloo后端。
2. 安装Horovod和Ray
  • 安装步骤
    $ HOROVOD_WITH_GLOO=1 ... pip install 'horovod[ray]'
    
  • 参考文档
3. 使用RayExecutor进行分布式训练
  • 基本用法
    from horovod.ray import RayExecutor
    import ray
    
    # 启动或连接到现有Ray集群
    ray.init()
    
    # 在集群上启动num_workers个actor
    executor = RayExecutor(
        setting, num_workers=num_workers, use_gpu=True)
    executor.start()
    
  • 执行函数
    def simple_fn():
        hvd.init()
        print("hvd rank", hvd.rank())
        return hvd.rank()
    
    result = executor.run(simple_fn)
    assert len(set(result)) == hosts * num_slots
    executor.shutdown()
    
4. 状态执行
  • 支持有状态Actors
    import torch
    from horovod.torch import hvd
    from horovod.ray import RayExecutor
    
    class MyModel:
        def __init__(self, learning_rate):
            self.model = NeuralNet()
            optimizer = torch.optim.SGD(
                self.model.parameters(),
                lr=learning_rate,
            )
            self.optimizer = hvd.DistributedOptimizer(optimizer)
    
        def get_weights(self):
            return dict(self.model.parameters())
    
        def train(self):
            return self._train(self.model, self.optimizer)
    
    ray.init()
    executor = RayExecutor(...)
    executor.start(executable_cls=MyModel)
    
    for i in range(5):
        executor.execute(lambda worker: worker.train())
    
    result = executor.execute(lambda worker: worker.get_weights())
    assert all(isinstance(res, dict) for res in result)
    
5. 弹性RayExecutor
  • 弹性执行
    $ ray up ray/python/ray/autoscaler/aws/example-full.yaml
    
    import horovod.torch as hvd
    
    def training_fn():
        hvd.init()
        model = Model()
        torch.cuda.set_device(hvd.local_rank())
    
        @hvd.elastic.run
        def train(state):
            for state.epoch in range(state.epoch, epochs):
                ...
                state.commit()
    
        state = hvd.elastic.TorchState(model, optimizer, batch=0, epoch=0)
        state.register_reset_callbacks([on_state_reset])
        train(state)
        return
    
    import ray
    from horovod.ray import RayExecutor
    
    ray.init(address="auto")
    settings = RayExecutor.create_settings(verbose=True)
    executor = RayExecutor(
        settings, min_workers=1, use_gpu=True, cpus_per_slot=2)
    executor.start()
    executor.run(training_fn)
    
6. AWS集群启动
  • 集群配置
    cluster_name: horovod-cluster
    provider: {type: aws, region: us-west-2}
    auth: {ssh_user: ubuntu}
    min_workers: 3
    max_workers: 3
    
    head_node: {InstanceType: p3.2xlarge, ImageId: ami-0b294f219d14e6a82}
    worker_nodes: {InstanceType: p3.2xlarge, ImageId: ami-0b294f219d14e6a82}
    setup_commands:
        - HOROVOD_WITH_GLOO=1 HOROVOD_GPU_OPERATIONS=NCCL pip install horovod[ray]
    
  • 启动和监控集群
    $ ray up ray_cluster.yaml
    $ ray monitor ray_cluster.yaml
    

教学活动

  1. 讲解与讨论

    • 介绍Horovod与Ray的集成,讲解其动机和优势。
    • 演示基本的RayExecutor用法及其在分布式训练中的应用。
  2. 实践操作

    • 安装Horovod和Ray,并配置集群环境。
    • 修改现有的训练脚本以使用RayExecutor进行分布式训练。
  3. 案例分析

    • 使用RayExecutor进行有状态和无状态的分布式训练。
    • 配置和运行弹性RayExecutor。

课后作业

  1. 安装与配置

    • 安装Horovod和Ray,配置本地或云端集群环境。
  2. 代码实现

    • 修改现有的训练脚本,使用RayExecutor进行分布式训练,并分析其性能。
  3. 弹性训练

    • 配置弹性RayExecutor,并运行训练任务,记录和分析结果。

参考资料

通过本次课程,学生将掌握Horovod与Ray的集成使用方法,能够在分布式环境中高效运行训练任务,并利用Ray的弹性特性进行自动扩展和资源管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值