启动 Ray#

本页面介绍如何在单台机器或机器集群上启动 Ray。

提示

在按照本页说明操作之前,请务必安装 Ray

什么是 Ray 运行时?#

Ray 程序可以通过利用底层的 Ray 运行时 来实现并行和分布式计算。Ray 运行时由在后台启动的多个服务/进程组成,用于通信、数据传输、调度等。Ray 运行时可以在笔记本电脑、单个服务器或多个服务器上启动。

有三种方法启动 Ray 运行时

在所有情况下,ray.init() 将尝试自动查找要连接的 Ray 实例。它按顺序检查:1. RAY_ADDRESS 操作系统环境变量。2. 传递给 ray.init(address=<address>) 的具体地址。3. 如果未提供地址,则检查使用 ray start 在同一台机器上启动的最新 Ray 实例。

在单台机器上启动 Ray#

调用 ray.init() 会在您的笔记本电脑/机器上启动一个本地 Ray 实例。这台笔记本电脑/机器成为“头节点”。

注意

在 Ray 的最新版本 (>=1.5) 中,首次使用 Ray 远程 API 时会自动调用 ray.init()

import ray
# Other Ray APIs will not work until `ray.init()` is called.
ray.init()
import io.ray.api.Ray;

public class MyRayApp {

  public static void main(String[] args) {
    // Other Ray APIs will not work until `Ray.init()` is called.
    Ray.init();
    ...
  }
}
#include <ray/api.h>
// Other Ray APIs will not work until `ray::Init()` is called.
ray::Init()

当调用 ray.init() 的进程终止时,Ray 运行时也会终止。要显式停止或重启 Ray,请使用 shutdown API。

import ray
ray.init()
... # ray program
ray.shutdown()
import io.ray.api.Ray;

public class MyRayApp {

  public static void main(String[] args) {
    Ray.init();
    ... // ray program
    Ray.shutdown();
  }
}
#include <ray/api.h>
ray::Init()
... // ray program
ray::Shutdown()

要检查 Ray 是否已初始化,请使用 is_initialized API。

import ray
ray.init()
assert ray.is_initialized()

ray.shutdown()
assert not ray.is_initialized()
import io.ray.api.Ray;

public class MyRayApp {

public static void main(String[] args) {
        Ray.init();
        Assert.assertTrue(Ray.isInitialized());
        Ray.shutdown();
        Assert.assertFalse(Ray.isInitialized());
    }
}
#include <ray/api.h>

int main(int argc, char **argv) {
    ray::Init();
    assert(ray::IsInitialized());

    ray::Shutdown();
    assert(!ray::IsInitialized());
}

有关配置 Ray 的各种方法,请参阅配置文档。

通过 CLI 启动 Ray (ray start)#

从 CLI 使用 ray start 在机器上启动一个 1 节点的 Ray 运行时。这台机器成为“头节点”。

$ ray start --head --port=6379

Local node IP: 192.123.1.123
2020-09-20 10:38:54,193 INFO services.py:1166 -- View the Ray dashboard at http://localhost:8265

--------------------
Ray runtime started.
--------------------

...

您可以通过在运行 ray start 的同一节点上启动一个驱动进程来连接到此 Ray 实例。ray.init() 现在将自动连接到最新的 Ray 实例。

import ray
ray.init()
import io.ray.api.Ray;

public class MyRayApp {

  public static void main(String[] args) {
    Ray.init();
    ...
  }
}
java -classpath <classpath> \
  -Dray.address=<address> \
  <classname> <args>
#include <ray/api.h>

int main(int argc, char **argv) {
  ray::Init();
  ...
}
RAY_ADDRESS=<address> ./<binary> <args>

您可以通过在其他节点上也调用 ray start 将它们连接到头节点,从而创建一个 Ray 集群。有关更多详细信息,请参阅启动本地集群。在集群中的任何机器上调用 ray.init() 都将连接到同一个 Ray 集群。

启动 Ray 集群 (ray up)#

Ray 集群可以使用集群启动器启动。ray up 命令使用 Ray 集群启动器在云上启动一个集群,创建一个指定的“头节点”和工作节点。在底层,它会自动调用 ray start 来创建 Ray 集群。

您的代码只需在集群中的一台机器(通常是头节点)上执行。阅读更多关于在 Ray 集群上运行程序的信息。

要连接到 Ray 集群,请在集群中的一台机器上调用 ray.init。这将连接到最新的 Ray 集群。

ray.init()

请注意,调用 ray up 的机器不被视为 Ray 集群的一部分,因此在该同一台机器上调用 ray.init 将不会连接到集群。

下一步是什么?#

请查看我们的部署部分,了解在不同设置下部署 Ray 的更多信息,包括 KubernetesYARNSLURM