关键概念#

本节介绍 Ray 监控和调试工具及功能的关键概念。

Dashboard (Web UI)#

Ray 提供了一个基于 Web 的 Dashboard,帮助用户监控和调试 Ray 应用和集群。

有关 Dashboard 的更多详细信息,请参阅入门

Ray 状态#

Ray 状态指代各种 Ray 实体(例如 Actor、Task、Object 等)的状态。Ray 2.0 及更高版本支持使用 CLI 和 Python API 查询实体状态

以下命令列出集群中的所有 Actor。

ray list actors
======== List: 2022-07-23 21:29:39.323925 ========
Stats:
------------------------------
Total: 2

Table:
------------------------------
    ACTOR_ID                          CLASS_NAME    NAME      PID  STATE
0  31405554844820381c2f0f8501000000  Actor                 96956  ALIVE
1  f36758a9f8871a9ca993b1d201000000  Actor                 96955  ALIVE

有关更多详细信息,请查看使用 CLI 或 SDK 进行监控

指标#

Ray 收集并暴露物理统计信息(例如,每个节点的 CPU、内存、GRAM、磁盘和网络使用情况)、内部统计信息(例如,集群中的 Actor 数量、集群中的 Worker 故障数量)以及自定义应用程序指标(例如,用户定义的指标)。所有统计信息都可以导出为时间序列数据(默认为 Prometheus),并用于随时间监控集群。

有关在 Ray Dashboard 中查看指标的位置,请参阅指标视图。有关如何从 Ray 集群收集指标,请参阅收集指标

异常#

创建新 Task 或提交 Actor Task 会生成一个对象引用。当对该对象引用调用 ray.get 时,如果相关的 Task、Actor 或 Object 出现任何问题,API 会引发异常。例如:

  • 当用户代码中的错误抛出异常时,会引发 RayTaskError

  • 当 Actor 死亡时(由系统故障,例如节点故障,或用户级故障,例如 __init__ 方法中的异常),会引发 RayActorError

  • 当 Actor 或 Task 无法启动,因为运行时环境创建失败时,会引发 RuntimeEnvSetupError

有关更多详细信息,请参阅异常参考

调试器#

Ray 内置了一个调试器,用于调试你的分布式应用。在 Ray Task 和 Actor 中设置断点,当命中断点时,进入 PDB 会话,可以:

  • 检查该上下文中的变量

  • 在 Task 或 Actor 中单步执行

  • 上下移动堆栈

有关更多详细信息,请查看Ray Debugger

性能分析#

性能分析是通过采样应用程序的资源使用情况来分析其性能的方法。Ray 支持多种性能分析工具:

有关更多详细信息,请查看性能分析。请注意,此列表并不全面,如果你发现其他有用的工具,欢迎贡献。

追踪#

为了帮助调试和监控 Ray 应用,Ray 支持跨 Task 和 Actor 的分布式追踪(与 OpenTelemetry 集成)。

有关更多详细信息,请参阅Ray 追踪

应用日志#

日志对于通用监控和调试至关重要。对于分布式 Ray 应用,日志更加重要,但也更加复杂。Ray 应用同时在 Driver 和 Worker 进程上运行(甚至跨越多台机器),这些进程的日志是应用日志的主要来源。

Application logging

Driver 日志#

调用 ray.init() 的 Ray 应用入口点称为 Driver。所有 Driver 日志的处理方式与普通 Python 程序相同。

Worker 日志 (stdout 和 stderr)#

Ray 在 Ray 的 Worker 进程中远程执行 Task 或 Actor。Task 和 Actor 的日志会捕获到 Worker 的 stdout 和 stderr 中。

Ray 提供特殊支持以提高 Worker 进程产生的 stdout 和 stderr 的可见性,使得 Ray 程序看起来像非分布式程序,这也称为“Worker 日志重定向到 Driver”。

  • Ray 将所有 Task 和 Actor 的 stdout 和 stderr 重定向到 Worker 日志文件,包括 Worker 生成的任何日志消息。请参阅日志目录和文件结构以了解 Ray 的日志结构。

  • Driver 读取 Worker 日志文件(其中包含所有 Task 和 Actor 的 stdout 和 stderr),并将日志记录发送到自己的 stdout 和 stderr(也称为“Worker 日志被重定向到 Driver 输出”)。

对于以下代码:

import ray
# Initiate a driver.
ray.init()

@ray.remote
def task_foo():
    print("task!")

ray.get(task_foo.remote())
(task_foo pid=12854) task!
  1. Ray Task task_foo 在 Ray Worker 进程上运行。字符串 task! 被保存到相应的 Worker stdout 日志文件中。

  2. Driver 读取 Worker 日志文件并将其发送到其 stdout(终端),在那里你应该能够看到字符串 task!

打印日志时,会同时打印执行 Task 或 Actor 的节点的进程 ID (pid) 和 IP 地址。输出如下:

(pid=45601) task!

Actor 日志消息默认如下所示:

(MyActor pid=480956) actor log message

默认情况下,所有 Task 和 Actor 的 stdout 和 stderr 都会重定向到 Driver 输出。有关如何禁用此功能,请查看配置日志记录

Job 日志#

Ray 应用通常作为 Ray Job 运行。Ray Job 的 Worker 日志总是捕获到Ray 日志目录中,而 Driver 日志则不会。

Driver 日志仅针对通过Jobs API提交的 Ray Job 进行捕获。可以使用 Dashboard UI、CLI(使用 ray job logs CLI 命令)或Python SDKJobSubmissionClient.get_logs()JobSubmissionClient.tail_job_logs())查找捕获的 Driver 日志。

注意

如果你直接在 Head 节点上执行 Ray Driver 或通过 Ray Client 连接来运行 Ray Job,可以在终端或 Jupyter Notebooks 中查看 Driver 日志。