教案:Horovod on Ray
课程目标
- 了解Horovod与Ray的集成原理和优势。
- 学习如何在Ray集群上安装和配置Horovod。
- 掌握使用RayExecutor进行分布式训练的方法。
- 理解Ray的弹性执行特性及其在Horovod中的应用。
教学内容
1. Horovod on Ray简介
- 集成目的
- 结合Horovod的分布式训练优势与Ray的集群管理和弹性扩展能力。
- 使用RayExecutor API进行分布式任务执行。
- 目前仅支持Gloo后端。
2. 安装Horovod和Ray
- 安装步骤
$ HOROVOD_WITH_GLOO=1 ... pip install 'horovod[ray]'
- 参考文档
- Ray的高级安装说明: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 RayExecutorclass 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 hvddef training_fn():hvd.init()model = Model()torch.cuda.set_device(hvd.local_rank())@hvd.elastic.rundef 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)returnimport ray from horovod.ray import RayExecutorray.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: 3head_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
教学活动
-
讲解与讨论
- 介绍Horovod与Ray的集成,讲解其动机和优势。
- 演示基本的RayExecutor用法及其在分布式训练中的应用。
-
实践操作
- 安装Horovod和Ray,并配置集群环境。
- 修改现有的训练脚本以使用RayExecutor进行分布式训练。
-
案例分析
- 使用RayExecutor进行有状态和无状态的分布式训练。
- 配置和运行弹性RayExecutor。
课后作业
-
安装与配置
- 安装Horovod和Ray,配置本地或云端集群环境。
-
代码实现
- 修改现有的训练脚本,使用RayExecutor进行分布式训练,并分析其性能。
-
弹性训练
- 配置弹性RayExecutor,并运行训练任务,记录和分析结果。
参考资料
- Horovod官方文档
- Ray官方文档
- AWS集群启动文档
通过本次课程,学生将掌握Horovod与Ray的集成使用方法,能够在分布式环境中高效运行训练任务,并利用Ray的弹性特性进行自动扩展和资源管理。