知识点: Remote Function

ray的remote function创建非常之简单,就是在普通的function前面加上decorator @ray.remote

ray remote 函数 和 普通函数的区别

1、调用函数的时候

  • 普通函数直接regular_func()
  • remote函数是remote_func.remote()

2、函数返回内容

  • 普通函数直接返回值
  • remote函数返回的是objectref,看作一个object ID,然后ray再创建一个task去运行它。可以通过ray.get()去获得objectref的结果

在这里插入图片描述

3、并行处理

  • 普通函数按照顺序调用、输出
  • remote函数调用是并行、不保证顺序的

测试ray运行速度

使用普通函数

import time

# 初始化一个普通函数
def slow_func(i):
    time.sleep(1)
    return i

# 调用上面这个普通函数
time.sleep(2.0)
start_time = time.time()  # 调用开始前时间点
results = [slow_func(i) for i in range(4)]
end_time = time.time()  # 调用结束时时间点
duration = end_time - start_time  # 计算周期
print('The results are {}. This took {} seconds'.format(results, duration))

在这里插入图片描述
可以从结果看到,这个普通函数在for loop里是顺序调用的,slow func每次停1秒。总共这个for loop跑完大约 4秒钟

使用remote函数

初始化一个4 CPU的ray(如果不设置,默认1 CPU+nothing)

ray.init(num_cpus=4,ignore_reinit_error=True)
@ray.remote
def slow_func(i):
    time.sleep(1)
    return i

time.sleep(2.0)
start_time = time.time()
result = [slow_func.remote(i) for i in range(4)]
end_time = time.time()
duration = end_time - start_time  # 计算周期
print('The results are {}. This took {} seconds'.format(results, duration))

在这里插入图片描述
从结果看出,虽然都是在slow func的第一步让程序暂停一秒钟,ray并行计算,所以总的消耗时间也在一秒左右。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐