Ray Tune 持久化存储配置#

另请参阅

在深入了解存储选项之前,您可以查看Tune 存储的数据类型

Tune 允许您配置持久化存储选项,以便在分布式 Ray 集群中实现以下用例:

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

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

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

  • 与下游服务/批量推理任务对接:通过配置好的存储,您可以轻松访问 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 找到,以便进一步处理。

注意

Head 节点将无法在本地访问所有实验结果。如果您想进一步处理例如最佳 checkpoint,您将首先需要从云存储中获取它。

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

使用网络文件系统(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 将默认使用本地文件系统作为 checkpoint 和其他构件的存储位置。默认情况下,结果将保存到 ~/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 找到,以便进一步处理。

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

警告

当在多个节点上运行时,使用 Head 节点本地文件系统作为持久化存储位置是 *已弃用* 的。如果您保存 Trial checkpoint 并在多节点集群上运行,默认情况下,如果未设置 NFS 或云存储,Tune 将会报错。有关更多信息,请参阅此 issue

示例#

下面我们通过一些示例来展示如何配置存储位置和同步选项。此外,我们还将展示如何在实验中断的情况下恢复实验。有关恢复实验的更多信息,请参阅Ray Tune 如何实现容错

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

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

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

在下面的示例中,my_trainable 是一个实现了 checkpoint 保存和加载的 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 checkpoint 将保存到: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。