はじめに
桜になりたいバラ、うう... nikkieです。
LLMをサーブする環境を思いのほか簡単に立てられそうと気づき、素振りしました。
切ってくぜ、身銭!
目次
- はじめに
- 目次
- 用語の整理
- 見つけたチュートリアル「Deploy Gemma2 with multiple LoRA adapters with TGI DLC on GKE」
- 動作環境
- GKEクラスタ作成(Create GKE Cluster)
- シークレット作成(Get Hugging Face token and set secrets in GKE)
- Gemmaをデプロイ
- お片付け
- 終わりに
用語の整理
- GKE: Google Kubernetes Engine
- Google Cloudのサービスです
- アカウントが必要、かつ課金が発生します
- TGI: Text Generation Inference
- Hugging Faceが開発する、LLM用テキスト生成サーバです1
- GitHub - huggingface/text-generation-inference: Large Language Model Text Generation Inference
- Gemma
- Googleが開発・公開するLLMです。最新は2です
- Google AI Gemma オープンモデル |Google for Developers | Google AI for Developers
見つけたチュートリアル「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 update
2でアップデートしています。
% 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-auto
でAutopilotクラスタなるものを作成しています。
最初GPUが使えないクオータ設定でやっていたためかもしれませんが、AutopilotクラスタにTGIのコンテナからPodが作れませんでした(Podが要求するGPUがnodeにないのでPodを割り当てられない)。
Google CloudにひそむGeminiに聞くなどして、別のチュートリアルを見つけ、今回はStandardクラスタとして作成しました。
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 logout
やgcloud auth revoke
もしました。
終わりに
GKEでTGIを使って、Gemmaをサーブする素振りでした。
お金はかかりますが、その分手軽に立てられるなという感想でして、TGIの素振りをするのになかなかよいかもしれません。
- 直近のブログより ↩
- https://cloud.google.com/sdk/gcloud/reference/components/update↩
-
kubectl -n tgi logs tgi-deployment-6977c58dbc-cds2j --follow
のように、TGIのログを確認し、「Connected」というINFOログが出ていたら準備完了です!↩