全栈工程师开发手册 (作者:栾鹏)https://blog.51cto.com/u_15858929/6117117
一站式云原生机器学习平台

 

ray 多机分布式

有时候单台机器多进程也无法快速完成代码运行,这个时候就需要多机器实现:
1、单机器算力有限,核数不足
2、有些运行有机器白名单显示,需要多台机器ip增加并发处理

分布式计算集群

为了方便的实现一个ray多机分布式集群,这里直接使用

cube开源一站式云原生机器学习平台--ray 多机分布式计算_分布式集群

 ​https://github.com/tencentmusic/cube-studio​​​ 开源的云原生一站式机器学习平台。
使用ray这个模板,填上自己的worker数量,初始化脚本和python启动命令

cube开源一站式云原生机器学习平台--ray 多机分布式计算_机器学习_02

分布式原理和代码

cube开源一站式云原生机器学习平台--ray 多机分布式计算_云原生_03

基本原则

cube开源一站式云原生机器学习平台--ray 多机分布式计算_云原生_04

driver端就是启动脚本的地方,driver端解析要处理那些任务,并把每个任务发送给headnode,headnode会根据slavenode的运行情况分发这些任务,当当前有空闲slavenode时,driveiu会发起新的任务。

主要变更

原有代码

def fun1(index):
# 这里是耗时的任务
return ‘back_data’

def main():
for index in […]:
fun1(index) # 直接执行任务

if __name__==”__main__”:
main()


新代码

import ray,os,time

@ray.remote
def fun1(arg):
# 这里是耗时的任务,函数内不能引用全局变量,只能使用函数内的局部变量。
print(arg)
time.sleep(1)
return ‘back_data’

def main():
tasks=[]
tasks_args = range(100)
for arg in tasks_args:
tasks.append(fun1.remote(arg)) # 建立远程函数
result = ray.get(tasks) # 获取任务结果

if __name__ == “__main__”:

head_service_ip = os.getenv(‘RAY_HOST’, ”)
if head_service_ip:
# 集群模式
head_host = head_service_ip + “.pipeline” + “:10001”
ray.util.connect(head_host)
else:
# 本地模式
ray.init()

main()


单机运行使用ray.init()启动会自动使用多进程
多级运行时使用ray.util.connect(head_host) 会自动链接多机环境