关键概念#
本节介绍了 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 进行监控。
Metrics#
Ray 收集并公开物理统计信息(例如,每个节点的 CPU、内存、GRAM、磁盘和网络使用情况)、内部统计信息(例如,集群中的 Actor 数量、集群中的 Worker 故障数量)以及自定义应用程序指标(例如,用户定义的指标)。所有统计信息都可以导出为时间序列数据(默认导出到 Prometheus),并用于随着时间的推移监控集群。
有关在 Ray Dashboard 中查看指标的位置,请参阅 Metrics View。有关如何从 Ray 集群收集指标,请参阅 收集指标。
Exceptions#
创建新任务或提交 Actor 任务会生成对象引用。当在对象引用上调用 ray.get 时,如果相关的任务、Actor 或对象出现问题,API 将引发异常。例如,
当用户代码中的错误引发异常时,将抛出
RayTaskError。当 Actor 死亡时(由于系统故障,例如节点故障,或用户级别故障,例如
__init__方法中的异常),将抛出RayActorError。当 Actor 或 Task 无法启动,因为 运行时环境 创建失败时,将抛出
RuntimeEnvSetupError。
有关更多详细信息,请参阅 异常参考。
Debugger#
Ray 具有内置的调试器,用于调试分布式应用程序。在 Ray 任务和 Actor 中设置断点,当命中断点时,将进入 PDB 会话以
检查该上下文中的变量
在任务或 Actor 中单步执行
在堆栈中向上或向下移动
有关更多详细信息,请参阅 Ray Debugger。
性能分析#
性能分析是一种通过对应用程序资源使用情况进行采样来分析其性能的方法。Ray 支持各种性能分析工具。
内存性能分析(适用于 Driver 和 Worker 进程),使用 memray。
GPU 性能分析(使用 Pytorch Profiler 和 Nsight System)。
内置的 Task 和 Actor 性能分析工具,称为 Ray Timeline。
有关更多详细信息,请参阅 Profiling。请注意,此列表并不详尽,如果您发现其他有用的工具,请随时贡献。
Tracing#
为了帮助调试和监控 Ray 应用程序,Ray 支持跨任务和 Actor 的分布式跟踪(与 OpenTelemetry 集成)。
有关更多详细信息,请参阅 Ray Tracing。
Application logs#
日志对于常规监控和调试至关重要。对于分布式 Ray 应用程序,日志更为重要,但同时也很复杂。Ray 应用程序在 Driver 和 Worker 进程(甚至跨多台机器)上运行,这些进程的日志是应用程序日志的主要来源。
Driver logs#
调用 ray.init() 的 Ray 应用程序入口点称为 **Driver**。所有 Driver 日志都与普通 Python 程序以相同的方式处理。
Worker logs (stdout and stderr)#
Ray 在 Ray Worker 进程中远程执行任务或 Actor。任务和 Actor 的日志记录在 Worker 的 stdout 和 stderr 中。
Ray 提供特殊支持以提高 Worker 进程产生的 stdout 和 stderr 的可见性,从而使 Ray 程序看起来像一个非分布式程序,也称为“Worker 日志重定向到 Driver”。
Ray 将所有任务和 Actor 的 stdout 和 stderr 重定向到 Worker 日志文件,包括 Worker 生成的任何日志消息。请参阅 日志目录和文件结构 以了解 Ray 的日志结构。
Driver 读取 Worker 日志文件(其中包含所有任务和 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_foo在 Ray Worker 进程上运行。字符串task!被保存在相应的 Workerstdout日志文件中。Driver 读取 Worker 日志文件并将其发送到其
stdout(终端),您应该能够在此处看到字符串task!。
当打印日志时,将一起打印执行任务或 Actor 的节点的进程 ID (pid) 和 IP 地址。输出如下:
(pid=45601) task!
Actor 日志消息默认如下所示:
(MyActor pid=480956) actor log message
默认情况下,所有任务和 Actor 的 stdout 和 stderr 都被重定向到 Driver 输出。有关如何禁用此功能,请参阅 配置日志记录。
Job logs#
Ray 应用程序通常作为 Ray 作业运行。Ray 作业的 Worker 日志始终会捕获在 Ray 日志目录 中,而 Driver 日志则不会。
Driver 日志仅在通过 Jobs API 提交的 Ray 作业时才会被捕获。通过 Dashboard UI、CLI(使用 ray job logs CLI 命令)或 Python SDK(JobSubmissionClient.get_logs() 或 JobSubmissionClient.tail_job_logs())查找捕获的 Driver 日志。
注意
如果您通过直接在 Head 节点上执行 Ray Driver 或通过 Ray Client 连接来运行 Ray 作业,请在终端或 Jupyter Notebook 中查看 Driver 日志。