如何在 Ray Tune 中配置持久化存储#

另请参阅

在深入探讨存储选项之前,您可以先了解一下 Ray Tune 存储的不同类型的数据

Tune 允许您配置持久化存储选项,以支持在分布式 Ray 集群中的以下使用案例

  • Trial 级容错:当 Trial 恢复时(例如在节点故障后或实验暂停时),它们可能会被调度到不同的节点上,但仍然需要访问其最新的检查点。

  • 实验级容错:为了恢复整个实验(例如集群意外崩溃),Tune 需要能够访问最新的实验状态以及所有 Trial 的检查点,以便从实验中断的地方继续开始。

  • 实验后分析:一个集中存储所有 Trial 数据的统一位置对于实验后分析非常有用,例如在集群终止后访问最佳检查点和超参数配置。

  • 与下游服务/批量推理任务桥接:配置存储后,您可以轻松访问 Trial 生成的模型和工件,与他人共享或在下游任务中使用它们。

Tune 中的存储选项#

Tune 支持以下三种场景

  1. 当使用集群中所有机器都可以访问的云存储时(例如 AWS S3 或 Google Cloud Storage)。

  2. 当使用挂载到集群中所有机器的网络文件系统 (NFS) 时。

  3. 当在单节点上运行 Tune 并使用本地文件系统作为持久化存储位置时。

注意

可以为单节点实验配置网络文件系统或云存储。如果您运行实验的实例在终止后会清除其本地存储,这对于将实验结果持久化到外部存储中非常有用。

另请参阅

有关完整的配置选项集和更多详细信息,请参阅 SyncConfig

使用云存储(AWS S3、Google Cloud Storage)配置 Tune#

如果 Ray 集群中的所有节点都可以访问云存储,例如 AWS S3 或 Google Cloud Storage (GCS),则所有实验输出都可以保存在共享云存储桶中。

我们可以通过告诉 Ray Tune 上传到远程 storage_path 来配置云存储

from ray import tune

tuner = tune.Tuner(
    trainable,
    run_config=tune.RunConfig(
        name="experiment_name",
        storage_path="s3://bucket-name/sub-path/",
    )
)
tuner.fit()

在此示例中,所有实验结果都可以在共享存储的 s3://bucket-name/sub-path/experiment_name 位置找到,以便进一步处理。

注意

头节点将无法在本地访问所有实验结果。如果您想进一步处理例如最佳检查点,您必须首先从云存储中将其取回。

实验恢复也应使用云存储 URI 处的实验目录进行,而不是头节点上的本地实验目录。请参阅此处示例

使用网络文件系统 (NFS) 配置 Tune#

如果所有 Ray 节点都可以访问网络文件系统,例如 AWS EFS 或 Google Cloud Filestore,它们都可以将实验输出写入此目录。

我们只需将共享网络文件系统设置为保存结果的路径

from ray import tune

tuner = tune.Tuner(
    trainable,
    run_config=tune.RunConfig(
        name="experiment_name",
        storage_path="/mnt/path/to/shared/storage/",
    )
)
tuner.fit()

在此示例中,所有实验结果都可以在共享存储的 /path/to/shared/storage/experiment_name 位置找到,以便进一步处理。

不使用外部持久化存储配置 Tune#

在单节点集群上#

如果您只在单节点上运行实验(例如在笔记本电脑上),Tune 将使用本地文件系统作为检查点和其他工件的默认存储位置。默认情况下,结果保存在 ~/ray_results 中的一个唯一的自动生成名称的子目录中,除非您通过 RunConfig 中的 storage_pathname 来自定义此设置。

from ray import tune

tuner = tune.Tuner(
    trainable,
    run_config=tune.RunConfig(
        storage_path="/tmp/custom/storage/path",
        name="experiment_name",
    )
)
tuner.fit()

在此示例中,所有实验结果都可以在本地 /tmp/custom/storage/path/experiment_name 位置找到,以便进一步处理。

在多节点集群上 (已弃用)#

警告

在多节点上运行时,使用头节点的本地文件系统作为持久化存储位置是已弃用的。如果您保存 Trial 检查点并在多节点集群上运行,如果未设置 NFS 或云存储,Tune 将默认引发错误。有关更多信息,请参阅此问题

示例#

让我们展示一些配置存储位置和同步选项的示例。我们还将演示如何在每个示例中恢复实验,以防实验中断。有关恢复实验的更多信息,请参阅如何在 Ray Tune 中启用容错

在每个示例中,我们将实际解释如何在集群和外部存储位置(如果提供)之间保存Trial 检查点。有关 Tune 需要持久化的其他实验数据的概览,请参阅附录:Ray Tune 存储的数据类型

示例:使用云存储运行 Tune#

假设您正在 Ray 集群的头节点上运行此示例脚本。

在下面的示例中,my_trainable 是一个实现了保存和加载检查点的 Tune Trainable

import os
import ray
from ray import tune
from your_module import my_trainable


tuner = tune.Tuner(
    my_trainable,
    run_config=tune.RunConfig(
        # Name of your experiment
        name="my-tune-exp",
        # Configure how experiment data and checkpoints are persisted.
        # We recommend cloud storage checkpointing as it survives the cluster when
        # instances are terminated and has better performance.
        storage_path="s3://my-checkpoints-bucket/path/",
        checkpoint_config=tune.CheckpointConfig(
            # We'll keep the best five checkpoints at all times
            # (with the highest AUC scores, a metric reported by the trainable)
            checkpoint_score_attribute="max-auc",
            checkpoint_score_order="max",
            num_to_keep=5,
        ),
    ),
)
# This starts the run!
results = tuner.fit()

在此示例中,Trial 检查点将保存到:s3://my-checkpoints-bucket/path/my-tune-exp/<trial_name>/checkpoint_<step>

如果此次运行因任何原因停止(例如用户按下 CTRL+C,因内存不足而终止),您可以随时从云中保存的实验状态恢复它

from ray import tune
tuner = tune.Tuner.restore(
    "s3://my-checkpoints-bucket/path/my-tune-exp",
    trainable=my_trainable,
    resume_errored=True,
)
tuner.fit()

恢复实验有几种选项:resume_unfinishedresume_erroredrestart_errored。有关更多详细信息,请参阅 restore() 的文档。

高级配置#

请参阅Ray Train 关于高级存储配置的部分。所有这些配置也适用于 Ray Tune。