知识点: 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并行计算,所以总的消耗时间也在一秒左右。