Ray Tune 持久化存储配置#
另请参阅
在深入了解存储选项之前,您可以查看Tune 存储的数据类型。
Tune 允许您配置持久化存储选项,以便在分布式 Ray 集群中实现以下用例:
Trial 级别的容错:当 Trial 被恢复时(例如,在节点故障后或实验暂停时),它们可能会被调度到不同的节点上,但仍然需要访问其最新的 checkpoint。
实验级别的容错:为了恢复整个实验(例如,集群意外崩溃),Tune 需要能够访问最新的实验状态以及所有 Trial 的 checkpoint,以便从实验中断处继续执行。
实验后分析:一个存储所有 Trial 数据的统一位置,对于实验后分析非常有用,例如在集群已终止后访问最佳 checkpoint 和超参数配置。
与下游服务/批量推理任务对接:通过配置好的存储,您可以轻松访问 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 找到,以便进一步处理。
注意
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_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 找到,以便进一步处理。
多节点集群上(已弃用)#
警告
当在多个节点上运行时,使用 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_unfinished、resume_errored 和 restart_errored。有关更多详细信息,请参阅 restore() 的文档。
高级配置#
请参阅 Ray Train 关于高级存储配置的部分。所有这些配置也适用于 Ray Tune。