🧭

Ray Tuneについて整理

2023/12/10に公開

概要

https://docs.ray.io/en/latest/tune/index.html
機械学習のハイパーパラメータ最適化ツールであるRay Tuneについて調査しました。

機械学習では複数のハイパーパラメータを設定して学習を行いますが、どの調整が最適なのか見つけ出す必要があります。

その際、闇雲に値をセットして調査しても無駄が多く効率が悪いです。

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.Tunerインスタンスを作成してfitメソッドを呼びます。
tune.Tunerのイニシャライザ引数には以下のものがあります。

  • trainable
    訓練を行うための関数。

  • param_space
    調査したいハイパーパラメータの範囲。

  • tune_config
    チューニングに関連する様々な設定。
    どのメトリクスを参考にチューニングを行うか、設定値のサーチアルゴリズムの選択など。
    スケジューラの設定をすることで結果の出なそうな訓練の打ち切り等もできる。

  • run_config
    ランタイム設定。
    実行するチューニングに名前をつけたりできる。

パラメータの詳細

それぞれのパラメータについて大事そうな部分をまとめます。

trainable

訓練を行うための関数またはクラス。

訓練コード内のループで以下のように訓練中に計測したメトリクスを報告する。
また訓練完了後にスコアをreturnする事もできる。

from ray import train

for トレーニングループ:
	...
	train.report({"score": score})

return {"score": score}

param_space

探索するハイパーパラメータの範囲を設定。
サンプリングする範囲を指定したり、グリッドサーチを行うこともできる。

https://docs.ray.io/en/latest/tune/api/search_space.html#tune-search-space
設定例の一覧。

tune_config

設定がたくさんあるので個別に見ていきます。

search_alg

特に指定しないとrandom searchになる。

https://docs.ray.io/en/latest/tune/key-concepts.html#tune-search-algorithms
アルゴリズムの一覧。

それぞれのアルゴリズムの良し悪しについては調べる必要がありそう。

scheduler

特に指定しないと順番に行うだけのFIFOスケジューラになる。

指定することで実行中のトレーニングを停止、一時停止、微調整などすることができる。

https://docs.ray.io/en/latest/tune/api/schedulers.html
スケジューラの一覧。

よく分からなかったらASHASchedulerを指定することで、うまくいかなそうな訓練を早期停止してくれる。

tuner.fit()の戻り値について

results = tuner.fit()

best_result = results.get_best_result()  # Get best result object
best_config = best_result.config  # Get best trial's hyperparameters
best_logdir = best_result.path  # Get best trial's result directory
best_checkpoint = best_result.checkpoint  # Get best trial's best checkpoint
best_metrics = best_result.metrics  # Get best trial's last results
best_result_df = best_result.metrics_dataframe  # Get best result as pandas dataframe

fitの戻り値には様々な情報が詰まっている。

まとめ

LLMの訓練など、機械学習ではやたらと計算資源を使うものもあるのでこういったツールを使った効率化はすごく重要になりそう。

Discussion