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

参见

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

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

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

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

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

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

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
from ray.train import RunConfig

tuner = tune.Tuner(
    trainable,
    run_config=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 train, tune

tuner = tune.Tuner(
    trainable,
    run_config=train.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
from ray.train import RunConfig

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

在这个例子中,所有实验结果可以在本地 /tmp/custom/storage/path/experiment_name 找到,以便进一步处理。

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

警告

在多节点运行时,使用头节点的本地文件系统作为持久存储位置是 不推荐的。如果你保存试验检查点并在多节点集群上运行,如果没有设置NFS或云存储,Tune默认会抛出错误。更多信息请参见 此问题

示例#

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

在每个示例中,我们将提供一个实际的解释,说明 trial checkpoints 如何在集群中保存以及外部存储位置(如果提供了的话)。有关 Tune 需要持久化的其他实验数据的概述,请参见 附录:Tune 存储的数据类型

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

让我们假设你正在从 Ray 集群的头节点运行这个示例脚本。

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

import os
import ray
from ray import train, tune
from your_module import my_trainable


tuner = tune.Tuner(
    my_trainable,
    run_config=train.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=train.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()

在这个例子中,试验检查点将被保存到: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。