このチュートリアルでは、Hugging Face の Transformers ライブラリを使用して、Google Kubernetes Engine(GKE)で画像処理装置(GPU)を使用し、Gemma 大規模言語モデル(LLM)をファインチューニングする方法について説明します。ファインチューニングは、新しいデータセットでパラメータを更新することで、トレーニング済みモデルが特定のタスクを実行する能力を向上させる教師あり学習プロセスです。このチュートリアルでは、2B パラメータで事前トレーニング済みの Gemma ファミリー モデルを Hugging Face からダウンロードし、GKE Autopilot または Standard クラスタでファインチューニングします。
LLM をファインチューニングする際に、マネージド Kubernetes での詳細な制御、スケーラビリティ、復元力、ポータビリティ、費用対効果が求められる場合は、このガイドから始めることをおすすめします。
ML モデルを費用対効果の高い方法で迅速に構築して提供するために、統合されたマネージド AI プラットフォームが必要な場合は、Vertex AI ソリューションをお試しください。
背景
GKE の GPU で Transformers ライブラリを使用して Gemma をサービングすると、効率的なスケーラビリティや高可用性をはじめとするマネージド Kubernetes のメリットをすべて活かして、プロダクション レディで堅牢な推論サービング ソリューションを実装できます。このセクションでは、このガイドで使用されている重要なテクノロジーについて説明します。
Gemma
Gemma は、オープン ライセンスでリリースされ一般公開されている、軽量の生成 AI モデルのセットです。これらの AI モデルは、アプリケーション、ハードウェア、モバイル デバイス、ホスト型サービスで実行できます。
このガイドでは、テキスト生成用の Gemma について説明します。特定のタスクを実行するようにこれらのモデルをチューニングすることもできます。
このドキュメントで使用するデータセットは b-mc2/sql-create-context です。
詳しくは、Gemma のドキュメントをご覧ください。
GPU
GPU を使用すると、ノードで実行される特定のワークロード(ML やデータ処理など)を高速化できます。GKE には、NVIDIA H100、L4、A100 GPU を搭載したマシンタイプをはじめとして、ノード構成用のさまざまなマシンタイプ オプションが用意されています。
GKE で GPU を使用する前に、次の学習プログラムを完了することを検討してください。
- 現在の GPU バージョンの可用性について学習する
- GKE の GPU について学習する
Hugging Face Transformers
Hugging Face の Transformers ライブラリを使用すると、最先端の事前トレーニング済みモデルにアクセスできます。Transformers ライブラリを使用すると、モデルの完全なトレーニングに関連する時間、リソース、計算コストを削減できます。
このチュートリアルでは、Hugging Face API とツールを使用して、これらの事前トレーニング済みモデルをダウンロードしてファインチューニングします。
目標
このガイドは、H100、A100、L4 GPU ハードウェアで LLM をファインチューニングするために Kubernetes コンテナ オーケストレーション機能を使用することに関心をお持ちの GKE ユーザー(新規または既存)、ML エンジニア、MLOps(DevOps)エンジニア、プラットフォーム管理者を対象としています。
このガイドを終えると、次の手順を行えるようになります。
- Autopilot モードの GKE クラスタで環境を準備する。
- ファインチューニング コンテナを作成する。
- GPU を使用して Gemma 2B モデルをファインチューニングし、モデルを Hugging Face にアップロードする。
始める前に
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Cloud de Confiance project.
Enable the required APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
プロジェクトで次のロール(複数の場合あり)が割り当てられていることを確認します。 roles/container.admin、roles/iam.serviceAccountAdmin、roles/cloudbuild.builds.editor
ロールを確認する
-
コンソールで、[IAM] ページに移動します。 Cloud de Confiance
IAM に移動 - プロジェクトを選択します。
-
[Principal] 列で、自分または自分が所属するグループの行をすべて確認します。所属するグループについては、管理者にお問い合わせください。
- 自分のメールアドレスを含む行の [**ロール**] 列で、ロールのリストに必要なロールが含まれているかどうか確認します。
ロールを付与する
-
コンソールで、[IAM] ページに移動します。 Cloud de Confiance
IAM に移動 - プロジェクトを選択します。
- [ [Grant access]] をクリックします。
-
[新しいプリンシパル] フィールドに、ユーザー ID を入力します。 これは通常、Workforce Identity プール内のユーザーの ID です。詳細については、 IAM ポリシーで Workforce プールユーザーを表すをご覧いただくか、管理者にお問い合わせください。
- [**ロールを選択**] をクリックして、ロールを検索します。
- 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
- [保存] をクリックします。
-
- Hugging Face アカウントを作成します(まだ作成していない場合)。
- L4 GPU 用にプロジェクトに十分な割り当てがあることを確認します。詳細については、GPU についてと数量に基づく割り当てをご覧ください。
モデルへのアクセス権を取得する
GKE にデプロイするために Gemma モデルへのアクセス権を取得するには、まずライセンス同意契約に署名してから、Hugging Face のアクセス トークンを生成する必要があります。
ライセンス同意契約に署名する
Gemma を使用するには同意契約に署名する必要があります。手順は次のとおりです。
- Kaggle.com のモデルの同意ページにアクセスします。
- Hugging Face アカウントを使用して同意を確認します。
- モデルの規約に同意します。
アクセス トークンを生成する
Hugging Face からモデルにアクセスするには、Hugging Face トークンが必要です。
トークンをまだ生成していない場合は、次の手順に沿って生成します。
- [Your Profile] > [Settings] > [Access Tokens] の順にクリックします。
- [New Token] を選択します。
- 任意の名前と、少なくとも
Writeロールを指定します。 - [Generate a token] を選択します。
- トークンをクリップボードにコピーします。
環境を準備する
このチュートリアルでは、Cloud Shell を使用してCloud de Confiance by S3NSでホストされているリソースを管理します。Cloud Shell には、このチュートリアルに必要な kubectl や gcloud CLI などのソフトウェアがプリインストールされています。
Cloud Shell を使用して環境を設定するには、次の操作を行います。
Cloud de Confiance コンソールで
(Cloud Shell をアクティブにする)をクリックして、Cloud de Confiance コンソールで Cloud Shell セッションを起動します。これにより、 Cloud de Confiance コンソールの下部ペインでセッションが起動します。
デフォルトの環境変数を設定します。
gcloud config set project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export CONTROL_PLANE_LOCATION=CONTROL_PLANE_LOCATION export CLUSTER_NAME=CLUSTER_NAME export HF_TOKEN=HF_TOKEN export HF_PROFILE=HF_PROFILE次の値を置き換えます。
GitHub からサンプルコード リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/ai-ml/llm-finetuning-gemma
Cloud de Confiance リソースを作成して構成する
次の手順で、必要なリソースを作成します。
GKE クラスタとノードプールを作成する
GKE Autopilot クラスタまたは GKE Standard クラスタの GPU で Gemma を提供できます。ワークロードに最適な GKE のオペレーション モードを選択するには、GKE のオペレーション モードを選択するをご覧ください。
フルマネージドの Kubernetes エクスペリエンスを実現するには、Autopilot を使用します。
Autopilot
Cloud Shell で、次のコマンドを実行します。
gcloud container clusters create-auto CLUSTER_NAME \
--project=PROJECT_ID \
--location=CONTROL_PLANE_LOCATION \
--release-channel=rapid \
--cluster-version=CLUSTER_VERSION
次の値を置き換えます。
PROJECT_ID: Cloud de Confianceのプロジェクト ID。CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンの Compute Engine のロケーション。使用するアクセラレータ タイプをサポートするリージョン(たとえば、L4 GPU の場合はus-central1)を入力します。CLUSTER_NAME: クラスタの名前。CLUSTER_VERSION: GKE バージョン。即時リリース チャネルをサポートしている必要があります。詳細については、 利用可能なバージョンとデフォルト バージョンの確認をご覧ください。
GKE は、デプロイされたワークロードからのリクエストに応じた CPU ノードと GPU ノードを持つ Autopilot クラスタを作成します。
Standard
Cloud Shell で、次のコマンドを実行して Standard クラスタを作成します。
gcloud container clusters create CLUSTER_NAME \ --project=PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --workload-pool=PROJECT_ID.s3ns.svc.id.goog \ --release-channel=rapid \ --num-nodes=1次の値を置き換えます。
PROJECT_ID: Cloud de Confianceのプロジェクト ID。CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンの Compute Engine のロケーション。使用するアクセラレータ タイプをサポートするリージョン(たとえば、L4 GPU の場合はus-central1)を入力します。CLUSTER_NAME: クラスタの名前。
クラスタの作成には数分かかることもあります。
次のコマンドを実行して、クラスタのノードプールを作成します。
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=8,gpu-driver-version=latest \ --project=PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --node-locations=CONTROL_PLANE_LOCATION-a \ --cluster=CLUSTER_NAME \ --machine-type=g2-standard-96 \ --num-nodes=1GKE は、各ノードに 2 つの L4 GPU を含む単一のノードプールを作成します。
Hugging Face の認証情報用の Kubernetes Secret を作成する
Cloud Shell で、次の操作を行います。
クラスタと通信を行うように
kubectlを構成します。gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION次の値を置き換えます。
CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンの Compute Engine のリージョン。CLUSTER_NAME: クラスタの名前。
Hugging Face トークンを含む Kubernetes Secret を作成します。
kubectl create secret generic hf-secret \ --from-literal=hf_api_token=$HF_TOKEN \ --dry-run=client -o yaml | kubectl apply -f -$HF_TOKENは、先ほど生成した Hugging Face トークンに置き換えます。環境変数を設定した場合は、その環境変数を使用します。
Docker と Cloud Build を使用してファインチューニング コンテナを作成する
このコンテナは、PyTorch と Hugging Face Transformers のコードを使用して、既存の事前トレーニング済み Gemma モデルをファインチューニングします。
Artifact Registry Docker リポジトリを作成します。
gcloud artifacts repositories create gemma \ --project=PROJECT_ID \ --repository-format=docker \ --location=us \ --description="Gemma Repo"PROJECT_IDは、実際の Cloud de ConfiancePROJECT_ID に置き換えます。イメージをビルドして push します。
gcloud builds submit .このチュートリアルで後で使用できるように、
IMAGE_URLをエクスポートします。export IMAGE_URL=us-docker.pkg.dev/PROJECT_ID/gemma/finetune-gemma-gpu:1.0.0
GKE でファインチューニング ジョブを実行する
このセクションでは、Gemma ファインチューニング ジョブをデプロイします。Kubernetes の Job コントローラは、1 つ以上の Pod を作成し、特定のタスクが正常に実行されるようにします。
finetune.yamlファイルを開きます。マニフェストを適用して、ファインチューニング ジョブを作成します。
envsubst < finetune.yaml | kubectl apply -f -この指示により、
IMAGE_URLはマニフェスト内の変数に置き換えられます。次のコマンドを実行して、ジョブをモニタリングします。
watch kubectl get pods次のコマンドを実行して、ジョブのログを確認します。
kubectl logs job.batch/finetune-job -fJob リソースはモデルデータをダウンロードし、8 つすべての GPU を使用してモデルをファインチューニングします。この処理には最長で 20 分ほどかかります。
ジョブが完了したら、Hugging Face アカウントに移動します。Hugging Face のプロフィールに
HF_PROFILE/gemma-2b-sql-finetunedという名前の新しいモデルが表示されます。
ファインチューニング済みモデルを GKE でサービングする
このセクションでは、Gemma モデルをサービングする vLLM コンテナをデプロイします。このチュートリアルでは、Kubernetes Deployment を使用して vLLM コンテナをデプロイします。Deployment は、クラスタ内のノードに分散された Pod の複数のレプリカを実行できる Kubernetes API オブジェクトです。
次の
serve-gemma.yamlマニフェストを作成します。新しい
MODEL_IDの環境変数を作成します。export MODEL_ID=HF_PROFILE/gemma-2b-sql-finetunedHF_PROFILEは、前に作成した Hugging Face プロファイル ID に置き換えます。マニフェストの
MODEL_IDを置き換えます。sed -i "s|google/gemma-2b|$MODEL_ID|g" serve-gemma.yaml次のようにマニフェストを適用します。
kubectl apply -f serve-gemma.yamlクラスタ内の Pod が Hugging Face からモデルの重みをダウンロードし、サービス提供エンジンを起動します。
Deployment が利用可能になるまで待ちます。
kubectl wait --for=condition=Available --timeout=700s deployment/vllm-gemma-deployment実行中の Deployment のログを表示します。
kubectl logs -f -l app=gemma-server
Deployment リソースによってモデルデータがダウンロードされます。この処理には数分かかることがあります。出力は次のようになります。
INFO 01-26 19:02:54 model_runner.py:689] Graph capturing finished in 4 secs.
INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
モデルが完全にダウンロードされたことを確認してから、次のセクションに進んでください。
モデルを提供する
このセクションでは、モデルを操作します。
ポート転送を設定する
モデルがデプロイされたら、次のコマンドを実行してモデルへのポート転送を設定します。
kubectl port-forward service/llm-service 8000:8000
出力は次のようになります。
Forwarding from 127.0.0.1:8000 -> 8000
curl を使用してモデルを操作する
新しいターミナル セッションで、curl を使用してモデルとチャットします。
次のコマンドの例は TGI 用です。
USER_PROMPT="Question: What is the total number of attendees with age over 30 at kubecon eu? Context: CREATE TABLE attendees (name VARCHAR, age INTEGER, kubecon VARCHAR)"
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d @- <<EOF
{
"prompt": "${USER_PROMPT}",
"temperature": 0.1,
"top_p": 1.0,
"max_tokens": 24
}
EOF
次の出力には、モデルのレスポンスの例が表示されています。
{"generated_text":" Answer: SELECT COUNT(age) FROM attendees WHERE age > 30 AND kubecon = 'eu'\n"}
クエリによっては、より良い結果を得るために max_token の変更が必要になる場合があります。指示用チューニング済みモデルを使用して、チャット エクスペリエンスを向上させることもできます。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
デプロイされたリソースを削除する
このガイドで作成したリソースについて Cloud de Confiance アカウントに課金されないようにするには、次のコマンドを実行します。
gcloud container clusters delete CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION
次の値を置き換えます。
CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンの Compute Engine のリージョン。使用するアクセラレータ タイプをサポートするリージョン(たとえば、L4 GPU の場合はus-central1)を入力します。CLUSTER_NAME: クラスタの名前。
次のステップ
- GKE の GPU の詳細を確認する。
- GitHub のサンプルコードを表示し、他のアクセラレータ(A100 GPU や H100 GPU など)で Gemma と TGI の使用方法を確認する。
- Autopilot で GPU ワークロードをデプロイする方法を学習する。
- Standard で GPU ワークロードをデプロイする方法を学習する。
- Vertex AI Model Garden を確認する。
- GKE プラットフォームのオーケストレーション機能を使用して、最適化された AI / ML ワークロードを実行する方法を確認する。
- Assured Workloads を使用して Cloud de Confianceのフォルダにコントロールを適用し、規制要件を満たす方法を確認する。