什么是 Ray Core?#
Ray Core 提供了少量核心原语(即任务、角色、对象),用于构建和扩展分布式应用程序。下面我们将通过简单的示例,展示如何轻松地将您的函数和类转换为 Ray 任务和角色,以及如何使用 Ray 对象。
入门指南#
要开始使用,请通过 pip install -U ray
安装 Ray。有关更多安装选项,请参阅 安装 Ray。接下来的几节将介绍使用 Ray Core 的基础知识。
第一步是导入并初始化 Ray:
import ray
ray.init()
备注
在Ray的最新版本(>=1.5)中,首次使用Ray远程API时会自动调用 ray.init()
。
运行任务#
Ray 允许你在集群中将函数作为远程任务运行。为此,你可以使用 @ray.remote
装饰你的函数,以声明你希望远程运行此函数。然后,你可以使用 .remote()
调用该函数,而不是正常调用它。这个远程调用返回一个未来,即所谓的 Ray 对象引用,你可以使用 ray.get
获取它:
# Define the square task.
@ray.remote
def square(x):
return x * x
# Launch four parallel square tasks.
futures = [square.remote(i) for i in range(4)]
# Retrieve results.
print(ray.get(futures))
# -> [0, 1, 4, 9]
调用一个演员#
Ray 提供了 actors 来允许你在多个 actor 实例之间并行化计算。当你实例化一个 Ray actor 类时,Ray 将在集群中启动该类的远程实例。这个 actor 可以执行远程方法调用并维护其自己的内部状态:
# Define the Counter actor.
@ray.remote
class Counter:
def __init__(self):
self.i = 0
def get(self):
return self.i
def incr(self, value):
self.i += value
# Create a Counter actor.
c = Counter.remote()
# Submit calls to the actor. These calls run asynchronously but in
# submission order on the remote actor process.
for _ in range(10):
c.incr.remote(1)
# Retrieve final actor state.
print(ray.get(c.get.remote()))
# -> 10
上述内容涵盖了非常基本的参与者使用方法。如需更深入的示例,包括同时使用任务和参与者,请查看 蒙特卡罗法估计 π。
传递一个对象#
如上所述,Ray 将其任务和 actor 调用结果存储在其 分布式对象存储 中,返回 对象引用 ,这些引用可以在以后检索。对象引用也可以通过 ray.put
显式创建,并且对象引用可以作为参数值的替代传递给任务:
import numpy as np
# Define a task that sums the values in a matrix.
@ray.remote
def sum_matrix(matrix):
return np.sum(matrix)
# Call the task with a literal argument value.
print(ray.get(sum_matrix.remote(np.ones((100, 100)))))
# -> 10000.0
# Put a large array into the object store.
matrix_ref = ray.put(np.ones((1000, 1000)))
# Call the task with the object reference as an argument.
print(ray.get(sum_matrix.remote(matrix_ref)))
# -> 1000000.0
下一步#
小技巧
要检查您的应用程序的运行情况,您可以使用 Ray 仪表盘。
Ray 的核心原语很简单,但可以组合在一起表达几乎任何类型的分布式计算。通过以下用户指南了解更多关于 Ray 的 关键概念:
使用远程函数 (Tasks)
使用远程类(Actor)
使用 Ray 对象