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
Copy

期待される出力はこのようになります:

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)
Copy

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)
Copy

制限事項

ベイズ最適化は、一様サンプリング関数でのみ機能します。ベイズ最適化は代用モデルとしてガウス過程に依存しているため、連続的な検索空間を必要とします。 tune.randint または tune.choice メソッドでサンプルされた離散パラメーターとは互換性がありません。この制限を回避するには、 tune.uniform を使い、パラメーターを学習関数内にキャストするか、 tune.RandomSearch のような、離散空間と連続空間の両方を扱うサンプリングアルゴリズムに切り替えます。

トラブルシューティング

エラーメッセージ

考えられる原因

考えられる解決策

無効な探索空間の構成: BayesOpt は、すべてのサンプリング関数が 'Uniform' タイプであることを要求しています。

ベイズ最適化は一様サンプリングでのみ機能し、離散サンプルでは機能しません。(上記の 制限事項 をご参照ください)

  • tune.uniform を使用して、結果をトレーニング関数にキャストします。

  • 離散サンプルと非離散サンプルの両方を受け付ける RandomSearch アルゴリズムに切り替えます。

CPU リソースが不十分です。必須16、可用性: 8.CPU または GPU をご参照ください。必要なリソースの数と可用性は異なる場合があります。

max_concurrent_trials は可用性より高い値にセットされます。

エラーメッセージの全文には、試せるいくつかのオプションが記載されています。