大規模に基礎モデルをトレーニングするためのAmazon SageMaker HyperPodの紹介
Amazon SageMaker HyperPodを使用した大規模な基礎モデルトレーニングの紹介
ファウンデーションモデル(FM)を構築するには、巨大なクラスタを構築し、保守し、最適化する必要があります。これにより、数百億のパラメータを持つモデルを膨大なデータでトレーニングすることが可能となります。モデルトレーニングの進捗を失うことなく、障害や環境の変化に対応できる頑強な環境を作成するためには、クラスタのスケーリング、プロアクティブなヘルスモニタリング、ジョブのチェックポイント作成、障害や問題が発生した場合に自動的にトレーニングを再開する機能などを実装する必要があります。
Amazon SageMaker HyperPodが一般に利用可能になり、ファウンデーションモデルを数千のアクセラレータで最大40%高速化することができます。これにより、大規模な訓練クラスタの運用に関連する繁重な作業を排除しながら、高い頑強性を持つ訓練環境を提供します。SageMaker HyperPodを使用することで、機械学習(ML)の専門家は数週間や数ヶ月にわたってFMをトレーニングすることができ、ハードウェアの故障に対処する必要はありません。
Stability AIなどのお客様は、SageMaker HyperPodを使用して、Stable Diffusionを含むファウンデーションモデルをトレーニングしています。
「私たちは、オープンソースの生成型AI企業として、現代のAIのアクセシビリティを最大化することを目指しています。数百億のパラメータを持つファウンデーションモデルを構築しており、トレーニングのパフォーマンスを最適化するためには、インフラストラクチャのスケーリングが必要です。SageMaker HyperPodの管理型インフラストラクチャと最適化ライブラリを使用することで、トレーニング時間とコストを50%以上削減することができます。これにより、モデルトレーニングをより頑強で高パフォーマンスなものにし、最先端のモデルをより早く構築することができます。」
- 「Amazon SageMakerを使用して数百のモデルにスケールされたファウンデーションモデルの推論 – パート1」
- 「Amazon SageMakerの最新機能を使用することで、モデルのデプロイコストを平均で50%削減します」
- 「Amazon SageMaker のルーティング戦略を使用して、リアルタイムの推論レイテンシを最小限に抑えましょう」
– Emad Mostaque、Stability AIの創設者兼CEO。
SageMaker HyperPodは、ハードウェアの障害に対してファウンデーションモデルの開発フルサイクルを頑強にするために、クラスタの作成、クラスタのヘルスの監視、故障したノードの修復と置換、頻繁なチェックポイントの保存、およびトレーニングの自動再開をサポートします。また、SageMaker HyperPodは、Amazon SageMakerの分散トレーニングライブラリ(SMDDP)とモデル並列処理ライブラリ(SMP)などがプリコンフィグされており、トレーニングデータとモデルをより小さいチャンクに分割してクラスタノード全体で並列処理し、クラスタの計算能力とネットワークインフラストラクチャを最大限に活用することで、FMのトレーニングパフォーマンスを向上させます。SageMaker HyperPodは、クラスタとトレーニングジョブのオーケストレーションにSlurm Workload Managerを統合しています。
Slurm Workload Managerの概要
Slurmは、分散コンピューティングクラスタでのジョブスケジューリングに使用されるユーティリティであり、NVIDIA Collective Communications Library(NCCL)やMessage Passing Interface(MPI)の標準を使用して並列ジョブを実行するためのフレームワークも提供しています。Slurmは、高性能コンピューティング(HPC)や生成型AIおよびFMトレーニングのワークロードで広く使用される人気のあるオープンソースのクラスタリソース管理システムです。SageMaker HyperPodは、数分でSlurmクラスタをセットアップし、実行するための直感的な方法を提供します。
以下は、ユーザーがSageMaker HyperPodと対話し、各クラスタコンポーネントが互いおよび他のAWSサービス(Amazon FSx for LustreおよびAmazon Simple Storage Service(Amazon S3)など)と対話する方法についての高レベルのアーキテクチャ図です。
Slurmのジョブはコマンドライン上でコマンドを使用して提出されます。Slurmジョブを実行するためのコマンドはsrun
とsbatch
です。srun
コマンドはトレーニングジョブをインタラクティブかつブロッキングモードで実行し、sbatch
はバッチ処理で非ブロッキングモードで実行します。srun
は主に即座のジョブ実行に使用され、sbatch
は後でジョブを実行するために使用できます。
追加のSlurmコマンドや設定に関する情報は、Slurm Workload Managerのドキュメントを参照してください。
自動再開と復旧機能
SageMaker HyperPodの新機能の1つは、ジョブに自動再開の機能を持たせることです。以前は、トレーニングジョブまたはファインチューニングジョブの実行中にワーカーノードが失敗した場合、ユーザーはジョブの状態を確認し、最新のチェックポイントからジョブを再開し、ジョブ全体の実行を監視し続ける必要がありました。トレーニングジョブやファインチューニングジョブは数日、数週間、または数か月にわたって実行する必要があり、ノードがクラッシュした場合にユーザーがジョブを監視および維持するために追加の管理オーバーヘッドが発生し、高価な高速コンピュートインスタンスのアイドル時間のコストもかかります。
SageMaker HyperPodは、自動化されたヘルスチェック、ノードの置換、ジョブのリカバリを使用してジョブの強靭性に対処します。SageMaker HyperPodでのSlurmジョブは、SPANKフレームワークを使用したSageMakerカスタムSlurmプラグインを使用して監視されます。トレーニングジョブが失敗した場合、SageMaker HyperPodは一連のヘルスチェックを介してクラスタのヘルスを検査します。クラスタ内で不良ノードが見つかった場合、SageMaker HyperPodは自動的にノードをクラスタから削除し、健全なノードで置き換え、トレーニングジョブを再起動します。トレーニングジョブでチェックポイントを使用している場合、中断または失敗したジョブは最新のチェックポイントから再開できます。
ソリューションの概要
SageMaker HyperPodを展開するためには、まず環境を準備する必要があります。Amazon Virtual Private Cloud(Amazon VPC)ネットワークとセキュリティグループを設定し、VPC内のFSx for Lustreなどのサポートサービスをデプロイし、SlurmライフサイクルスクリプトをS3バケットに公開します。次に、SageMaker HyperPodをデプロイして構成し、ヘッドノードに接続してトレーニングジョブを開始します。
前提条件
SageMaker HyperPodを作成する前に、VPCを構成し、FSx for Lustreファイルシステムを作成し、所望のクラスタライフサイクルスクリプトを持つS3バケットを作成する必要があります。また、最新バージョンのAWS Command Line Interface(AWS CLI)とAWS Session ManagerのCLIプラグインを、AWS Systems Managerの機能であるAWS CLIとCLIプラグインをインストールする必要があります。
SageMaker HyperPodはVPCと完全に統合されています。新しいVPCを作成する方法については、デフォルトVPCの作成またはVPCの作成を参照してください。リソース間の最高のパフォーマンスでシームレスな接続を許可するために、すべてのリソースを同じリージョンとアベイラビリティゾーンに作成し、関連するセキュリティグループのルールがクラスタリソース間の接続を許可することも確認してください。
次に、FSx for Lustreファイルシステムを作成します。これは、モデルトレーニング全体で使用する高パフォーマンスのファイルシステムとして機能します。FSx for LustreおよびクラスタセキュリティグループがクラスタリソースとFSx for Lustreファイルシステムの間の受信および送信の通信を許可することを確認してください。
クラスタのライフサイクルスクリプトを設定するには、新しいクラスタインスタンスのようなイベントが発生したときに実行されるもので、まずS3バケットを作成し、デフォルトのライフサイクルスクリプトをコピーして任意にカスタマイズします。この例では、すべてのライフサイクルスクリプトをlifecycle-scripts
というバケットの接頭辞に保存します。
まず、GitHubのリポジトリからサンプルのライフサイクルスクリプトをダウンロードします。これらを自分のクラスタの動作に合わせてカスタマイズしてください。
次に、カスタマイズされたライフサイクルスクリプトを保存するためのS3バケットを作成します。
aws s3 mb s3://<your_bucket_name>
次に、ローカルディレクトリからデフォルトのライフサイクルスクリプトを指定したバケットと接頭辞にコピーします。これにはaws s3 sync
を使用します。
aws s3 sync . s3://<your_bucket_name>/lifecycle-scripts
最後に、クラスタのヘッドノードへの簡単な接続のために、AWS CLIのインストールまたはアップデートおよびAWSセッションマネージャーCLIプラグインのインストールを行う必要があります。これにより、クラスタの管理およびトレーニングジョブの実行のための対話型ターミナル接続が可能になります。
SageMaker HyperPodクラスターは、オンデマンドリソースを使用するか、SageMakerにキャパシティ予約をリクエストして作成することができます。キャパシティ予約を作成する場合は、Service Quotasダッシュボードで特定のコンピュートインスタンスタイプとキャパシティ割り当てを予約するためのクォータ増加リクエストを作成します。
トレーニングクラスターの設定
SageMaker HyperPodクラスターを作成するには、次の手順を実行します。
- SageMakerコンソールで、ナビゲーションペインのHyperPodクラスターのクラスター管理を選択します。
- クラスターの作成を選択します。
- クラスター名を指定し、オプションでクラスターリソースに適用するタグを指定して、次へを選択します。
- インスタンスグループの作成を選択し、インスタンスグループ名、必要なインスタンスタイプ、希望するインスタンス数、および以前にクラスタライフサイクルスクリプトをコピーしたS3バケットと接頭辞のパスを指定します。
コントローラノード用にクラスタを管理しジョブを送信するための別々のインスタンスグループと、アクセラレートされたコンピュートインスタンスでトレーニングジョブを実行するためのワーカーノード用の別々のインスタンスグループを作成することが推奨されています。ログインノード用の追加のインスタンスグループを設定することもできます。
- まず、コントローラインスタンスグループを作成します。ヘッドノードを含みます。
- このインスタンスグループのAWS Identity and Access Management(IAM)ロールでは、クラスタインスタンスがアクセスできるようにするS3バケットを指定して、新しいロールを作成を選択します。
生成されたロールはデフォルトで指定したバケットに対して読み取り専用のアクセス権が付与されます。
- ロールの作成を選択します。
- インスタンス作成時に各インスタンスで実行されるスクリプト名を
on_create.sh
という名前で入力します。 - 保存を選択します。
- ワーカーインスタンスグループを作成するためにインスタンスグループの作成を選択します。
- 要求されるすべての詳細情報を指定します。必要なインスタンスタイプと数量を含みます。
この例では、4つのml.trn1.32xlのアクセラレートインスタンスを使用してトレーニングジョブを実行します。前回と同じIAMロールを使用するか、ワーカーインスタンス用にロールをカスタマイズすることができます。同様に、このワーカーインスタンスグループ用に前のインスタンスグループとは異なる作成時ライフサイクルスクリプトを設定することもできます。
- 次へを選択して次に進んでください。
- クラスターインスタンスのための希望するVPC、サブネット、およびセキュリティグループを選択してください。
私たちはクラスターインスタンスを単一の利用可能ゾーンとサブネットにホストし、遅延を低減するためにします。
S3データに頻繁にアクセスする場合、潜在的なデータ転送コストを削減するために、プライベートサブネットのルーティングテーブルに関連するVPCエンドポイントを作成することをお勧めします。
- 次を選択してください。
- クラスターの詳細の要約を確認し、送信を選択してください。
または、AWS CLIを使用してSageMaker HyperPodを作成する場合は、最初にクラスターの作成に使用するJSONパラメータをカスタマイズしてください:
// create-cluster-slurm-default-vpc.json{ "ClusterName": "sagemaker-demo-cluster", "InstanceGroups": [ { "InstanceGroupName": "my-controller-group", "InstanceType": "ml.m5.xlarge", "InstanceCount": 1, "lifecycleConfig": { "SourceS3Uri": "s3://<your-s3-bucket>/<lifecycle-script-directory>/", "OnCreate": "on_create.sh" }, "ExecutionRole": "arn:aws:iam::111122223333:role/my-role-for-cluster", "ThreadsPerCore": 1 }, { "InstanceGroupName": "worker-group-1", "InstanceType": "ml.trn1.32xlarge", "InstanceCount": 4, "lifecycleConfig": { "SourceS3Uri": "s3://<your-s3-bucket>/<lifecycle-script-directory>/", "OnCreate": "on_create.sh" }, "ExecutionRole": "arn:aws:iam::111122223333:role/my-role-for-cluster", "ThreadsPerCore": 1 } ]}
次に、提供された入力を使用してクラスターを作成するために次のコマンドを使用してください:
aws sagemaker create-cluster create-cluster-slurm-default-vpc.json
Llama 2を使用して最初のトレーニングジョブを実行する
Llama 2モデルの使用はメタライセンスによって管理されます。モデルの重みとトークナイザーをダウンロードするには、ウェブサイトを訪問し、ライセンスに同意した後でメタのHugging Faceウェブサイトでアクセスを要求してください。
クラスターが実行されたら、クラスターID、インスタンスグループ名、およびインスタンスIDを使用してセッションマネージャーでログインしてください。クラスターの詳細を表示するには、次のコマンドを使用してください:
aws sagemaker describe-cluster –cluster-name <cluster_name>
応答に含まれるクラスターARN内のクラスターIDをメモしてください。
“ClusterArn”: “arn:aws:sagemaker:us-west-2:111122223333:cluster/<cluster_id>”
ログインするために必要なインスタンスグループ名とインスタンスIDを取得するには、次のコマンドを使用してください。
aws sagemaker list-cluster-nodes --cluster-name <cluster_name>
応答内のInstanceGroupName
とInstanceId
をメモしてください。これらはセッションマネージャーでインスタンスに接続する際に使用されます。
今度は、セッションマネージャーを使用してヘッドノードまたはログインノードのいずれかにログインし、トレーニングジョブを実行します:
aws ssm start-session —target sagemaker-cluster:<cluster_id>_<instance_group_name>-<instance_id>
次に、環境を準備し、Llama 2とRedPajamaデータセットをダウンロードします。詳しいコードとステップバイステップの手順は、AWSome Distributed TrainingのGitHubリポジトリの指示に従ってください。
git clone https://github.com/aws-samples/awsome-distributed-training.git
環境を準備する手順に従い、モデルを準備し、データセットをダウンロードしてトークナイズし、モデルを事前コンパイルした後、6.pretrain-model.sh
スクリプトとsbatch
ジョブ提出コマンドを編集して、SageMaker HyperPodの自動再開機能を利用できるようにします。
sbatch
の行を以下のように編集します:
sbatch --nodes 4 --auto-resume=1 run.slurm ./llama2_7b.sh
ジョブを提出した後、以下のコードを使用してジョブステータスを確認するためにJobID
が表示されます:
squeue <jobid>
また、ジョブの出力ログをフォローするために以下のコードを使用してジョブを監視できます:
tail -f slurm-run.slurm-<jobid>.out
クリーンアップ
SageMaker HyperPodクラスターを削除するには、SageMakerコンソールまたは次のAWS CLIコマンドを使用します:
aws sagemaker delete-cluster --cluster-name <cluster_name>
結論
この記事では、AWS環境を準備し、最初のSageMaker HyperPodクラスターをデプロイし、70億パラメータのLlama 2モデルをトレーニングする方法を紹介しました。SageMaker HyperPodは、本日アメリカ(北バージニア、オハイオ、オレゴン)、アジアパシフィック(シンガポール、シドニー、東京)、およびヨーロッパ(フランクフルト、アイルランド、ストックホルム)リージョンで一般に利用可能です。SageMakerコンソール、AWS CLI、AWS SDKを介してデプロイすることができ、p4d、p4de、p5、trn1、inf2、g5、c5、c5n、m5、およびt3のインスタンスファミリーをサポートしています。
SageMaker HyperPodについて詳しくは、Amazon SageMaker HyperPodをご覧ください。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- 「Amazon SageMakerを使用して、クラシカルなMLおよびLLMsを簡単にパッケージ化してデプロイする方法、パート2:SageMaker Studioでのインタラクティブなユーザーエクスペリエンス」
- 「Amazon SageMakerを使用してクラシカルなMLとLLMsを簡単にパッケージ化し、デプロイする方法 – パート1:PySDKの改善」
- 新しい – Code-OSS VS Codeオープンソースに基づくコードエディタが、Amazon SageMaker Studioで利用可能になりました
- レオナルドAI:Midjourneyの新たな競合相手
- ML.NETのカタログとユースケースを探検する
- 一緒にAIを学ぶ- Towards AIコミュニティニュースレター#3
- 「Amazon SageMaker ClarifyとMLOpsサービスを使用して、LLM評価をスケールで運用化する」