vLLM ve OpenAI Python SDK ile Cloud Run GPU'larında LLM çıkarımı çalıştırma

1. Giriş

Genel Bakış

Cloud Run kısa süre önce GPU desteği sunmaya başladı. Bekleme listesine genel önizleme olarak sunulur. Özelliği denemek istiyorsanız bekleme listesine katılmak için bu formu doldurun. Cloud Run, Google Cloud üzerinde yer alan ve küme yönetmenizi gerektirmeden kodunuzu bir container'da kolayca çalıştırmanızı sağlayan bir container platformudur.

Bugün kullanıma sunduğumuz GPU'lar, 24 GB vRAM'e sahip Nvidia L4 GPU'lardır. Cloud Run örneği başına bir GPU vardır ve Cloud Run otomatik ölçeklendirmesi geçerli olmaya devam eder. 5 örneğe kadar ölçeklendirme (kota artışıyla) ve istek olmadığında sıfır örneğe ölçeklendirme dahildir.

GPU'ların kullanım alanlarından biri, kendi açık büyük dil modellerinizi (LLM) çalıştırmaktır. Bu eğitim, LLM çalıştıran bir hizmetin dağıtımında size yol gösterir.

Hizmet, üretim sistemleri için bir çıkarım motoru olan vLLM'yi çalıştıran bir arka uç hizmetidir. Bu codelab'de, Google'ın talimat ayarlı 2 milyar parametreye sahip Gemma 2 modeli kullanılır.

Neler öğreneceksiniz?

  • Cloud Run'da GPU'ları kullanma.
  • Bir model almak için Hugging Face nasıl kullanılır?
  • Çıkarım motoru olarak vLLM'yi kullanarak Google'ın Gemma 2 2b talimatına göre ayarlanmış modelini Cloud Run'da dağıtma.
  • Cümle tamamlama için arka uç hizmetini çağırma.

2. Kurulum ve Gereksinimler

Ön koşullar

  • Cloud Console'a giriş yaptınız.
  • Daha önce bir Cloud Run hizmeti dağıttınız. Örneğin, başlamak için kaynak kodundan web hizmeti dağıtma başlıklı makaledeki adımları uygulayabilirsiniz.
  • Hugging Face hesabınız var ve https://huggingface.co/google/gemma-2-2b-it adresinden Gemma 2 2b lisansını kabul ettiniz; Aksi takdirde modeli indiremezsiniz.
  • google/gemma-2-2b-it modeline erişimi olan bir erişim jetonu oluşturdunuz.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir d1264ca30785e435.png simgesini tıklayın.

cb81e7c8e34bc8d.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.

d95252b003979716.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

7833d5e1c5d18f54.png

Gereken tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.

  1. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list

Komut çıkışı

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. API'leri Etkinleştirin ve Ortam Değişkenlerini Ayarlayın

API'leri etkinleştir

Bu codelab'i kullanmaya başlamadan önce etkinleştirmeniz gereken birkaç API vardır. Bu codelab'de aşağıdaki API'lerin kullanılması gerekir. Bu API'leri şu komutu çalıştırarak etkinleştirebilirsiniz:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    secretmanager.googleapis.com \
    artifactregistry.googleapis.com

Ortam değişkenlerini ayarlama

Bu codelab'de kullanılacak ortam değişkenlerini ayarlayabilirsiniz.

HF_TOKEN=<YOUR_HUGGING_FACE_TOKEN>
PROJECT_ID=<YOUR_PROJECT_ID>

REGION=us-central1
SERVICE_NAME=vllm-gemma-2-2b-it
AR_REPO_NAME=vllm-gemma-2-2b-it-repo
SERVICE_ACCOUNT=vllm-gemma-2-2b-it
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

4. Hizmet hesabı oluşturma

Bu hizmet hesabı, Cloud Run hizmetini derlemek ve Secret Manager'dan bir gizli anahtara erişmek için kullanılır.

Öncelikle şu komutu çalıştırarak hizmet hesabını oluşturun:

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run vllm SA to access secrete manager"

Ardından, hizmet hesabına Vertex AI Kullanıcısı rolünü verin.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/secretmanager.secretAccessor

Şimdi Hugging Face Access Token'ınız için Secret Manager'da HF_TOKEN adında bir gizli anahtar oluşturun. Cloud Build, Gemma 2 (2B) modelini Hugging Face'den çekmek amacıyla derleme zamanında bu gizli anahtara erişmek için hizmet hesabını kullanır. Gizli anahtarlar ve Cloud Build hakkında daha fazla bilgiyi buradan edinebilirsiniz.

printf $HF_TOKEN | gcloud secrets create HF_TOKEN --data-file=-

Ayrıca hizmet hesabına, Secret Manager'da HF_TOKEN gizli anahtarı için erişim izni verin.

gcloud secrets add-iam-policy-binding HF_TOKEN \
    --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role='roles/secretmanager.secretAccessor'

5. Artifact Registry'de görüntü oluşturun

Öncelikle Artifact Registry'de depo oluşturun.

gcloud artifacts repositories create $AR_REPO_NAME \
  --repository-format docker \
  --location us-central1

Ardından, Secret Manager'daki gizli anahtarı içerecek bir Dockerfile oluşturun. Docker buildx –secrets flag hakkında daha fazla bilgiyi burada bulabilirsiniz.

FROM vllm/vllm-openai:latest

ENV HF_HOME=/model-cache
RUN --mount=type=secret,id=HF_TOKEN HF_TOKEN=$(cat /run/secrets/HF_TOKEN) \
    huggingface-cli download google/gemma-2-2b-it

ENV HF_HUB_OFFLINE=1

ENTRYPOINT python3 -m vllm.entrypoints.openai.api_server \
    --port ${PORT:-8000} \
    --model ${MODEL_NAME:-google/gemma-2-2b-it} \
    ${MAX_MODEL_LEN:+--max-model-len "$MAX_MODEL_LEN"}

Şimdi bir cloudbuild.yaml dosyası oluşturun

steps:
- name: 'gcr.io/cloud-builders/docker'
  id: build
  entrypoint: 'bash'
  secretEnv: ['HF_TOKEN']
  args: 
    - -c
    - |
        SECRET_TOKEN="$$HF_TOKEN" docker buildx build --tag=${_IMAGE} --secret id=HF_TOKEN .

availableSecrets:
  secretManager:
  - versionName: 'projects/${PROJECT_ID}/secrets/HF_TOKEN/versions/latest'
    env: 'HF_TOKEN'

images: ["${_IMAGE}"]

substitutions:  
  _IMAGE: 'us-central1-docker.pkg.dev/${PROJECT_ID}/vllm-gemma-2-2b-it-repo/vllm-gemma-2-2b-it'

options:
  dynamicSubstitutions: true
  machineType: "E2_HIGHCPU_32"

Son olarak, bir derleme gönderin.

gcloud builds submit --config=cloudbuild.yaml

Derleme yaklaşık 8 dakika sürebilir.

6. Hizmeti dağıtma

Artık görüntüyü Cloud Run'a dağıtmaya hazırsınız.

gcloud beta run deploy $SERVICE_NAME \
--image=us-central1-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 --gpu-type=nvidia-l4 \
--region us-central1 \
--no-allow-unauthenticated \
--max-instances 5 \
--no-cpu-throttling

Dağıtım 5 dakika kadar sürebilir.

7. Hizmeti test etme

Dağıtımdan sonra, sizin için otomatik olarak kimlik jetonu ekleyen Cloud Run geliştirici proxy hizmetini kullanabilir veya hizmet URL'sini doğrudan curl hale getirebilirsiniz.

Cloud Run geliştirici proxy hizmetini kullanma

Cloud Run geliştirici proxy hizmetini kullanmak için şu adımları uygulayabilirsiniz:

İlk olarak aşağıdaki komutu çalıştırın

gcloud run services proxy $SERVICE_NAME --region us-central1

Sonra, hizmeti kıvırın

curl -X POST http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

Hizmet URL'sini doğrudan kullanma

Öncelikle dağıtılan hizmetin URL'sini alın.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')

Hizmeti çalıştırma

curl -X POST $SERVICE_URL/v1/completions \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

Sonuçlar

Aşağıdakine benzer sonuçlar görmeniz gerekir:

{"id":"cmpl-e0e6924d4bfd4d918383c87cba5e25ac","object":"text_completion","created":1723853023,"model":"google/gemma-2-2b","choices":[{"index":0,"text":" serverless compute platform that lets you write your backend code in standard languages, such as Java, Go, PHP and Python.\n\nYou can deploy your function as a REST API that scales on demand and allows you to add additional security features such as HTTPS.\n\nTo write code for an Android app with Cloud Run, you need to use the GraalVM. This is because while Node.js is a more commonly known node-based platform, GraalVM is a virtual machine (VM) to run native code in the Cloud Run environment.\n\nNow you need graal.vm/java-11-jre.jar, the","logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":5,"total_tokens":133,"completion_tokens":128}}

8. Tebrikler!

Tebrikler, codelab'i tamamladınız.

Cloud Run belgelerini incelemenizi öneririz.

İşlediklerimiz

  • Cloud Run'da GPU'ları kullanma.
  • Bir model almak için Hugging Face nasıl kullanılır?
  • Çıkarım motoru olarak vLLM'yi kullanarak Google'ın Gemma 2 (2B) modelini Cloud Run'da dağıtma.
  • Cümle tamamlama için arka uç hizmetini çağırma.

9. Temizleme

Yanlışlıkla yapılan ücretleri önlemek için (örneğin, Cloud Run hizmetleri yanlışlıkla ücretsiz katmandaki aylık Cloud Run çağırma tahsisinizden daha fazla kez çağrıldıysa) Cloud Run'ı silebilir veya 2. adımda oluşturduğunuz projeyi silebilirsiniz.

Cloud Run hizmetini silmek için https://console.cloud.google.com/run adresinden Cloud Run Cloud Console'a gidip vllm-gemma-2-2b hizmetini silin. vllm-gemma-2-2b hizmet hesabını da silmek isteyebilirsiniz.

Projenin tamamını silmeyi tercih ederseniz https://console.cloud.google.com/cloud-resource-manager adresine gidip 2. adımda oluşturduğunuz projeyi, ardından Sil'i seçebilirsiniz. Projeyi silerseniz Cloud SDK'nızdaki projeleri değiştirmeniz gerekir. gcloud projects list komutunu çalıştırarak mevcut tüm projelerin listesini görüntüleyebilirsiniz.