Ray 分布式调试器#

Ray 分布式调试器是一个 VS Code 扩展,它通过交互式调试体验简化了调试过程。Ray 调试器使您能够:

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

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

Ray 分布式调试器抽象了调试分布式系统的复杂性,使您能够更高效地调试 Ray 应用程序,从而节省开发工作流程中的时间和精力。

设置环境#

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

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

启动一个 Ray 集群#

运行 ray start --head 以启动一个 Ray 集群。

注册集群#

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

../_images/register-cluster.gif

创建一个 Ray 任务#

创建一个包含以下代码片段的 job.py 文件。添加 RAY_DEBUG 环境变量以启用 Ray 调试器,并在 Ray 任务中添加 breakpoint()

import ray
import sys

# Add RAY_DEBUG environment variable to enable Ray Debugger.
ray.init(
    runtime_env={
        "env_vars": {"RAY_DEBUG": "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 应用。

事后调试#

当 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 调试