このチュートリアルでは、 Google Cloud上のマルチノード、マルチ GPU Slurm クラスタで大規模言語モデル(LLM)をトレーニングする方法について説明します。このチュートリアルで使用するモデルは、15 億のパラメータを持つ Qwen2 モデルに基づいています。Slurm クラスタは 2 つの a4-highgpu-8g 仮想マシン(VM)を使用し、各 VM には 8 個の NVIDIA B200 GPU が搭載されています。
このチュートリアルで説明する主なプロセスは次の 2 つです。
- Google Cloud Cluster Toolkit を使用して、本番環境グレードの高性能 Slurm クラスタをデプロイします。このデプロイの一環として、必要なソフトウェアがプリインストールされたカスタム VM イメージを作成します。また、共有 Filestore インスタンスを設定し、高速 RDMA ネットワーキングを構成します。
- クラスタをデプロイしたら、このチュートリアルに付属のスクリプト セットを使用して、分散事前トレーニング ジョブを実行します。このジョブは、Hugging Face Accelerate ライブラリを活用します。
このチュートリアルは、 Google Cloud に高性能 Slurm クラスタをデプロイして LLM をトレーニングすることに関心のある ML エンジニア、研究者、プラットフォーム管理者、オペレーター、データおよび AI スペシャリストを対象としています。
目標
- Hugging Face を使用して Qwen2 モデルにアクセスする。
- 環境を準備します。
- 本番環境グレードの A4 Slurm クラスタを作成してデプロイします。
- Accelerate ライブラリを使用して Qwen2 モデルをトレーニングします。
- ジョブをモニタリングします。
- クリーンアップする。
費用
このドキュメントでは、課金対象である次の 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
-
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
-
ユーザー アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。
roles/compute.admin, roles/iam.serviceAccountUser, roles/file.editor, roles/storage.admin, roles/serviceusage.serviceUsageAdmin, roles/compute.osAdminLogin, roles/iap.tunnelResourceAccessorgcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
次のように置き換えます。
PROJECT_ID: プロジェクト ID。USER_IDENTIFIER: ユーザー アカウントの識別子。例:myemail@example.comROLE: ユーザー アカウントに付与する 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 アカウントにログインするか、アカウントを作成します。
Hugging Face を使用して Qwen2 にアクセスする
Hugging Face を使用して Qwen2 にアクセスする手順は次のとおりです。
Cluster Toolkit をインストールする
Cluster Toolkit は、 Google Cloudへのハイ パフォーマンス コンピューティング(HPC)、AI、ML のワークロードのデプロイを簡素化するオープンソース ツールです。gcluster の使用とクラスタの管理の詳細については、Cluster Toolkit の概要をご覧ください。
Cluster Toolkit のバージョンを準備します。
リリースをダウンロードします。
gclusterパスを定義します。
環境を準備する
環境を準備する手順は次のとおりです。
デフォルトの環境変数を設定します。
次のように置き換えます。
YOUR_PROJECT_ID: GKE クラスタを作成する Google Cloud プロジェクトの名前。YOUR_CLUSTER_NAME: 作成する Slurm クラスタの名前。YOUR_ZONE: 予約が存在するゾーン。YOUR_REGION,: 予約が存在するリージョン。RESERVATION_NAME: Slurm クラスタの作成に使用する予約の URL または名前。YOUR_BUCKET_NAME: トレーニング チェックポイントの結果を保存するバケットの名前。作成する前に、バケット名の要件をよく理解しておいてください。HUGGING_FACE_TOKEN: 前の手順で作成した Hugging Face トークン。
Cloud Storage バケットを作成します。
A4 Slurm クラスタを作成する
A4 Slurm クラスタを作成する手順は次のとおりです。
a4high-slurm-deployment.yamlファイルを作成します。Terraform マニフェストを作成します。
マニフェストにパッチを適用します。
クラスタをデプロイします。
gcluster deployコマンドは 2 フェーズのプロセスです。最初のフェーズでは、すべてのソフトウェアがプリインストールされたカスタム イメージがビルドされます。この処理には最大 50 分かかることがあります。
第 2 フェーズでは、そのカスタム イメージを使用してクラスタをデプロイします。通常、このプロセスは最初のフェーズよりも短時間で完了します。
第 1 フェーズは成功したが第 2 フェーズが失敗した場合は、第 1 フェーズをスキップして Slurm クラスタのデプロイを再試行できます。
ワークロードを準備する
ワークロードを準備する手順は次のとおりです。
ワークロード スクリプトを作成する
トレーニング ワークロードで使用するスクリプトを作成する手順は次のとおりです。
Python 仮想環境を設定するには、次の内容で
install_environment.shファイルを作成します。ファインチューニング ジョブの構成を指定するには、次の内容を含む
accelerate_config.yamlファイルを作成します。Slurm クラスタで実行するジョブのタスクを指定するには、次の内容を含む
submit.slurmファイルを作成します。ファインチューニング ジョブの依存関係を指定するには、次の内容で
requirements.txtファイルを作成します。
注: このチュートリアルでは、NVIDIA と Pytorch の依存関係の最新バージョンを使用していません。新しい依存関係が必要な場合は、NVIDIA のドキュメントと Pytorch のドキュメントをご覧ください。データセットをダウンロードしてトークン化し、トレーニングの準備ができた形式に前処理するには、次の内容の
preprocess_data.pyファイルを作成します。ジョブの手順を指定するには、次の内容を含む
train.pyファイルを作成します。
スクリプトを Slurm クラスタにアップロードする
前のセクションで作成したスクリプトを Slurm クラスタにアップロードする手順は次のとおりです。
クラスタのログインノードの名前を取得して、
LOGIN_NODE変数を設定します。LOGIN_NODE変数には${CLUSTER_NAME}-login-001と同様の値が格納されます。ファイアウォール ルールを作成します。
スクリプトをログインノードのホーム ディレクトリにアップロードします。
Slurm クラスタに接続する
SSH を使用してログインノードに接続し、Slurm クラスタに接続します。
フレームワークとツールをインストールする
ログインノードに接続したら、次の手順でフレームワークとツールをインストールします。
必要な依存関係をすべて含む Python 仮想環境を設定します。
ワークロードの事前トレーニングを開始する
ワークロードのトレーニングを開始するには、次の操作を行います。
Slurm スケジューラにジョブを送信します。
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 時間かかります。
モデルをダウンロードする
ジョブが正常に実行されると、トレーニング済みモデルがログインノードの ~/qwen2-from-scratch-on-smollm-fineweb/ ディレクトリに保存されます。この永続共有ディレクトリはクラスタ内のすべてのノードにマウントされるため、ジョブが完了した後やコンピューティング ノードが割り当て解除された後でも、モデル チェックポイントは使用可能です。
次の例に示すように、gcloud compute scp コマンドを使用して、保存したモデルをログインノードからローカルマシンにダウンロードできます。
モデルをダウンロードしたら、次のことができます。
- 推論用のモデルを読み込む: Hugging Face Transformers フレームワークを使用して
qwen2-trained-model/ディレクトリを読み込み、新しくトレーニングした Qwen2 モデルで推論を実行します。 - 追加のファインチューニング: 保存したチェックポイントを、より具体的なデータセットに対する追加のファインチューニングの出発点として使用します。
- モデルを Hugging Face Hub に push する: トレーニング済みモデルを Hugging Face Hub に push して共有します。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
リソースを削除する
Slurm クラスタを削除する手順は次のとおりです。
Cloud Storage バケットを削除する手順は次のとおりです。
Packer イメージを削除するには、ウェブブラウザを開いて次のページに移動し、特定のイメージを検索して [削除] をクリックします。
プロジェクトに関連付けられているすべての VPC ネットワーク、ファイアウォール ルール、ルーター、IP、サブネットを削除するには、次の操作を行います。
プロジェクトの削除
Google Cloud プロジェクトを削除する:
gcloud projects delete PROJECT_ID