このチュートリアルでは、 Google Cloud上のマルチノード、マルチ GPU Slurm クラスタで mistralai/Mixtral-8x7B-v0.1 モデルをファインチューニングする方法について説明します。クラスタは 2 つの a4-highgpu-8g 仮想マシン(VM)インスタンスを使用し、各 VM には 8 個の NVIDIA B200 GPU が搭載されています。
このチュートリアルで説明する主なプロセスは次の 2 つです。
- Google Cloud Cluster Toolkit を使用して、本番環境グレードの高性能 Slurm クラスタをデプロイします。このデプロイの一環として、必要なソフトウェアがプリインストールされたカスタム VM イメージを作成します。また、共有 Lustre ファイル システムを設定し、高速ネットワーキングを構成します。
- クラスタがデプロイされたら、このチュートリアルに付属するスクリプトのセットを使用して、分散型ファインチューニング ジョブを実行します。このジョブは、Hugging Face の Transformer Reinforcement Learning(TRL)ライブラリを介してアクセスする PyTorch Fully Sharded Data Parallel(FSDP)を活用します。
このチュートリアルは、複数のノードと GPU に AI ワークロードを分散することに関心がある ML エンジニア、研究者、プラットフォーム管理者、オペレーター、データと AI のスペシャリストを対象としています。
目標
- Hugging Face を使用して Mixtral にアクセスする
- Cluster Toolkit をインストールする
- 環境を準備する
- 本番環境グレードの A4 High-GPU Slurm クラスタを作成してデプロイします。
- FSDP を使用した分散トレーニング用にマルチノード環境を構成します。
- Hugging Face
trl.SFTTrainerクラスを使用して Mixtral モデルをファインチューニングします。 - データをローカル SSD にステージングします。
- ジョブをモニタリングします。
- クリーンアップする。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
Google Cloud プロジェクトを作成または選択します。
プロジェクトの選択または作成に必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、
resourcemanager.projects.create権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。詳しくは、ロールを付与する方法をご覧ください。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
必要な API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法をご覧ください。gcloud services enable compute.googleapis.com file.googleapis.com logging.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com lustre.googleapis.com
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
Google Cloud プロジェクトを作成または選択します。
プロジェクトの選択または作成に必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、
resourcemanager.projects.create権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。詳しくは、ロールを付与する方法をご覧ください。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
必要な API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法をご覧ください。gcloud services enable compute.googleapis.com file.googleapis.com logging.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com lustre.googleapis.com
-
ユーザー アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。
roles/compute.admin, roles/iam.serviceAccountUser, roles/file.editor, roles/storage.admin, roles/serviceusage.serviceUsageAdmingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
次のように置き換えます。
PROJECT_ID: プロジェクト ID。USER_IDENTIFIER: ユーザー アカウントの識別子。例:myemail@example.com。ROLE: ユーザー アカウントに付与する IAM ロール。
- Google Cloud プロジェクトのデフォルトのサービス アカウントを有効にします。
gcloud iam service-accounts enable PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --project=PROJECT_ID
PROJECT_NUMBER は、使用するプロジェクト番号に置き換えます。プロジェクト番号を確認するには、 既存のプロジェクトを取得するをご覧ください。
- デフォルトのサービス アカウントに編集者ロール(
roles/editor)を付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role=roles/editor
- ユーザー アカウントのローカル認証情報を作成します。
gcloud auth application-default login
- プロジェクトで OS Login を有効にします。
gcloud compute project-info add-metadata --metadata=enable-oslogin=TRUE
- Hugging Face アカウントにログインするか、アカウントを作成します。
- Cluster Toolkit の使用に必要な依存関係をインストールします。
Hugging Face を使用して Mixtral にアクセスする
Hugging Face を使用して Mixtral にアクセスする手順は次のとおりです。
- Hugging Face にログインして Mixtral モデルを確認する。
- Hugging Face
readアクセス トークンを作成します。 - トークン値をコピーして保存します。この値は、このチュートリアルの後半で使用します。
Cluster Toolkit をインストールする
Cluster Toolkit は、 Google Cloudへのハイ パフォーマンス コンピューティング(HPC)、AI、ML のワークロードのデプロイを簡素化するオープンソース ツールです。gcluster の使用とクラスタの管理の詳細については、Cluster Toolkit の概要をご覧ください。
Cluster Toolkit のバージョンを準備します。
リリースをダウンロードします。
gclusterパスを定義します。
環境を準備する
環境を準備する手順は次のとおりです。
デフォルトの環境変数を設定します。
次のように置き換えます。
YOUR_PROJECT_ID: Slurm クラスタを作成する Google Cloud プロジェクトの名前。YOUR_ZONE: 予約が存在するゾーン。YOUR_REGION: 予約が存在するリージョン。YOUR_RESERVATION_NAME: Slurm クラスタの作成に使用する予約の URL または名前。YOUR_CLUSTER_NAME: デプロイの名前。英字と数字のみを含む略称(a4highなど)を使用します。この名前は、デプロイによって作成された Slurm クラスタにも割り当てられます。YOUR_GCS_BUCKET: トレーニング チェックポイントの結果を保存するバケットの名前。既存のバケットを指定するか、新しいバケットを作成します。作成する前に、バケット名の要件をよく理解しておいてください。YOUR_HF_TOKEN: 前の手順で作成した Hugging Face トークン。
Cloud Storage バケットを作成します。
A4 Slurm クラスタを作成する
A4 Slurm クラスタを作成する手順は次のとおりです。
次のコマンドを実行して、
examples/machine-learning/a4-highgpu-8gディレクトリのa4high-slurm-deployment.yamlファイルを環境変数で上書きします。examples/machine-learning/a4-highgpu-8gディレクトリのa4high-slurm-blueprint.yamlファイルを開き、次のように共有/homeディレクトリに Managed Lustre を使用するように編集します。source: modules/file-system/filestoreを使用して、デフォルトのhomefsモジュール ブロックを削除します。lustrefs(remote_mount: lustrefsを含むhomefsブロック)モジュールとprivate-service-accessモジュールを有効にします。varsブロックで、次のように構成します。/var/tmp/slurm_vars.jsonのinstall_managed_lustreの値をtrueに変更します。per_unit_storage_throughputパラメータを500に設定します。lustre_size_gibパラメータを36000に設定します。lustre_instance_id: lustre-instanceのコメントを削除します。- 使用されていない
filestore_ip_rangeをコメントアウトするか削除します。
クラスタをデプロイします。
./gcluster deployコマンドは、次の 2 フェーズのプロセスを開始します。- 最初のフェーズでは、すべてのソフトウェアがプリインストールされたカスタム イメージがビルドされます。この処理には最大 35 分かかることがあります。
- 第 2 フェーズでは、そのカスタム イメージを使用してクラスタをデプロイします。このプロセスは、最初のフェーズよりも早く完了します。
ワークロードを準備する
ワークロードを準備する手順は次のとおりです。
ワークロード スクリプトを作成する
ファインチューニング ワークロードで使用するスクリプトを作成する手順は次のとおりです。
Python 仮想環境を設定するには、次の内容で
install_environment.shファイルを作成します。トレーニング スクリプトの Python 依存関係を指定するには、次の内容の
requirements-fsdp.txtファイルを作成します。メインのトレーニング スクリプトとして
train-mixtral.pyを指定します。Slurm クラスタで実行するジョブのタスクを指定するには、次の内容で
train-mixtral.shファイルを作成します。
スクリプトを Slurm クラスタにアップロードする
前のセクションで作成したスクリプトを Slurm クラスタにアップロードする手順は次のとおりです。
クラスタのログインノードの名前を取得して、
LOGIN_NODE変数を設定します。LOGIN_NODE変数には${DEPLOYMENT_NAME}-login-001と同様の値が格納されます。ファイアウォール ルールを作成します。
スクリプトをログインノードのホーム ディレクトリにアップロードします。
Slurm クラスタに接続する
SSH を使用してログインノードに接続し、Slurm クラスタに接続します。
フレームワークとツールをインストールする
ログインノードに接続したら、コンピューティング ノードでインストール スクリプトを実行して、必要なフレームワークとツールをインストールします。
このコマンドは、仮想環境を設定し、すべての依存関係をインストールして、Mixtral モデルの重みを ~/Mixtral-8x7B-v0.1 にダウンロードします。この作業が完了するまで、30 分以上かかることがあります。
srun を介してこの手順を実行すると、ログインノードから割り当てられたコンピューティング ノードにインストール スクリプトが委任され、スクリプトがコンパイル中に GPU ドライバにアクセスできるようになります。
ファインチューニング ワークロードを開始する
トレーニング ワークロードを開始するには、次の操作を行います。
Slurm スケジューラにジョブを送信します。
ワークロードをモニタリングする
ファインチューニング ジョブの進行状況をモニタリングするには、次の方法を使用します。
Slurm クラスタのログインノードで、
homeディレクトリに作成された出力ファイルを確認することで、ジョブの進行状況をモニタリングできます。ジョブが正常に開始されると、
.errファイルにプログレスバーが表示され、ジョブの進行状況に応じて更新されます。このジョブには、次の 2 つの主要なフェーズがあります。
- 大規模なベースモデルを各コンピューティング ノードのローカル SSD にコピーする。
- モデルのコピーが完了すると開始されるトレーニング ジョブ。
ジョブ全体の実行には約 60 分かかります。
また、Slurm クラスタでの GPU の使用状況をモニタリングして、ファインチューニング ジョブが効率的に実行されていることを確認することもできます。これを行うには、ブラウザで次のリンクを開きます。
https://console.cloud.google.com/monitoring/metrics-explorer?project=YOUR_PROJECT_ID&pageState=%7B%22xyChart%22%3A%7B%22dataSets%22%3A%5B%7B%22timeSeriesFilter%22%3A%7B%22filter%22%3A%22metric.type%3D%5C%22agent.googleapis.com%2Fgpu%2Futilization%5C%22%20resource.type%3D%5C%22gce_instance%5C%22%22%2C%22perSeriesAligner%22%3A%22ALIGN_MEAN%22%7D%2C%22plotType%22%3A%22LINE%22%7D%5D%7D%7Dまたは、ターミナルにコマンドを直接入力することもできます。
ワークロードをモニタリングすると、次の情報を確認できます。
GPU 使用率: 正常なファインチューニング ジョブの場合、トレーニング全体を通して、16 個の GPU(クラスタ内の各 VM に 8 個の GPU)の使用率が上昇し、特定のレベルで安定することが予想されます。
ジョブの所要時間: ジョブが完了するまでに約 1 時間かかります。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
リソースの削除
このチュートリアルで作成したリソースを削除するには、次のコマンドを実行します。
Slurm クラスタを削除するには、
cluster-toolkitディレクトリに移動して次のコマンドを実行します。バケットを削除します。
Packer イメージを削除するには、ウェブブラウザを開いて次のページに移動し、特定のイメージを検索して [削除] をクリックします。
プロジェクトの削除
Google Cloud プロジェクトを削除する:
gcloud projects delete PROJECT_ID
次のステップ
- Slurm クラスタを再デプロイする
- Slurm クラスタでネットワーク パフォーマンスをテストする
- Slurm クラスタの VM をモニタリングする
- サービング エンドポイントを作成する: ファインチューニングされたモデルを作成したら、Google Kubernetes Engine(GKE)または Vertex AI を使用してサービング エンドポイントにデプロイし、推論に使用できるようにします。
- AI / ML ワークロードにおすすめのストレージ サービスについて学習する