このチュートリアルでは、Hugging Face の Text Generation Inference(TGI)サービング フレームワークを使用して Google Kubernetes Engine(GKE)で画像処理装置(GPU)を使用し、Gemma 大規模言語モデル(LLM)オープンモデル ファミリーを提供する方法について説明します。
このチュートリアルでは、Hugging Face から Gemma 2(2B、9B、27B パラメータ)指示チューニング型モデルまたは CodeGemma モデルをダウンロードします。次に、TGI を実行するコンテナを使用して、GKE Autopilot または Standard クラスタにモデルをデプロイします。
このガイドは、AI / ML ワークロードをデプロイして提供する際に、マネージド Kubernetes での詳細な制御、拡張性、復元力、ポータビリティ、費用対効果が求められる場合の出発点として適しています。ML モデルを費用対効果の高い方法で迅速に構築して提供するために、統合されたマネージド AI プラットフォームが必要な場合は、Vertex AI デプロイ ソリューションをお試しになることをおすすめします。
背景
GKE の GPU で TGI を使用して Gemma を提供すると、効率的なスケーラビリティや高可用性をはじめとするマネージド型の Kubernetes のメリットをすべて活かして、本番環境に対応した堅牢な推論サービング ソリューションを実装できます。このセクションでは、このガイドで使用されている重要なテクノロジーについて説明します。
Gemma
Gemma は、オープン ライセンスでリリースされ一般公開されている、軽量の生成 AI モデルのセットです。これらの AI モデルは、アプリケーション、ハードウェア、モバイル デバイス、ホスト型サービスで実行できます。
このガイドでは、次のモデルについて説明します。
- Gemma はテキスト生成に使用できますが、特定のタスクを実行するようにこれらのモデルをチューニングすることもできます。
- CodeGemma は、Fill-In-The-Middle コード補完、コード生成、自然言語理解、数学的推論、指示の実行など、さまざまなコーディング タスクを実行できる、効率的で軽量なモデルのコレクションです。
詳しくは、Gemma のドキュメントをご覧ください。
GPU
GPU を使用すると、ノードで実行される特定のワークロード(ML やデータ処理など)を高速化できます。GKE には、NVIDIA H100、L4、A100 GPU を搭載したマシンタイプをはじめとして、ノード構成用のさまざまなマシンタイプ オプションが用意されています。
GKE で GPU を使用する前に、次の学習プログラムを完了することをおすすめします。
- 現在の GPU バージョンの可用性について学習する
- GKE の GPU について学習する
Text Generation Inference(TGI)
TGI は、LLM をデプロイしてサービングするための Hugging Face のツールキットです。TGI を使用すると、Gemma などの一般的なオープンソース LLM 向けの高性能なテキスト生成が可能になります。TGI は次のような機能を備えています。
- Flash Attention と PagedAttention による Transformer の実装の最適化
- サービング スループットを全体的に向上させる連続的なバッチ処理
- 複数の GPU での推論を高速化するテンソル並列処理
詳しくは、TGI のドキュメントをご覧ください。
目標
このガイドは、PyTorch を使用して生成 AI をご利用のお客様、GKE の新規または既存のユーザー、ML エンジニア、MLOps(DevOps)エンジニア、プラットフォーム管理者で、H100、A100、L4 GPU ハードウェアで LLM を提供するために Kubernetes コンテナ オーケストレーション機能を使用することに関心のある方を対象としています。
このガイドを終えると、次の手順を行えるようになります。
- Autopilot モードの GKE クラスタで環境を準備する。
- TGI をクラスタにデプロイする。
- TGI を使用して、curl とウェブチャット インターフェースを介して Gemma 2 モデルを提供する。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required API.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required API.
-
Make sure that you have the following role or roles on the project: roles/container.admin, roles/iam.serviceAccountAdmin
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role colunn to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
[IAM] に移動 - プロジェクトを選択します。
- [ アクセスを許可] をクリックします。
-
[新しいプリンシパル] フィールドに、ユーザー ID を入力します。 これは通常、Google アカウントのメールアドレスです。
- [ロールを選択] リストでロールを選択します。
- 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
- [保存] をクリックします。
-
- Hugging Face アカウントを作成します(まだ作成していない場合)。
- プロジェクトに、GPU に対する十分な割り当てがあることを確認します。詳細については、GPU についてと数量に基づく割り当てをご覧ください。
モデルへのアクセス権を取得する
GKE にデプロイするために Gemma モデルへのアクセス権を取得するには、まずライセンス同意契約に署名してから、Hugging Face のアクセス トークンを生成する必要があります。
ライセンス同意契約に署名する
Gemma を使用するには同意契約に署名する必要があります。手順は次のとおりです。
- Kaggle.com のモデルの同意ページにアクセスします。
- Hugging Face アカウントを使用して同意を確認します。
- モデルの規約に同意します。
アクセス トークンを生成する
Hugging Face からモデルにアクセスするには、Hugging Face トークンが必要です。
トークンをまだ生成していない場合は、次の手順に沿って生成します。
- [Your Profile] > [Settings] > [Access Tokens] の順にクリックします。
- [New Token] を選択します。
- 任意の名前と、少なくとも
Read
ロールを指定します。 - [Generate a token] を選択します。
- トークンをクリップボードにコピーします。
環境を準備する
このチュートリアルでは、Cloud Shell を使用して Google Cloud でホストされるリソースを管理します。Cloud Shell には、このチュートリアルに必要な kubectl
や gcloud CLI などのソフトウェアがプリインストールされています。
Cloud Shell を使用して環境を設定するには、次の操作を行います。
Google Cloud コンソールで、Google Cloud コンソールの [Cloud Shell をアクティブにする] をクリックして、Cloud Shell セッションを起動します。これにより、Google Cloud コンソールの下部ペインでセッションが起動されます。
デフォルトの環境変数を設定します。
gcloud config set project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export REGION=REGION export CLUSTER_NAME=tgi export HF_TOKEN=HF_TOKEN
次の値を置き換えます。
- PROJECT_ID: Google Cloud プロジェクト ID。
- REGION: 使用するアクセラレータ タイプをサポートするリージョン(たとえば、L4 GPU の場合は
us-central1
)。 - HF_TOKEN: 先ほど生成した Hugging Face トークン。
Google Cloud リソースを作成して構成する
次の手順に沿って、必要なリソースを作成します。
GKE クラスタとノードプールを作成する
GKE Autopilot クラスタまたは GKE Standard クラスタの GPU で Gemma を提供できます。フルマネージドの Kubernetes エクスペリエンスを実現するには、Autopilot クラスタを使用することをおすすめします。ワークロードに最適な GKE の運用モードを選択するには、GKE の運用モードを選択するをご覧ください。
Autopilot
Cloud Shell で、次のコマンドを実行します。
gcloud container clusters create-auto ${CLUSTER_NAME} \
--project=${PROJECT_ID} \
--region=${REGION} \
--release-channel=rapid
GKE は、デプロイされたワークロードからの要求に応じた CPU ノードと GPU ノードを持つ Autopilot クラスタを作成します。
Standard
Cloud Shell で、次のコマンドを実行して Standard クラスタを作成します。
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --region=${REGION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --release-channel=rapid \ --num-nodes=1
クラスタの作成には数分かかることもあります。
次のコマンドを実行して、クラスタのノードプールを作成します。
Gemma 2 2B
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \ --project=${PROJECT_ID} \ --location=${REGION} \ --node-locations=${REGION}-a \ --cluster=${CLUSTER_NAME} \ --machine-type=g2-standard-8 \ --num-nodes=1
GKE は、各ノードに 1 つの L4 GPU を含む単一のノードプールを作成します。
Gemma 2 9B
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=2,gpu-driver-version=latest \ --project=${PROJECT_ID} \ --location=${REGION} \ --node-locations=${REGION}-a \ --cluster=${CLUSTER_NAME} \ --machine-type=g2-standard-24 \ --num-nodes=1
GKE は、各ノードに 2 つの L4 GPU を含む単一のノードプールを作成します。
Gemma 2 27B
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=4,gpu-driver-version=latest \ --project=${PROJECT_ID} \ --location=${REGION} \ --node-locations=${REGION}-a \ --cluster=${CLUSTER_NAME} \ --machine-type=g2-standard-48 \ --num-nodes=1
GKE は、各ノードに 4 つの L4 GPU を含む単一のノードプールを作成します。
Hugging Face の認証情報用の Kubernetes Secret を作成する
Cloud Shell で、次の操作を行います。
クラスタと通信を行うように
kubectl
を構成します。gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${REGION}
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 -
TGI をデプロイする
このセクションでは、使用する Gemma モデルを提供する TGI コンテナをデプロイします。
Gemma 2 2B-it
次の手順に沿って、Gemma 2B 指示用にチューニングされたモデルをデプロイします。
次の
tgi-2-2b-it.yaml
マニフェストを作成します。次のようにマニフェストを適用します。
kubectl apply -f tgi-2-2b-it.yaml
Gemma 2 9B-it
次の手順に沿って、Gemma 9B 指示用にチューニングされたモデルをデプロイします。
次の
tgi-2-9b-it.yaml
マニフェストを作成します。次のようにマニフェストを適用します。
kubectl apply -f tgi-2-9b-it.yaml
Gemma 2 27B-it
次の手順に沿って、Gemma 2 27B 指示チューニング型モデルをデプロイします。
次の
tgi-2-27b-it.yaml
マニフェストを作成します。次のようにマニフェストを適用します。
kubectl apply -f tgi-2-27b-it.yaml
CodeGemma 7B-it
次の手順に沿って、CodeGemma 7B 指示用にチューニングされたモデルをデプロイします。
次の
tgi-codegemma-1.1-7b-it.yaml
マニフェストを作成します。次のようにマニフェストを適用します。
kubectl apply -f tgi-codegemma-1.1-7b-it.yaml
モデルを提供する
このセクションでは、モデルを操作します。
ポート転送をセットアップする
次のコマンドを実行して、モデルへのポート転送を設定します。
kubectl port-forward service/llm-service 8000:8000
出力は次のようになります。
Forwarding from 127.0.0.1:8000 -> 8000
curl を使用してモデルを操作する
このセクションでは、デプロイ済みの事前トレーニング済みモデルまたは指示チューニング型モデルを検証するために、基本的なスモークテストを行う方法について説明します。わかりやすくするため、このセクションでは Gemma 2 指示チューニング型モデルと CodeGemma モデルを使用したテスト方法について説明します。
Gemma 2
新しいターミナル セッションで、curl
を使用してモデルとチャットします。
USER_PROMPT="I'm new to coding. If you could only recommend one programming language to start with, what would it be and why?"
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d @- <<EOF
{
"inputs": "<start_of_turn>user\n${USER_PROMPT}<end_of_turn>\n",
"parameters": {
"temperature": 0.90,
"top_p": 0.95,
"max_new_tokens": 128
}
}
EOF
次の出力には、モデルのレスポンスの例が表示されています。
{"generated_text":"**Python**\n\n**Reasons why Python is a great choice for beginners:**\n\n* **Simple syntax:** Python uses clear and concise syntax, making it easy for beginners to pick up.\n* **Easy to learn:** Python's syntax is based on English, making it easier to learn than other languages.\n* **Large and supportive community:** Python has a massive and active community of developers who are constantly willing to help.\n* **Numerous libraries and tools:** Python comes with a vast collection of libraries and tools that make it easy to perform various tasks, such as data manipulation, web development, and machine learning.\n* **"}
CodeGemma
新しいターミナル セッションで、curl
を使用してモデルとチャットします。
USER_PROMPT="Generate a python code example of a adding two numbers from a function called addNumbers"
curl -s -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d @- <<EOF | jq -r .generated_text
{
"inputs": "<start_of_turn>user\n${USER_PROMPT}<end_of_turn>\n",
"parameters": {
"temperature": 0.90,
"top_p": 0.95,
"max_new_tokens": 2000
}
}
EOF
次の出力には、モデルのレスポンスの例が表示されています。
def addNumbers(num1, num2):
sum = num1 + num2
return sum
# Get the input from the user
num1 = float(input("Enter the first number: "))
num2 = float(input("Enter the second number: "))
# Call the addNumbers function
sum = addNumbers(num1, num2)
# Print the result
print("The sum of", num1, "and", num2, "is", sum)
(省略可)Gradio のチャット インターフェースでモデルを操作する
このセクションでは、指示用調整モデルを操作できるウェブチャット アプリケーションを作成します。わかりやすくするため、このセクションでは 2B-it モデルを使用したテスト方法についてのみ説明します。
Gradio は、chatbot のユーザー インターフェースを作成する ChatInterface
ラッパーを含む Python ライブラリです。
チャット インターフェースをデプロイする
Cloud Shell で、次の Ingress マニフェストを
gradio.yaml
として保存します。次のようにマニフェストを適用します。
kubectl apply -f gradio.yaml
Deployment が利用可能になるまで待ちます。
kubectl wait --for=condition=Available --timeout=300s deployment/gradio
チャット インターフェースを使用する
Cloud Shell で、次のコマンドを実行します。
kubectl port-forward service/gradio 8080:8080
これにより、Cloud Shell から Gradio サービスへのポート転送が作成されます。
Cloud Shell タスクバーの右上にある [ ウェブでプレビュー] ボタンをクリックします。[ポート 8080 でプレビュー] をクリックします。ブラウザで新しいタブが開きます。
Gradio のチャット インターフェースを使用して Gemma を操作します。プロンプトを追加して [送信] をクリックします。
問題のトラブルシューティング
Empty reply from server
というメッセージが表示された場合は、コンテナがモデルデータのダウンロードを完了していない可能性があります。モデルがサービス提供の準備ができていることを示すConnected
というメッセージがないか、再度 Pod のログを確認します。Connection refused
が表示された場合は、ポート転送が有効であることを確認します。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
デプロイされたリソースを削除する
このガイドで作成したリソースについて、Google Cloud アカウントに課金されないようにするには、次のコマンドを実行します。
gcloud container clusters delete ${CLUSTER_NAME} \
--region=${REGION}
次のステップ
- GKE の GPU の詳細を確認する。
- GitHub のサンプルコードを表示し、他のアクセラレータ(A100 GPU や H100 GPU など)で Gemma と TGI の使用方法を確認する。
- Autopilot で GPU ワークロードをデプロイする方法を学習する。
- Standard で GPU ワークロードをデプロイする方法を学習する。
- TGI のドキュメントを確認する。
- Vertex AI Model Garden を確認する。
- GKE プラットフォームのオーケストレーション機能を使用して、最適化された AI / ML ワークロードを実行する方法を確認する。