如何在 Ray Tune 中配置持久化存储#
另请参阅
在深入探讨存储选项之前,您可以先了解一下 Ray Tune 存储的不同类型的数据。
Tune 允许您配置持久化存储选项,以支持在分布式 Ray 集群中的以下使用案例
Trial 级容错:当 Trial 恢复时(例如在节点故障后或实验暂停时),它们可能会被调度到不同的节点上,但仍然需要访问其最新的检查点。
实验级容错:为了恢复整个实验(例如集群意外崩溃),Tune 需要能够访问最新的实验状态以及所有 Trial 的检查点,以便从实验中断的地方继续开始。
实验后分析:一个集中存储所有 Trial 数据的统一位置对于实验后分析非常有用,例如在集群终止后访问最佳检查点和超参数配置。
与下游服务/批量推理任务桥接:配置存储后,您可以轻松访问 Trial 生成的模型和工件,与他人共享或在下游任务中使用它们。
Tune 中的存储选项#
Tune 支持以下三种场景
当使用集群中所有机器都可以访问的云存储时(例如 AWS S3 或 Google Cloud Storage)。
当使用挂载到集群中所有机器的网络文件系统 (NFS) 时。
当在单节点上运行 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_path
和 name
来自定义此设置。
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_unfinished
、resume_errored
和 restart_errored
。有关更多详细信息,请参阅 restore()
的文档。
高级配置#
请参阅Ray Train 关于高级存储配置的部分。所有这些配置也适用于 Ray Tune。