目录
Ray是什么?
Ray是一个开源的Python分布式计算框架,它提供了一种用于构建并行和分布式应用的模型,其在分布式机器学习、深度学习、强化学习等领域得到了广泛的应用,也被用于构建大规模数据处理和分析的分布式应用程序。
Ray的特性
1、允许用户将任务并行化,将大型任务拆分成小任务,并在集群上的多个节点上并行执行,以充分利用计算资源。
2、提供了分布式对象的概念,允许用户在不同的节点上共享和访问数据,这样可以更方便地在分布式系统中处理大规模数据。
3、Ray自动处理任务的调度和资源管理,无需手动指定任务在集群中的位置,简化了开发者的工作。
使用Ray集群
将Ray部署在多个计算节点上,以共同处理任务并利用集群的计算资源。
在Ray集群中,需要有一个主节点(head node)和多个工作节点(worker nodes)。需要先启动头节点,给工作节点赋予头节点地址,组成集群。
在本次demo中,我们将利用Docker启动两个Ubuntu容器来模拟集群,以下是具体步骤
1、安装Docker
可以参考小鱼的一键安装:
小鱼的一键安装系列 | 鱼香ROS (fishros.org.cn)
2、下载ubuntu镜像
docker pull ubuntu
3、启动两个ubuntu容器
启动第一个,命名为ubuntu-01
docker run -it --name ubuntu-01 ubuntu /bin/bash
ctrl+p+q退出容器
启动第二个,命名为ubuntu-02
docker run -it --name ubuntu-02 ubuntu /bin/bash
ctrl+p+q退出容器
检查容器的ip地址,这里两个 ubuntu容器默认使用bridge网络
docker network inspect bridge
找到"Containers"部分,如图所示
ubuntu-01:172.17.0.2
ubuntu-02:172.17.0.3
4、容器环境配置
分别进入两个容器,安装python、pip、ray
apt update && apt install python3
apt install python3-pip
pip3 install ray
5、启动head节点
选择其中一个容器作为head节点,这里选择ubuntu-01,其ip地址为172.17.0.2
查看容器ID
docker ps
进入容器ubuntu-01,注意使用自己容器的ID
docker attach 8a17e76115ae
执行
ray start --head --node-ip-address 172.17.0.2
默认端口6379,执行结果如下
可以在Next steps中看到有关下一步的提示
ctrl+p+q退出容器
6、启动worker节点
进入另一个容器ubuntu-02,同样注意自己容器ID
docker attach 977c0e570cb3
执行
ray start --address='172.17.0.2:6379' --redis-password='5241590000000000'
7、执行任务
任意选择一个容器执行任务,由于我们当前还在ubuntu-02容器中,所以直接在这里执行
首先安装vim编辑器
apt install vim
进入home目录下
cd /home
创建脚本
vim ray_demo.py
按 i 进入编辑模式
输入以下代码,注意修改ray.init()函数中的ip地址,与自己head节点所在的ip地址保持一致,端口未指定则默认6379
from collections import Counter
import socket
import time
import ray
ray.init(address='172.17.0.2:6379', _redis_password='5241590000000000')
print('''This cluster consists o f
{} nodes in total
{} CPU resources in total
'''.format(len(ray.nodes()), ray.cluster_resources()['CPU']))
@ray.remote
def f():
time.sleep(0.001)
# Return IP address.
return socket.gethostbyname(socket.gethostname())
object_ids = [f.remote() for _ in range(10000)]
ip_addresses = ray.get(object_ids)
print('Tasks executed')
for ip_address, num_tasks in Counter(ip_addresses).items():
print(' {} tasks on {}'.format(num_tasks, ip_address))
按 Esc 退出编辑模式
输入 :wq 保存退出
运行脚本
python3 ray_demo.py
执行结果如下
可以看到 172.17.0.2 执行了 4292 个任务,172.17.0.3 执行了 5708 个任务,实现了分布式计算的效果。