このチュートリアルでは、2 つの A4 仮想マシン(VM)インスタンスを使用するマルチノード Slurm クラスタで Gemma 3 大規模言語モデル(LLM)をファインチューニングする方法について説明します。このチュートリアルでは、次のことを行います。
カスタム イメージを作成する。
RDMA ネットワークを構成します。
分散ファインチューニング ジョブを実行します。効率的なマルチノード トレーニングには、完全にシャーディングされたデータ並列処理(FSDP)を備えた Hugging Face Accelerate ライブラリを使用します。
このチュートリアルは、Slurm ジョブ スケジューリング機能を使用してファインチューニング ワークロードを処理することに関心がある ML エンジニア、プラットフォーム管理者、オペレーター、データおよび AI スペシャリストを対象としています。
目標
Hugging Face を使用して Gemma 3 にアクセスします。
環境を準備します。
A4 Slurm クラスタを作成します。
ワークロードを準備する。
ファインチューニング ジョブを実行する。
ジョブをモニタリングします。
クリーンアップする。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
- Compute Engine
- Google Kubernetes Engine (GKE) Enterprise edition
- Filestore
- Cloud Storage
- Cloud Logging
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
-
Google Cloud CLI をインストールします。
-
フェデレーション ID(連携 ID)を使用するように gcloud CLI を構成します。
詳細については、連携 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
-
ユーザー アカウントにロールを付与します。次の 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: ユーザー アカウント。例については、 IAM ポリシーで Workforce プール ユーザーを表すをご覧ください。ROLE: ユーザー アカウントに付与する IAM ロール。
- Google Cloud プロジェクトのデフォルトのサービス アカウントを有効にします。
gcloud iam service-accounts enable PROJECT_NUMBER-compute@ \ --project=PROJECT_ID
PROJECT_NUMBER は、使用するプロジェクト番号に置き換えます。プロジェクト番号を確認するには、 既存のプロジェクトを取得するをご覧ください。
- デフォルトのサービス アカウントに編集者ロール(
roles/editor)を付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@" \ --role=roles/editor
- ユーザー アカウントのローカル認証情報を作成します。
gcloud auth application-default login
- プロジェクトで OS Login を有効にします。
gcloud compute project-info add-metadata --metadata=enable-oslogin=TRUE
- Hugging Face アカウントにログインするか、アカウントを作成します。
Hugging Face を使用して Gemma 3 にアクセスする
Hugging Face を使用して Gemma 3 にアクセスする手順は次のとおりです。
Hugging Face
readアクセス トークンを作成します。[Your Profile] > [Settings] > [Access tokens] > [+Create new token] の順にクリックします。read accessトークンの値をコピーして保存します。これは、このチュートリアルの後半で使用します。
Cluster Toolkit をインストールする
gcluster の使用とクラスタの管理の詳細については、Cluster Toolkit の概要をご覧ください。
Cluster Toolkit のバージョンを準備します。
リリースをダウンロードします。
gclusterパスを定義します。
環境を準備する
環境を準備する手順は次のとおりです。
デフォルトの環境変数を設定します。
次のように置き換えます。
YOUR_PROJECT_ID: Cloud Storage バケットを作成するGoogle Cloud プロジェクトの ID。YOUR_ZONE: 予約が存在するゾーン。YOUR_REGION: 予約が存在するリージョン。RESERVATION_NAME: Slurm クラスタの作成に使用する予約の URL または名前。YOUR_CLUSTER_NAME: 作成する Slurm クラスタの名前。YOUR_GCS_BUCKET: バケットの命名要件に沿った Cloud Storage バケットの名前。YOUR_HF_TOKEN: 前のセクションで作成した Hugging Face アクセス トークン。
Cloud Storage バケットを作成します。
A4 Slurm クラスタを作成する
A4 Slurm クラスタを作成する手順は次のとおりです。
a4high-slurm-deployment.yamlファイルを作成します。マニフェストを準備します。
Terraform マニフェストを作成します。
マニフェストにパッチを適用します。
クラスタをデプロイします。
gcluster deployコマンドは 2 フェーズのプロセスです。最初のフェーズでは、すべてのソフトウェアがプリインストールされたカスタム イメージがビルドされます。これには最大 45 分かかることがあります。
第 2 フェーズでは、そのカスタム イメージを使用してクラスタをデプロイします。通常、このプロセスは最初のフェーズよりも短時間で完了します。
第 1 フェーズは成功したが第 2 フェーズが失敗した場合は、第 1 フェーズをスキップして Slurm クラスタのデプロイを再試行できます。
ワークロードを準備する
ワークロードを準備する手順は次のとおりです。
ワークロード スクリプトを作成する
ファインチューニング ワークロードで使用するスクリプトを作成する手順は次のとおりです。
Python 仮想環境を設定するには、次の内容で
install_environment.shファイルを作成します。ファインチューニング ジョブの構成を指定するには、次の内容を含む
accelerate_config.yamlファイルを作成します。Slurm クラスタで実行するジョブのタスクを指定するには、次の内容を含む
submit.slurmファイルを作成します。ファインチューニング ジョブの依存関係を指定するには、次の内容で
requirements.txtファイルを作成します。ジョブの手順を指定するには、次の内容を含む
train.pyファイルを作成します。
スクリプトを Slurm クラスタにアップロードする
前のセクションで作成したスクリプトを Slurm クラスタにアップロードする手順は次のとおりです。
クラスタのログインノードの名前を取得して、
LOGIN_NODE変数を設定します。LOGIN_NODE変数には${CLUSTER_NAME}-login-001と同様の値が格納されます。スクリプトをログインノードのホーム ディレクトリにアップロードします。
Slurm クラスタに接続する
ログインノードに接続し、Hugging Face トークンを新しいセッションに伝播します。
フレームワークとツールをインストールする
ログインノードに接続したら、必要な依存関係を使用して Python 仮想環境を設定します。
ファインチューニング ワークロードを開始する
ファインチューニング ワークロードを開始する手順は次のとおりです。
Slurm スケジューラにジョブを送信し、ジョブ ID を収集します。
Slurm クラスタのログインノードで、
homeディレクトリに作成された出力ファイルを確認することで、ジョブの進行状況をモニタリングできます。ジョブが正常に開始されると、
.errファイルにプログレスバーが表示され、ジョブの進行状況に応じて更新されます。
ワークロードをモニタリングする
Slurm クラスタでの GPU の使用状況をモニタリングして、ファインチューニング ジョブが効率的に実行されていることを確認できます。これを行うには、ブラウザで次のリンクを開きます。
https://console.cloud.google.com/monitoring/metrics-explorer?project=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 クラスタを削除する
Slurm クラスタを削除するには:
プロジェクトに関連付けられているすべての VPC ネットワーク、ファイアウォール ルール、ルーター、IP、サブネットを削除する必要がある場合は、次の操作を行います。
プロジェクトの削除
Google Cloud プロジェクトを削除する:
gcloud projects delete PROJECT_ID