分散トレーニング¶
Snowflake Container Runtimeは、Snowflakeのインフラストラクチャ上でモデルをトレーニングするために使用できる柔軟なトレーニング環境を提供します。オープンソースパッケージを使用することもできますし、Snowflake ML 分散トレーナーを使用して、マルチノードおよびマルチデバイスのトレーニングを行うこともできます。
分散トレーナーは、機械学習のワークロードを複数のノードと GPUs に自動的にスケーリングします。Snowflakeディストリビューターは、複雑な構成を必要とせずにクラスターリソースをインテリジェントに管理し、分散トレーニングを利用しやすく効率的にします。
以下を行う場合に標準的なオープンソースライブラリを使用する
シングルノード環境で小さなデータセットを扱う
モデルの迅速な試作と実験を行う
分散要件なしでワークフローをリフトアンドシフトする
Snowflake分散トレーナーを使用する目的
1つのコンピュートノードのメモリよりも大きなデータセットでモデルをトレーニングする
複数の GPUs を効率的に活用する
すべてのコンピュートマルチノード MLJobs またはスケーリングされたノートブッククラスターを自動的に活用する
Snowflake ML 分散トレーニング¶
Snowflake ML は、 XGBoost 、 LightGBM 、 PyTorch を含む一般的な機械学習フレームワーク用の分散トレーナーを提供します。これらのトレーナーは、Snowflakeのインフラ上で動作するように最適化されており、複数のノードと GPUs にわたって自動的にスケーリングできます。
自動リソース管理 - Snowflakeは、利用可能なすべてのクラスターリソースを自動的に検出して使用します
簡素化されたセットアップ - Container Runtime環境は、Snowflakeが提供するRayクラスターによってサポートされており、ユーザーによる構成は不要です
シームレスなSnowflake統合 - Snowflakeデータコネクタおよびステージと直接互換性があります
オプションのスケーリング構成 - 上級ユーザーは必要に応じて微調整が可能です
データのロード¶
オープンソースとSnowflake分散トレーナーの両方で、データを取り込む最もパフォーマンスの高い方法は、Snowflake Data Connectorを使用することです。
トレーニング方法¶
オープンソーストレーニング¶
最大限の柔軟性とトレーニングプロセスの制御が必要な場合は、標準的なオープンソースライブラリを使用します。オープンソーストレーニングでは、Snowflakeのインフラとデータ接続の恩恵を受けながら、 XGBoost 、 LightGBM 、 PyTorch のような一般的な ML フレームワークを最小限の変更で直接使用できます。
以下の例では、 XGBoost と LightGBM を用いてモデルをトレーニングしています。
オープンソースの XGBoost でトレーニングするには、データコネクタでデータをロードした後、それをpandasデータフレームに変換し、 XGB ライブラリを直接使用します。
分散トレーニング¶
分散 XGBEstimator クラスには同様の API がありますが、いくつかの重要な違いがあります。
XGBoost トレーニングパラメーターは、「params」パラメーターを通して、クラス初期化時に
XGBEstimatorに渡されます。DataConnector オブジェクトは、機能を定義する入力列とターゲットを定義するラベル列とともに、推定器の
fit関数に直接渡すことができます。XGBEstimatorクラスをインスタンス化する際に、スケーリング構成を指定できます。しかし、Snowflakeはデフォルトで利用可能なすべてのリソースを使用します。
モデルの評価¶
モデルの評価は、 eval_set を渡し、 verbose_eval を使って評価データをコンソールに出力することで行うことができます。さらに、第二段階として推論を行うこともできます。分散推定器は、利便性のために predict メソッドを提供しますが、分散形式で推論を行うことはありません。推論を行い、モデルレジストリにログを記録するために、フィットモデルをトレーニング後に OSS xgboost推定器に変換することを推奨します。
モデルの登録¶
モデルをSnowflakeモデルレジストリに登録するには、 estimator.get_booster によって提供され、 estimator.fit から返されるオープンソースブースターを使用します。詳細については、 XGBoost をご参照ください。
PyTorch¶
Snowflake PyTorch ディストリビューターは、Snowflakeバックエンドの分散データ並列モデルをネイティブにサポートしています。Snowflakeで DDP を使用するには、オープンソースの PyTorch モジュールを活用し、Snowflake固有の修正をいくつか加えます。
ShardedDataConnectorを使用してデータをロードし、分散トレーナーのworld_sizeに一致する数のパーティションにデータを自動的にシャードします。ワーカープロセスに関連付けられたシャードを取得するために、Snowflakeトレーニングコンテキスト内でget_shardを呼び出します。トレーニング関数の内部では、
contextオブジェクトを使用して、ランク、ローカルランク、トレーニングに必要なデータなど、プロセス固有の情報を取得します。コンテキストの
get_model_dirを使用してモデルを保存し、モデルの保管場所を見つけます。これにより、単一ノードのトレーニングではモデルをローカルに保管し、分散トレーニングではモデルをSnowflakeステージに同期します。ステージの場所が指定されていない場合、デフォルトでユーザーステージが使用されます。
データをロード¶
モデルのトレーニング¶
モデルの取得¶
マルチノード DDP を使用している場合、モデルは自動的に共有永続ストレージとしてSnowflakeステージに同期されます。
次のコードはステージからモデルを取得します。artifact_stage_location パラメーターを使用して、モデルの成果物を保管するステージの場所を指定します。
stage_location 変数に保存された関数は、トレーニング完了後のステージにおけるモデルの場所を取得します。モデルの成果物は "DB_NAME.SCHEMA_NAME.STAGE_NAME/model/{request_id}" の下に保存されます。