关键概念#
本节介绍 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 支持多种性能分析工具:
使用 memray 对 Driver 和 Worker 进程进行内存性能分析
使用 Pytorch Profiler 和 Nsight System 进行 GPU 性能分析
内置的 Task 和 Actor 性能分析工具,称为 Ray Timeline
有关更多详细信息,请查看性能分析。请注意,此列表并不全面,如果你发现其他有用的工具,欢迎贡献。
追踪#
为了帮助调试和监控 Ray 应用,Ray 支持跨 Task 和 Actor 的分布式追踪(与 OpenTelemetry 集成)。
有关更多详细信息,请参阅Ray 追踪。
应用日志#
日志对于通用监控和调试至关重要。对于分布式 Ray 应用,日志更加重要,但也更加复杂。Ray 应用同时在 Driver 和 Worker 进程上运行(甚至跨越多台机器),这些进程的日志是应用日志的主要来源。

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!
Ray Task
task_foo
在 Ray Worker 进程上运行。字符串task!
被保存到相应的 Workerstdout
日志文件中。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 SDK(JobSubmissionClient.get_logs()
或 JobSubmissionClient.tail_job_logs()
)查找捕获的 Driver 日志。
注意
如果你直接在 Head 节点上执行 Ray Driver 或通过 Ray Client 连接来运行 Ray Job,可以在终端或 Jupyter Notebooks 中查看 Driver 日志。