Container Runtimeによる並列ハイパーパラメーター最適化(HPO) ML¶
Snowflake ML Hyperparameter Optimization (HPO) API は、一般的なチューニングアルゴリズムを使用した、効率的で並列化されたモデルのハイパーパラメータチューニングを可能にする、モデルに依存しないフレームワークです。
今日、この API は、Snowpark Container Services (SPCS) のContainer Runtimeを使用するように構成された Snowflake Notebooks 内で使用できます。 このようなノートブック を作成したら、次のことができます。
任意のオープンソースパッケージを使用してモデルをトレーニングし、この API を使用してハイパーパラメーターのチューニングプロセスを配布します。
Snowflake ML 分散トレーニング APIs を使用してモデルをトレーニングし、 HPO をスケーリングしながら、トレーニングの各実行もスケーリングします。
Notebookから開始された HPO ワークロードは、 CPU または GPU インスタンス上の Snowpark Container Services 内部で実行され、 SPCS コンピュートプールの単一ノードで利用可能なコア(CPUs または GPUs)までスケールアウトします。
並列化された HPO API には、以下のようなメリットがあります:
単一の API は、複数のリソースにトレーニングを分配する複雑な作業をすべて自動的に処理します。
オープンソースの ML フレームワークまたはSnowflake ML モデリング APIs を使用して、仮想的にあらゆるフレームワークやアルゴリズムでトレーニングできます。
様々な連続および非連続サンプリング関数とともに、ベイズおよびランダムサーチアルゴリズムを含む、チューニングおよびサンプリングオプションの選択
残りのSnowflakeの緊密な統合です。例えば、Snowflake DatasetsまたはDataframesを介した効率的なデータインジェストや、 ML の自動リネージキャプチャなどです。
例¶
この例では、まずContainer Runtime DataConnector API を通して Snowflake テーブルからデータを取り込み、次に XGBoost モデルを作成する学習関数を定義することで、 HPO の典型的なユースケースを示します。 Tuner
インターフェイスは、与えられた学習関数と探索空間に基づいて、チューニング機能を提供します。
from snowflake.ml.modeling.tune import get_tuner_context
from snowflake.ml.modeling import tune
# Define a training function, with any models you choose within it.
def train_func():
# A context object provided by HPO API to expose data for the current HPO trial
tuner_context = get_tuner_context()
config = tuner_context.get_hyper_params()
dm = tuner_context.get_dataset_map()
model = xgb.XGBClassifier(**config, random_state=42)
model.fit(dm["x_train"].to_pandas(), dm["y_train"].to_pandas())
accuracy = accuracy_score(
dm["y_train"].to_pandas(), model.predict(dm["x_train"].to_pandas())
)
tuner_context.report(metrics={"accuracy": accuracy}, model=model)
tuner = tune.Tuner(
train_func=train_func,
search_space={
"n_estimators": tune.uniform(50, 200),
"max_depth": tune.uniform(3, 10),
"learning_rate": tune.uniform(0.01, 0.3),
},
tuner_config=tune.TunerConfig(
metric="accuracy",
mode="max",
search_alg=search_algorithm.BayesOpt(),
num_trials=2,
max_concurrent_trials=1,
),
)
tuner_results = tuner.run(dataset_map=dataset_map)
# Access the best result info with tuner_results.best_result
期待される出力はこのようになります:
accuracy should_checkpoint trial_id time_total_s config/learning_rate config/max_depth config/n_estimators
1.0 True ec632254 7.161971 0.118617 9.655 159.799091
tuner_results
オブジェクトには、すべての結果、ベストモデル、ベストモデルパスが含まれます。
print(tuner_results.results)
print(tuner_results.best_model)
print(tuner_results.best_model_path)
API の概要¶
HPOAPI は snowflake.ml.modeling.tune
名前空間にあります。主な HPO API は tune.Tuner
クラスです。このクラスをインスタンス化する際には、以下のように指定します:
モデルにフィットする学習関数
ハイパーパラメーターのサンプリング方法を定義する探索空間(
tune.SearchSpace
)検索アルゴリズム、最適化するメトリック、試行回数を定義するチューナー構成オブジェクト(
tune.TunerConfig
)。
Tuner
をインスタンス化した後、その run
メソッドをデータセット・マップ(各入力データセットに対応する DataConnector
を指定する)とともに呼び出し,チューニング・プロセスを開始します.
詳細情報については、以下の Python ステートメントを実行して、各クラスのドキュメントを取得してください:
from snowflake.ml.modeling import tune
help(tune.Tuner)
help(tune.TunerConfig)
help(tune.SearchSpace)
制限事項¶
ベイズ最適化は、一様サンプリング関数でのみ機能します。ベイズ最適化は代用モデルとしてガウス過程に依存しているため、連続的な検索空間を必要とします。 tune.randint
または tune.choice
メソッドでサンプルされた離散パラメーターとは互換性がありません。この制限を回避するには、 tune.uniform
を使い、パラメーターを学習関数内にキャストするか、 tune.RandomSearch
のような、離散空間と連続空間の両方を扱うサンプリングアルゴリズムに切り替えます。
トラブルシューティング¶
エラーメッセージ |
考えられる原因 |
考えられる解決策 |
---|---|---|
無効な探索空間の構成: BayesOpt は、すべてのサンプリング関数が 'Uniform' タイプであることを要求しています。 |
ベイズ最適化は一様サンプリングでのみ機能し、離散サンプルでは機能しません。(上記の 制限事項 をご参照ください) |
|
CPU リソースが不十分です。必須16、可用性: 8.CPU または GPU をご参照ください。必要なリソースの数と可用性は異なる場合があります。 |
|
エラーメッセージの全文には、試せるいくつかのオプションが記載されています。 |