性能分析#

剖析是诊断性能、内存不足、挂起或其他应用程序问题的最重要的调试工具之一。以下是调试Ray应用程序时可能使用的一些常见剖析工具列表。

  • CPU 分析

    • py-spy

  • 内存分析

    • memray

  • GPU 分析

    • PyTorch 分析器

    • Nsight 系统

  • Ray 任务 / 执行者时间线

如果 Ray 与某些分析工具不兼容,尝试在没有 Ray 的情况下运行它们以调试问题。

CPU 分析#

分析驱动程序和工作进程的CPU使用情况。这有助于您了解不同进程的CPU使用情况,并调试意外的高或低使用率。

py-spy#

py-spy 是一个用于 Python 程序的采样分析器。Ray Dashboard 与 pyspy 有原生集成:

  • 它允许你可视化你的Python程序在哪些方面花费了时间,而无需重新启动程序或以任何方式修改代码。

  • 它转储运行进程的堆栈跟踪,以便您可以看到进程在某个时间点正在做什么。当程序挂起时,这非常有用。

备注

在使用 py-spy 时,您可能会遇到权限错误。要解决此问题:

  • 如果你在Docker容器中手动启动Ray,请按照 py-spy文档_ 来解决这个问题。

  • 如果你是 KubeRay 用户,请按照 配置 KubeRay 的指南 来解决问题。

以下是使用 py-spy 与 Ray 和 Ray Dashboard 的 步骤

cProfile#

cProfile 是 Python 的原生分析模块,用于分析您的 Ray 应用程序的性能。

以下是使用 cProfile 的步骤

内存分析#

分析驱动程序和工作进程的内存使用情况。这有助于您分析应用程序中的内存分配,追踪内存泄漏,并调试高/低内存或内存不足问题。

memray#

memray 是一个 Python 的内存分析器。它可以跟踪 Python 代码、本地扩展模块以及 Python 解释器本身的内存分配。

以下是 分析 Ray 任务和参与者内存使用情况的步骤

Ray 仪表盘视图#

你现在可以通过点击 Ray Dashboard 中活动 Worker 进程、任务、角色和作业的驱动进程的“内存分析”操作,为 Ray 驱动程序或 Worker 进程进行内存分析。

内存分析操作

此外,您可以从仪表板视图指定以下 Memray 分析参数:

  • 格式: 分析结果的格式。值可以是“flamegraph”或“table”

  • 持续时间: 跟踪的持续时间(以秒为单位)

  • 泄漏: 启用内存泄漏视图,该视图显示 Ray 未释放的内存,而不是峰值内存使用量

  • 本地代码: 跟踪本地 (C/C++) 堆栈帧 (仅在 Linux 上支持)

  • Python 分配器追踪: 记录由 pymalloc 分配器进行的分配

GPU 分析#

GPU 和 GRAM 分析用于您的 GPU 工作负载,如分布式训练。这有助于您分析性能和调试内存问题。

  • 当与 Ray Train 一起使用时,PyTorch 分析器是开箱即用的。

  • NVIDIA Nsight System 在 Ray 上原生支持。

PyTorch 分析器#

PyTorch Profiler 是一个工具,允许在训练和推理期间收集性能指标(特别是GPU指标)。

以下是使用 PyTorch Profiler 与 Ray Train 或 Ray Data 的 步骤

Nsight 系统分析器#

安装#

首先,按照 Nsight 用户指南 安装 Nsight System CLI。

确认你已正确安装 Nsight:

$ nsys --version

# NVIDIA Nsight Systems version 2022.4.1.21-0db2c85

在 Ray 上运行 Nsight#

要启用GPU分析,请在 runtime_env 中按如下方式指定配置:

import torch
import ray

ray.init()

@ray.remote(num_gpus=1, runtime_env={ "nsight": "default"})
class RayActor:
    def run():
    a = torch.tensor([1.0, 2.0, 3.0]).cuda()
    b = torch.tensor([4.0, 5.0, 6.0]).cuda()
    c = a * b

    print("Result on GPU:", c)

ray_actor = RayActor.remote()
# The Actor or Task process runs with : "nsys profile [default options] ..."
ray.get(ray_actor.run.remote())

你可以在 nsight.py 中找到 "default" 配置。

自定义选项#

你也可以通过指定一个选项值的字典来为 Nsight System Profiler 添加 自定义选项,这将覆盖 默认 配置,然而,Ray 保留了默认配置的 --output 选项。

import torch
import ray

ray.init()

@ray.remote(
num_gpus=1, 
runtime_env={ "nsight": {
    "t": "cuda,cudnn,cublas",
    "cuda-memory-usage": "true",
    "cuda-graph-trace": "graph",
}})
class RayActor:
    def run():
    a = torch.tensor([1.0, 2.0, 3.0]).cuda()
    b = torch.tensor([4.0, 5.0, 6.0]).cuda()
    c = a * b

    print("Result on GPU:", c)

ray_actor = RayActor.remote()

# The Actor or Task process runs with :
# "nsys profile -t cuda,cudnn,cublas --cuda-memory-usage=True --cuda-graph-trace=graph ..."
ray.get(ray_actor.run.remote())

注意: 默认的报告文件名 (-o, --output) 是日志目录中的 worker_process_{pid}.nsys-rep

性能分析结果#

/tmp/ray/session_*/logs/{profiler_name} 目录下查找分析结果。此特定目录位置未来可能会更改。您可以从 Ray 仪表盘 下载分析报告。

Nsight System Profiler 文件夹

要可视化结果,请在您的笔记本电脑上安装 Nsight System GUI,它将成为主机。将 .nsys-rep 文件传输到您的主机并使用 GUI 打开它。现在您可以查看可视化的性能分析信息。

注意:Nsight System Profiler 输出(-o, –output)选项允许您设置文件路径。Ray 使用日志目录作为基础,并将输出选项附加到其上。例如:

--output job_name/ray_worker -> /tmp/ray/session_*/logs/nsight/job_name/ray_worker

--output /Users/Desktop/job_name/ray_worker -> /Users/Desktop/job_name/ray_worker

最佳实践是在输出选项中仅指定文件名。

Ray 任务或参与者时间线#

Ray Timeline 记录了 Ray 任务和角色的执行时间。这有助于你分析性能,识别滞后者,并理解工作负载的分布。

在 Ray 仪表盘中打开您的 Ray 作业,并按照 下载和可视化 Ray Timeline 生成的跟踪文件的说明