Ray Tune: 超参数调优#

../_images/tune_overview.png

Tune 是一个用于实验执行和超参数调优的 Python 库,适用于任何规模。你可以通过运行如 基于种群的训练 (PBT)HyperBand/ASHA 等最先进的算法,来调优你喜欢的机器学习框架(PyTorchXGBoostTensorFlow 和 Keras,以及 更多)。Tune 还集成了广泛的额外超参数优化工具,包括 AxBayesOptBOHBNevergrad,和 Optuna

点击以下标签查看各种机器学习框架的代码示例

要运行此示例,请安装以下内容:pip install "ray[tune]"

在这个快速入门示例中,您对一个形式为 f(x) = a**2 + b 的简单函数进行 最小化 ,这是我们的 目标 函数。a 越接近零且 b 越小,f(x) 的总值就越小。我们将为 ab 定义一个所谓的 搜索空间 ,并让 Ray Tune 探索空间以找到好的值。

from ray import train, tune


def objective(config):  # ①
    score = config["a"] ** 2 + config["b"]
    return {"score": score}


search_space = {  # ②
    "a": tune.grid_search([0.001, 0.01, 0.1, 1.0]),
    "b": tune.choice([1, 2, 3]),
}

tuner = tune.Tuner(objective, param_space=search_space)  # ③

results = tuner.fit()
print(results.get_best_result(metric="score", mode="min").config)

① 定义一个目标函数。

② 定义搜索空间。

③ 启动一个 Tune 运行并打印最佳结果。

要使用 Hyperopt 调整您的 Keras 模型,您可以将模型包装在一个目标函数中,该函数的 config 可用于选择超参数。在下面的示例中,我们仅调整模型第一层的 activation 参数,但您可以调整模型中的任何参数。定义搜索空间后,您可以简单地初始化 HyperOptSearch 对象并将其传递给 run。重要的是要告诉 Ray Tune 您想要优化的指标以及您希望最大化还是最小化它。

from ray import tune
from ray.tune.search.hyperopt import HyperOptSearch
import keras


def objective(config):  # ①
    model = keras.models.Sequential()
    model.add(keras.layers.Dense(784, activation=config["activation"]))
    model.add(keras.layers.Dense(10, activation="softmax"))

    model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
    # model.fit(...)
    # loss, accuracy = model.evaluate(...)
    return {"accuracy": accuracy}


search_space = {"activation": tune.choice(["relu", "tanh"])}  # ②
algo = HyperOptSearch()

tuner = tune.Tuner(  # ③
    objective,
    tune_config=tune.TuneConfig(
        metric="accuracy",
        mode="max",
        search_alg=algo,
    ),
    param_space=search_space,
)
results = tuner.fit()

① 将 Keras 模型封装在目标函数中。

② 定义搜索空间并初始化搜索算法。

③ 启动一个最大化准确率的 Tune 运行。

要使用 Optuna 调整您的 PyTorch 模型,您可以将模型包装在一个目标函数中,该函数的 config 可以用于选择超参数。在下面的示例中,我们仅调整模型优化器的 momentum 和学习率 (lr) 参数,但您可以调整任何其他您想要的模型参数。定义搜索空间后,您可以简单地初始化 OptunaSearch 对象并将其传递给 run。重要的是要告诉 Ray Tune 您想要优化的指标以及您是希望最大化还是最小化它。我们在 5 次迭代后停止调整此训练运行,但您也可以轻松定义其他停止规则。

import torch
from ray import train, tune
from ray.tune.search.optuna import OptunaSearch


def objective(config):  # ①
    train_loader, test_loader = load_data()  # Load some data
    model = ConvNet().to("cpu")  # Create a PyTorch conv net
    optimizer = torch.optim.SGD(  # Tune the optimizer
        model.parameters(), lr=config["lr"], momentum=config["momentum"]
    )

    while True:
        train_epoch(model, optimizer, train_loader)  # Train the model
        acc = test(model, test_loader)  # Compute test accuracy
        train.report({"mean_accuracy": acc})  # Report to Tune


search_space = {"lr": tune.loguniform(1e-4, 1e-2), "momentum": tune.uniform(0.1, 0.9)}
algo = OptunaSearch()  # ②

tuner = tune.Tuner(  # ③
    objective,
    tune_config=tune.TuneConfig(
        metric="mean_accuracy",
        mode="max",
        search_alg=algo,
    ),
    run_config=train.RunConfig(
        stop={"training_iteration": 5},
    ),
    param_space=search_space,
)
results = tuner.fit()
print("Best config is:", results.get_best_result().config)

① 将 PyTorch 模型封装在目标函数中。

② 定义搜索空间并初始化搜索算法。

③ 启动一个Tune运行,最大化平均准确率并在5次迭代后停止。

使用 Tune,你还可以在不到 10 行代码中启动一个多节点的 分布式超参数扫描。并且你可以使用 Ray Serve 在同一基础设施上将模型从训练迁移到服务。

入门指南

在我们的入门教程中,您将学习如何使用 Tune 有效地调整 PyTorch 模型。

关键概念

理解 Ray Tune 背后的关键概念。了解调优运行、搜索算法、调度器和其他功能。

用户指南

我们的指南向您介绍Tune的关键功能,例如分布式训练或提前停止。

示例

在我们的示例中,您可以找到使用框架(如 scikit-learn、Keras、TensorFlow、PyTorch 和 mlflow)以及最先进的搜索算法集成的实用教程。

Ray Tune 常见问题

在我们的详细常见问题解答中找到常见问题的答案。

Ray Tune API

获取更多关于 Ray Tune API 的深入信息,包括搜索空间、算法和训练配置的全部内容。

为什么选择 Tune?#

还有很多其他的超参数优化库。如果你是Tune的新手,你可能会问,“是什么让Tune与众不同?”

尖端优化算法

作为用户,您可能正在研究超参数优化,因为您希望快速提高模型性能。

Tune 使您能够利用各种这些前沿的优化算法,通过 提前终止不良运行 来降低调优成本,选择更好的参数进行评估,甚至 在训练过程中调整超参数 以优化计划。

一流的开发者生产力

许多超参数优化框架的一个关键问题是需要重构代码以适应框架。使用 Tune,您只需 添加几行代码 即可优化您的模型。

此外,Tune 简化了你的代码训练工作流程中的样板代码,支持 多种实验结果存储选项(NFS、云存储)将结果记录到工具 如 MLflow 和 TensorBoard,同时具有高度的可定制性。

开箱即用的多GPU与分布式训练

超参数调优以耗时著称,因此通常需要并行化这一过程。大多数其他调优框架要求你实现自己的多进程框架或构建自己的分布式系统以加速超参数调优。

然而,Tune 允许你透明地 在多个GPU和多个节点上并行化。Tune 甚至无缝支持 容错和云支持,使你能够通过使用廉价的抢占式实例,将超参数搜索规模扩大100倍,同时将成本降低多达10倍。

来自另一个超参数优化工具?

您可能已经在使用现有的超参数调优工具,例如 HyperOpt 或贝叶斯优化。

在这种情况下,Tune 实际上允许您增强现有的工作流程。Tune 的 搜索算法 与多种流行的超参数调优库集成(参见 示例),并允许您无缝扩展优化过程——而不会牺牲性能。

使用 Tune 的项目#

以下是一些利用 Tune 的流行开源仓库和研究项目。欢迎提交拉取请求,添加(或请求移除!)列出的项目。

  • Softlearning: Softlearning 是一个用于在连续领域中训练最大熵策略的强化学习框架。包括 Soft Actor-Critic 算法的官方实现。

  • Flambe: 一个用于加速研究及其生产路径的机器学习框架。参见 flambe.ai

  • 基于种群的增强: 基于种群的增强 (PBA) 是一种算法,能够快速高效地学习用于神经网络训练的数据增强函数。PBA 在 CIFAR 上达到了与最先进结果相匹配的效果,且计算量减少了千倍。

  • Fast AutoAugment by Kakao: Fast AutoAugment(被 NeurIPS 2019 接受)通过基于密度匹配的更高效的搜索策略来学习增强策略。

  • Allentune: AllenAI 为 AllenNLP 提供的超参数搜索。

  • machinable: 一个用于机器学习研究的模块化配置系统。参见 machinable.org

  • NeuroCard: NeuroCard(被VLDB 2021接受)是一个用于多表连接查询的神经基数估计器。它使用最先进的深度密度模型来学习关系数据库表之间的相关性。

了解更多关于 Ray Tune#

以下是关于 Ray Tune 的博客文章和演讲:

引用 Tune#

如果 Tune 对你的学术研究有帮助,我们鼓励你引用 我们的论文。以下是一个 bibtex 示例:

@article{liaw2018tune,
    title={Tune: A Research Platform for Distributed Model Selection and Training},
    author={Liaw, Richard and Liang, Eric and Nishihara, Robert
            and Moritz, Philipp and Gonzalez, Joseph E and Stoica, Ion},
    journal={arXiv preprint arXiv:1807.05118},
    year={2018}
}