このチュートリアルでは、 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 ライブラリを活用します。
このチュートリアルは、LLM のトレーニングのために Google Cloud に高パフォーマンスの Slurm クラスタをデプロイすることに関心のある機械学習(ML)エンジニア、研究者、プラットフォーム管理者、オペレーター、データおよび AI スペシャリストを対象としています。
目標
- Hugging Face を使用して Qwen2 モデルにアクセスする。
- 環境を準備する。
- 本番環境グレードの A4 Slurm クラスタを作成してデプロイします。
- Accelerate ライブラリを使用して Qwen2 モデルをトレーニングします。
- ジョブをモニタリングします。
- クリーンアップする。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
-
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.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: ユーザー アカウントの識別子。 アカウント。例については、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 を使用して Qwen2 にアクセスする
Hugging Face を使用して Qwen2 にアクセスする手順は次のとおりです。
Cluster Toolkit をインストールする
Cluster Toolkit は、 Google Cloudへのハイ パフォーマンス コンピューティング(HPC)、AI、機械学習(ML)のワークロードのデプロイを簡素化するオープンソース ツールです。gcluster CLI の使用とクラスタの管理の詳細については、Cluster Toolkit の概要をご覧ください。
Cluster Toolkit のバージョンを準備します。
リリースをダウンロードします。
gclusterパスを定義します。
環境を準備する
環境を準備する手順は次のとおりです。
デフォルトの環境変数を設定します。
次のように置き換えます。
YOUR_PROJECT_ID: GKE クラスタを作成する Google Cloud プロジェクトの名前。YOUR_CLUSTER_NAME: 作成する Slurm クラスタの名前。YOUR_ZONE: 予約が存在するゾーン。YOUR_REGION,: 予約が存在するリージョン。RESERVATION_NAME: Slurm クラスタの作成に使用する予約の URL または名前。YOUR_GCS_BUCKET: トレーニング チェックポイントの結果を保存するバケットの名前。作成する前に、バケット名の要件を理解しておいてください。YOUR_HF_TOKEN: 前のステップで作成した Hugging Face トークン。
Cloud Storage バケットを作成します。
A4 Slurm クラスタを作成する
A4 Slurm クラスタを作成する手順は次のとおりです。
a4high-slurm-deployment.yamlファイルを作成します。gcluster createコマンドを使用して、Terraform マニフェストを作成します。マニフェストにパッチを適用します。
クラスタをデプロイします。
gcluster deployコマンドは、次の 2 段階のプロセスです。最初のフェーズでは、すべてのソフトウェアがプリインストールされたカスタム イメージをビルドします。これには最大 50 分かかることがあります。
2 番目のフェーズでは、そのカスタム イメージを使用してクラスタをデプロイします。通常、このプロセスは最初のフェーズよりも短時間で完了します。
最初のフェーズが成功し、2 番目のフェーズが失敗した場合は、最初のフェーズをスキップして 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 クラスタを削除するには、
gcluster destroyコマンドを実行します。Cloud Storage バケットを削除するには、次の手順に沿って操作します。
Packer イメージを削除するには、ウェブブラウザを開き、次のページに移動して、特定のイメージを検索し、[削除] をクリックします。
プロジェクトに関連付けられているすべての VPC ネットワーク、ファイアウォール ルール、ルーター、IP、サブネットを削除するには、次の操作を行います。
プロジェクトの削除
Google Cloud プロジェクトを削除する:
gcloud projects delete PROJECT_ID