Ray Tuneについて整理
概要
機械学習のハイパーパラメータ最適化ツールである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
探索するハイパーパラメータの範囲を設定。
サンプリングする範囲を指定したり、グリッドサーチを行うこともできる。
設定例の一覧。
tune_config
設定がたくさんあるので個別に見ていきます。
search_alg
特に指定しないとrandom searchになる。
アルゴリズムの一覧。
それぞれのアルゴリズムの良し悪しについては調べる必要がありそう。
scheduler
特に指定しないと順番に行うだけのFIFOスケジューラになる。
指定することで実行中のトレーニングを停止、一時停止、微調整などすることができる。
スケジューラの一覧。
よく分からなかったら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