nikkie-ftnextの日記

イベントレポートや読書メモを発信

GKEでTGIを使ってGemmaをサーブする

はじめに

桜になりたいバラ、うう... nikkieです。

LLMをサーブする環境を思いのほか簡単に立てられそうと気づき、素振りしました。
切ってくぜ、身銭!

目次

用語の整理

見つけたチュートリアル「Deploy Gemma2 with multiple LoRA adapters with TGI DLC on GKE」

なんでもGoogle CloudとHugging Faceは提携🤝🏻しているらしいですね。
Hugging Face and Google partner for open AI collaboration

Gemma2をGKE上で動かすチュートリアルを見つけました

これに沿って素振りします。

動作環境

Google Cloudにプロジェクトを作ります(Consoleで操作して、hf-gcloud-practice爆誕)。
このプロジェクトのクオータの中で「compute.googleapis.com/gpus_all_regions」が0の場合は、1に引き上げるリクエスをします。
GPUが使えないためにうまく進みませんでした。

gcloudコマンドが古すぎてチュートリアルのコマンドに対応していなかったので、gcloud components update2でアップデートしています。

% gcloud version
Google Cloud SDK 499.0.0
(略)

% kubectl version  
Client Version: v1.31.0
(略)

Pythonを使うところがありますが、3.11.8を使いました。

チュートリアルをベースに進めますが、離れた部分を以下に示します。

export PROJECT_ID=hf-gcloud-practice
export LOCATION=asia-northeast1
export CLUSTER_NAME=tgi-practice

GKEクラスタ作成(Create GKE Cluster)

チュートリアルではgcloud container clusters create-autoAutopilotクラスタなるものを作成しています。
最初GPUが使えないクオータ設定でやっていたためかもしれませんが、AutopilotクラスタにTGIのコンテナからPodが作れませんでした(Podが要求するGPUがnodeにないのでPodを割り当てられない)。
Google CloudにひそむGeminiに聞くなどして、別のチュートリアルを見つけ、今回はStandardクラスタとして作成しました。

  1. Standardクラスタを作る
  2. GPUを使うnode poolを1のクラスタに作る
gcloud container clusters create $CLUSTER_NAME \
  --project=$PROJECT_ID \
  --location=$LOCATION \
  --workload-pool=$PROJECT_ID.svc.id.goog \
  --release-channel=stable \
  --cluster-version=1.29 \
  --num-nodes=1
gcloud container node-pools create gpupool \
  --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \
  --project=$PROJECT_ID \
  --location=$LOCATION \
  --node-locations=$LOCATION-a \
  --cluster=$CLUSTER_NAME \
  --machine-type=g2-standard-8 \
  --num-nodes=1

クラスタにはtgi namespaceを作っています(チュートリアルのとおりだとdefault namespaceを使う)

シークレット作成(Get Hugging Face token and set secrets in GKE)

GemmaをHugging Face Hubからダウンロードするのにトークン(HF_TOKEN)が必要です。
これはk8sのsecretを使って、Podに設定します

% python -V                       
Python 3.11.8
% python -m venv .venv --upgrade-deps
% .venv/bin/python -m pip install huggingface_hub
% .venv/bin/huggingface-cli login
% HF_TOKEN=$(.venv/bin/python -c "from huggingface_hub import get_token; print(get_token())")
% kubectl -n tgi create secret generic hf-secret --from-literal=hf_token=${HF_TOKEN} --dry-run=client -o yaml | kubectl -n tgi apply -f -
secret/hf-secret created

チュートリアルにもありますが、本番運用するときはGoogle CloudではSecret Managerを使い、k8s側ではExternal Secrets Operatorの出番な気がします。

Gemmaをデプロイ

環境変数を使ってTGIを設定していますね。
Text-generation-launcher arguments

% kubectl -n tgi apply -f gemma-2b.yaml     
deployment.apps/tgi-deployment created
service/tgi-service created

(別のターミナルで)serviceにport-forwardしておき、curlでリクエストを送ります3

$ kubectl -n tgi port-forward svc/tgi-service 8080:8080
% curl -v http://localhost:8080/health

「HTTP/1.1 200 OK」が確認できます。

% curl -v http://localhost:8080/generate -H 'Content-Type: application/json' -d '{"inputs": "Quote: Imagination is more", "parameters": {"max_new_tokens": 20}}'

{"generated_text":" important than knowledge. Knowledge is limited. Imagination encircles the world. - Albert Einstein\n\nI have"}

Gemmaが生成したテキストが返りました!🙌

TGIのエンドポイントのドキュメントはこちら。
リクエストの例やschemaが載っています

お片付け

gcloud container node-pools delete gpupool \
  --project=$PROJECT_ID \
  --location=$LOCATION \
  --cluster=$CLUSTER_NAME

gcloud container clusters delete $CLUSTER_NAME --location=$LOCATION      

huggingface-cli logoutgcloud auth revokeもしました。

終わりに

GKEでTGIを使って、Gemmaをサーブする素振りでした。
お金はかかりますが、その分手軽に立てられるなという感想でして、TGIの素振りをするのになかなかよいかもしれません。


  1. 直近のブログより
  2. https://cloud.google.com/sdk/gcloud/reference/components/update
  3. kubectl -n tgi logs tgi-deployment-6977c58dbc-cds2j --followのように、TGIのログを確認し、「Connected」というINFOログが出ていたら準備完了です!