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

1. Giriş

Genel Bakış

Cloud Run'a kısa süre önce GPU desteği eklendi. Bu özellik, bekleme listesine alınmış bir genel önizleme olarak kullanılabilir. Bu özelliği denemek istiyorsanız bekleme listesine katılmak için bu formu doldurun. Cloud Run, Google Cloud'da bulunan bir container platformudur. Küme yönetmenizi gerektirmeden kodunuzu container'da çalıştırmanızı kolaylaştırır.

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çeklendirme özelliği geçerliliğini korur. Bu kapsamda, 5 örneğe kadar ölçeklendirme (kota artışı mümkündür) ve istek olmadığında sıfır örneğe kadar ölçeklendirme yer alır.

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

Bu hizmet, üretim sistemleri için bir çıkarım motoru olan vLLM'yi çalıştıran bir arka uç hizmetidir. Bu codelab'de, 2 milyar parametreli talimatla ayarlanmış Google'ın Gemma 2 modeli kullanılmaktadır.

Neler öğreneceksiniz?

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

2. Kurulum ve Gereksinimler

Ön koşullar

  • Cloud Console'a giriş yapmış olmanız gerekir.
  • Daha önce bir Cloud Run hizmeti dağıtmış olmanız gerekir. Örneğin, başlamak için Kaynak koddan web hizmeti dağıtma hızlı başlangıç kılavuzunu inceleyebilirsiniz.
  • Hugging Face hesabınız varsa ve https://huggingface.co/google/gemma-2-2b-it adresinde Gemma 2 2b lisansını onayladıysanız modeli indirebilirsiniz. Aksi takdirde modeli indiremezsiniz.
  • google/gemma-2-2b-it modeline erişimi olan bir erişim jetonu oluşturmuş olmanız gerekir.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i d1264ca30785e435.png 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 ekran gösterildiyse Devam'ı tıklayın.

d95252b003979716.png

Cloud Shell'in sağlanması ve bağlanması yalnızca birkaç dakikanızı alır.

7833d5e1c5d18f54.png

Bu sanal makineye gereken tüm geliştirme araçları yüklenmiştir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde iyileştirilir. Bu codelab'deki çalışmalarınızın çoğu (belki de tamamı) 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örürsünüz.

  1. Kimliğinizin doğrulandığı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 projeniz hakkında bilgi sahibi olduğunu doğrulamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. API'leri etkinleştirme ve ortam değişkenlerini ayarlama

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 aşağıdaki 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 boyunca 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 oluşturmak 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 secret manager"

İkinci olarak, 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 erişim jetonunuz için Secret Manager'da HF_TOKEN adlı bir gizli anahtar oluşturun. Cloud Build, Gemma 2 (2B) modelini Hugging Face'ten çekmek için derleme sırasında bu gizli anahtara erişmek üzere hizmet hesabını kullanır. Gizli diziler ve Cloud Build hakkında daha fazla bilgiyi burada bulabilirsiniz.

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

Ayrıca, görüntüyü oluştururken varsayılan bilgi işlem hizmeti hesabına Secret Manager'daki HF_TOKEN gizli anahtarına erişim izni verin.

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

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

Öncelikle Artifact Registry'de bir depo oluşturun.

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

Ardından, Secret Manager'daki gizli anahtarı içeren bir Dockerfile oluşturun. Docker buildx –secrets işareti 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. Dağıtım yaklaşık 5 dakika sürer. Durum denetimi için başlangıçtaki gecikmeyi birkaç dakika artırarak resmin yüklenmesi için daha fazla zaman tanımanız gerekir. Aksi takdirde, durum denetiminden "Son Tarih Aşıldı" hatası alırsınız.

gcloud beta run deploy $SERVICE_NAME \
--image=$REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 \
--port=8000 \
--gpu-type=nvidia-l4 \
--region $REGION \
--no-allow-unauthenticated \
--max-instances 3 \
--no-cpu-throttling \
--no-gpu-zonal-redundancy \
--startup-probe tcpSocket.port=8000,initialDelaySeconds=240,failureThreshold=1,timeoutSeconds=240,periodSeconds=240

7. Hizmeti test etme

Dağıtım tamamlandıktan sonra, sizin için otomatik olarak kimlik jetonu ekleyen Cloud Run geliştirme proxy hizmetini kullanabilir veya hizmet URL'sini doğrudan curl komutuyla çağırabilirsiniz.

Cloud Run geliştirme proxy hizmetini kullanma

Cloud Run geliştirme proxy hizmetini kullanmak için aşağıdaki adımları uygulayabilirsiniz:

Öncelikle aşağıdaki komutu çalıştırın.

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

Ardından 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 kıvı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!

Codelab'i tamamladığınız için tebrikler.

Cloud Run belgelerini incelemenizi öneririz.

İşlediğimiz konular

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

9. Temizleme

Yanlışlıkla ücretlendirilmemek için (örneğin, Cloud Run hizmetleri ücretsiz katmandaki aylık Cloud Run çağırma tahsisinizden daha fazla sayıda çağrılırsa) Cloud Run'ı 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 gidin ve vllm-gemma-2-2b hizmetini silin. vllm-gemma-2-2b hizmet hesabını da silmek isteyebilirsiniz.

Tüm projeyi silmeyi tercih ederseniz https://console.cloud.google.com/cloud-resource-manager adresine gidebilir, 2. adımda oluşturduğunuz projeyi seçip Sil'i tıklayabilirsiniz. Projeyi silerseniz Cloud SDK'nızda projeleri değiştirmeniz gerekir. gcloud projects list komutunu çalıştırarak kullanılabilir tüm projelerin listesini görüntüleyebilirsiniz.