Ray 分布式调试器#

Ray 分布式调试器包含一个调试器后端和一个 VS Code 扩展前端,通过交互式调试体验简化了调试过程。Ray 调试器使您能够

  • 中断远程任务:在任何远程任务中设置断点。断点会暂停执行,并允许您连接到 VS Code 进行调试。

  • 事后调试:当 Ray 任务因未处理的异常而失败时,Ray 会自动冻结失败的任务并等待 Ray 调试器附加,从而允许您检查程序出错时的状态。

Ray 分布式调试器抽象了调试分布式系统的复杂性,让您可以更高效地调试 Ray 应用,节省开发工作流中的时间和精力。

注意

Ray 分布式调试器前端仅在 VS Code 和其他兼容 VS Code 的 IDE(如 Cursor)中可用。如果您需要其他 IDE 的支持,请在 GitHub 上提交功能请求。

设置环境#

创建新的虚拟环境并安装依赖项。

conda create -n myenv python=3.9
conda activate myenv
pip install "ray[default]" debugpy

启动 Ray 集群#

运行 ray start --head 启动本地 Ray 集群。

按照RayCluster 快速入门中的说明设置集群。您需要将 VS Code 连接到集群。例如,将以下内容添加到 ray-head 容器,并确保 sshdray-head 容器中运行。

ports:
- containerPort: 22
  name: ssd

注意

如何在 ray-head 容器中运行 sshd 取决于您的设置。例如,您可以使用 supervisord。一种简单的交互式运行 sshd 进行测试的方法是登录到头节点 Pod 并运行

sudo apt-get install openssh-server
sudo mkdir -p /run/sshd
sudo /usr/sbin/sshd -D

然后您可以通过运行以下命令通过 SSH 连接到集群

kubectl port-forward service/raycluster-sample-head-svc 2222:22

检查 ssh -p 2222 ray@localhost 可用后,按照VS Code SSH 文档中的说明设置 VS Code。

注册集群#

在 VS Code 左侧导航栏中找到并点击 Ray 扩展。将 Ray 集群 IP:PORT 添加到集群列表。默认的 IP:PORT127.0.0.1:8265。启动集群时可以更改它。请确保您的当前机器可以访问该 IP 和端口。

../_images/register-cluster.gif

创建 Ray 任务#

创建文件 job.py,其中包含以下代码片段。在 Ray 任务中添加 breakpoint()。如果您想使用下面的事后调试,还需要添加 RAY_DEBUG_POST_MORTEM=1 环境变量。

import ray
import sys

# Add the RAY_DEBUG_POST_MORTEM=1 environment variable
# if you want to activate post-mortem debugging
ray.init(
    runtime_env={
        "env_vars": {"RAY_DEBUG_POST_MORTEM": "1"},
    }
)


@ray.remote
def my_task(x):
    y = x * x
    breakpoint()  # Add a breakpoint in the Ray task.
    return y


@ray.remote
def post_mortem(x):
    x += 1
    raise Exception("An exception is raised.")
    return x


if len(sys.argv) == 1:
    ray.get(my_task.remote(10))
else:
    ray.get(post_mortem.remote(10))

运行您的 Ray 应用#

开始运行您的 Ray 应用。

python job.py

附加到暂停的任务#

当调试器命中断点时

  • 任务进入暂停状态。

  • 终端会清晰地指示调试器何时暂停任务并等待调试器附加。

  • 暂停的任务会列在 Ray Debugger 扩展中。

  • 点击暂停任务名称旁边的播放图标,附加 VS Code 调试器。

../_images/attach-paused-task.gif

开始和停止调试#

像在本地开发时一样调试您的 Ray 应用。完成当前断点的调试后,点击调试工具栏中的断开连接按钮,以便您可以加入暂停的任务列表中的其他任务。

../_images/debugger-disconnect.gif

事后调试#

当 Ray 任务遇到未处理的异常时,请使用事后调试。在这种情况下,Ray 会自动冻结失败的任务,等待 Ray 调试器附加。此功能允许您在出错时彻底检查和检查程序的状态。

运行一个抛出异常的 Ray 任务#

运行同一个 job.py 文件,并添加一个额外的参数以抛出异常。

python job.py raise-exception

附加到暂停的任务#

当应用抛出异常时

  • 调试器冻结任务。

  • 终端会清晰地指示调试器何时暂停任务并等待调试器附加。

  • 暂停的任务会列在 Ray Debugger 扩展中。

  • 点击暂停任务名称旁边的播放图标,附加调试器并开始调试。

../_images/post-moretem.gif

开始调试#

像在本地开发时一样调试您的 Ray 应用。

分享反馈#

加入 Ray Slack 频道上的 #ray-debugger 频道以获得帮助。

下一步#

  • 有关在 Ray 中调试分布式应用的指南,请参阅通用调试

  • 有关使用 Ray 调试器的技巧,请参阅Ray 调试