关键概念#

本节涵盖了Ray中监控和调试工具及功能的关键概念。

仪表盘 (Web UI)#

Ray 提供了一个基于网页的仪表板,帮助用户监控和调试 Ray 应用和集群。

有关仪表板的更多详细信息,请参阅 入门指南

Ray 状态#

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

以下命令列出集群中的所有演员:

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 仪表盘中查看指标的位置。查看 收集指标 了解如何从 Ray 集群中收集指标。

异常#

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

  • RayTaskError 在用户代码抛出异常时引发。

  • RayActorError 在 Actor 死亡时引发(由于系统故障,如节点故障,或用户级故障,如来自 __init__ 方法的异常)。

  • RuntimeEnvSetupError 在因为无法创建 运行时环境 而导致 Actor 或 Task 无法启动时被引发。

更多详情请参见 异常参考

调试器#

Ray 内置了一个调试器,用于调试分布式应用程序。在 Ray 任务和执行器中设置断点,当命中断点时,进入 PDB 会话以:

  • 在该上下文中检查变量

  • 任务或角色中的步骤

  • 在堆栈中向上或向下移动

查看 Ray 调试器 了解更多详情。

性能分析#

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

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

跟踪#

为了帮助调试和监控 Ray 应用程序,Ray 支持跨任务和角色的分布式追踪(与 OpenTelemetry 集成)。

更多详情请参见 光线追踪

应用程序日志#

日志对于一般监控和调试非常重要。对于分布式 Ray 应用程序,日志更为重要但同时也更为复杂。Ray 应用程序在驱动程序和工作进程(甚至跨多台机器)上运行,这些进程的日志是应用程序日志的主要来源。

应用程序日志记录

驱动程序日志#

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

工作日志(stdout 和 stderr)#

Ray 在 Ray 的工作进程中远程执行任务或角色。任务和角色的日志会被捕获在工作进程的标准输出和标准错误中。

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

  • Ray 将所有任务和角色的标准输出和标准错误重定向到工作进程的日志文件中,包括工作进程生成的任何日志消息。请参阅 日志目录和文件结构 以了解 Ray 的日志结构。

  • 驱动程序读取工作者的日志文件(所有任务和参与者的标准输出和标准错误所在的位置),并将日志记录发送到其自己的标准输出和标准错误(也称为“工作者的日志被重定向到驱动程序的输出”)。

对于以下代码:

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_foo 运行在一个 Ray 工作进程上。字符串 task! 被保存到相应工作进程的 stdout 日志文件中。

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

当打印日志时,会同时打印进程ID(pid)和执行任务或角色的节点的IP地址。以下是输出:

(pid=45601) task!

默认情况下,演员日志消息如下所示:

(MyActor pid=480956) actor log message

默认情况下,所有任务和参与者的stdout和stderr都会重定向到驱动程序输出。查看 配置日志记录 以了解如何禁用此功能。

作业日志#

Ray 应用程序通常作为 Ray 作业运行。Ray 作业的工作日志始终捕获在 Ray 日志目录 中,而驱动程序日志则不会。

驱动程序日志仅针对通过 作业 API 提交的 Ray 作业捕获。通过仪表板 UI、CLI(使用 ray job logs CLI 命令)或 Python SDK <ray-job-submission-sdk-ref>`(``JobSubmissionClient.get_logs()`JobSubmissionClient.tail_job_logs())查找捕获的驱动程序日志。

备注

如果你通过直接在头节点执行Ray驱动程序或通过Ray客户端连接来运行Ray作业,可以在终端或Jupyter笔记本中查看驱动程序日志。