Hugging Face Accelerate ライブラリのリリース
Hugging Face は 🤗 Accelerate を導入しました。これは、PyTorch ユーザーが、分散トレーニングや混合精度用のボイラープレートコードを書き直す必要なしに、単一 GPU、マルチ GPU クラスター、TPU など、多様なハードウェア構成上で生のトレーニング・スクリプトを実行できるように設計されたライブラリです。
簡素化された分散トレーニングと混合精度
Accelerate は、デバイスの配置や分散設定の管理という複雑さを取り除きながら、開発者がトレーニング・ループを完全に制御できるようにします。標準的な PyTorch スクリプトにわずかな行数を追加するだけで、ユーザーは DistributedDataParallel や DistributedSampler を手動で実装することなく、単一デバイス構成から分散環境へと移行できます。
技術的な実装とコア API
Accelerate は、コア PyTorch オブジェクトの初期化と準備を抽象化することで動作します。主要なインターフェースは Accelerator クラスです。
初期化
accelerator = Accelerator() は、環境を分析して分散トレーニング実行のタイプを決定し、必要な初期化を行います。ユーザーは、初期化時に cpu=True または fp16=True を渡すことで、CPU トレーニングや混合精度を明示的に強制できます。
prepare メソッド
accelerator.prepare() メソッドは、ライブラリの中核となるコンポーネントです。これは、分散環境と互換性を持たせるために、主に 3 つのオブジェクト・タイプをラップします:
- Models: モデルを適切なコンテナ(例:
DistributedDataParallel)でラップし、デバイスの配置を処理します。モデルは、保存や特定のメソッドへのアクセスのためにaccelerator.unwrap_model(model)を介して取得できます。 - Optimizers: オプティマイザを混合精度演算の処理や state dict のデバイス配置の管理を行うようにラップします。
- DataLoaders: データローダーをラップし、各プロセスがサンプラーから関連するインデックスのみを取得するようにします。これにより、ユーザーが
DistributedSamplerを手動で実装する必要性がなくなり、データローダーに提供された任意のサンプラーと動作します。
バックワード・パス
accelerator.backward(loss) は、混合精度やその他の特殊な統合に必要なステップを組み込むために、標準的な loss.backward() を置き換えます。
分散評価
Accelerate は、単一プロセスおよび分散評価の両方をサポートしています。プロセスがメイン・プロセスのみで実行されるべきタスクについては、ユーザーは if accelerator.is_main_process(): を利用できます。
分散評価の場合、ライブラリは accelerator.gather() を提供しており、これは全プロセスにわたって予測値とラベルのテンソルを集約します。準備された評価用データローダーは、プロセス間で一貫貫したバッチ・サイズを確保するために、評価結果に余分な要素を返すことがあるため、ユーザーは正確性を確保するために、集約された結果を元のデータセットの長さに切り詰める必要があります。
デプロイメントと起動
Accelerate は、異なるハードウェア構成でスクリプトを実行することを簡素化するための CLI ツールを含んでいます:
- Configuration:
accelerate configは、デフォルトのトレーニング設定を含む設定ファイルを作成するためのアンケートを開始します。 - Execution:
accelerate launch path_to_script.pyは、保存されたデフォルト設定を使用してスクリプトを実行します。
torch.distributed.launch のような従来のランチャーを使用する場合でも、Accelerate は互換性がありますが、その CLI はより合理的な体験を提供します。また、ランチャーは SageMaker を介した AWS インスタンスの起動もサポートしています。
Future Roadmap
Hugging Face は、Accelerate を fairscale、deepspeed、および AWS SageMaker 特有のデータ並列性およびモデル並列性へのサポートを拡張する計画です。
Sources
- OriginalIntroducing 🤗 Accelerate