Cara menjalankan inferensi LLM di GPU Cloud Run dengan vLLM dan OpenAI Python SDK

1. Pengantar

Ringkasan

Cloud Run baru-baru ini menambahkan dukungan GPU. Fitur ini tersedia sebagai pratinjau publik yang memerlukan pendaftaran dalam daftar tunggu. Jika Anda tertarik untuk mencoba fitur ini, isi formulir ini untuk bergabung dalam daftar tunggu. Cloud Run adalah platform container di Google Cloud yang memudahkan Anda menjalankan kode dalam container, tanpa mengharuskan Anda mengelola cluster.

Saat ini, GPU yang kami sediakan adalah GPU Nvidia L4 dengan vRAM 24 GB. Ada satu GPU per instance Cloud Run, dan penskalaan otomatis Cloud Run tetap berlaku. Hal ini mencakup penskalaan hingga 5 instance (dengan peningkatan kuota yang tersedia), serta penskalaan ke nol instance saat tidak ada permintaan.

Salah satu kasus penggunaan GPU adalah menjalankan model bahasa besar (LLM) terbuka Anda sendiri. Tutorial ini akan memandu Anda men-deploy layanan yang menjalankan LLM.

Layanan ini adalah layanan backend yang menjalankan vLLM, mesin inferensi untuk sistem produksi. Codelab ini menggunakan model yang disesuaikan dengan instruksi Gemma 2 Google dengan 2 miliar parameter.

Yang akan Anda pelajari

  • Cara menggunakan GPU di Cloud Run.
  • Cara menggunakan Hugging Face untuk mengambil model.
  • Cara men-deploy model Gemma 2 2b yang disesuaikan dengan instruksi Google di Cloud Run menggunakan vLLM sebagai mesin inferensi.
  • Cara memanggil layanan backend untuk melakukan penyelesaian kalimat.

2. Penyiapan dan Persyaratan

Prasyarat

  • Anda login ke Konsol Cloud.
  • Anda telah men-deploy layanan Cloud Run sebelumnya. Misalnya, Anda dapat mengikuti panduan memulai men-deploy layanan web dari kode sumber untuk memulai.
  • Anda memiliki akun Hugging Face dan telah menyetujui lisensi Gemma 2 2b di https://huggingface.co/google/gemma-2-2b-it; jika tidak, Anda tidak akan dapat mendownload model.
  • Anda telah membuat token akses yang memiliki akses ke model google/gemma-2-2b-it.

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Jika ini adalah pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Continue.

d95252b003979716.png

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

7833d5e1c5d18f54.png

Virtual machine ini dilengkapi dengan semua alat pengembangan yang diperlukan. VM ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan dengan browser.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda telah diautentikasi dan project telah ditetapkan ke project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Mengaktifkan API dan Menetapkan Variabel Lingkungan

Mengaktifkan API

Sebelum Anda dapat mulai menggunakan codelab ini, ada beberapa API yang perlu diaktifkan. Codelab ini memerlukan penggunaan API berikut. Anda dapat mengaktifkan API tersebut dengan menjalankan perintah berikut:

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

Menyiapkan variabel lingkungan

Anda dapat menetapkan variabel lingkungan yang akan digunakan di seluruh codelab ini.

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. Membuat akun layanan

Akun layanan ini digunakan untuk membangun layanan Cloud Run dan mengakses secret dari Secret Manager.

Pertama, buat akun layanan dengan menjalankan perintah ini:

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

Kedua, berikan peran Vertex AI User ke akun layanan.

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

Sekarang, buat secret di Secret Manager yang disebut HF_TOKEN untuk Token Akses Hugging Face Anda. Cloud Build menggunakan akun layanan untuk mengakses secret ini pada waktu build guna menarik model Gemma 2 (2B) dari Hugging Face. Anda dapat mempelajari lebih lanjut secret dan Cloud Build di sini.

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

Selain itu, berikan akses akun layanan komputasi default ke secret HF_TOKEN di Secret Manager saat membangun image.

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. Buat image di Artifact Registry

Pertama, buat repositori di Artifact Registry.

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

Selanjutnya, buat Dockerfile yang akan menggabungkan secret dari Secret Manager. Anda dapat mempelajari lebih lanjut flag Docker buildx –secrets di sini.

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"}

Sekarang buat file cloudbuild.yaml

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"

Terakhir, kirimkan build.

gcloud builds submit --config=cloudbuild.yaml

Build dapat memakan waktu sekitar 8 menit.

6. Men-deploy layanan

Sekarang Anda siap men-deploy image ke Cloud Run. Deployment akan memerlukan waktu sekitar 5 menit. Anda harus menambah penundaan awal untuk health check selama beberapa menit agar gambar memiliki lebih banyak waktu untuk dimuat. Jika tidak, Anda akan mendapatkan error Deadline Terlampaui dari pemeriksaan kondisi.

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. Menguji layanan

Setelah di-deploy, Anda dapat menggunakan layanan proxy dev Cloud Run yang otomatis menambahkan token ID untuk Anda atau Anda dapat melakukan curl langsung ke URL layanan.

Menggunakan layanan proxy dev Cloud Run

Untuk menggunakan layanan proxy dev Cloud Run, Anda dapat menggunakan langkah-langkah berikut:

Pertama, jalankan perintah berikut

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

Selanjutnya, curl layanan

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
}'

Menggunakan URL layanan secara langsung

Pertama, ambil URL untuk layanan yang di-deploy.

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

Curl layanan

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
}'

Hasil

Anda akan melihat hasil yang mirip dengan berikut ini:

{"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. Selamat!

Selamat, Anda telah menyelesaikan codelab.

Sebaiknya tinjau dokumentasi Cloud Run

Yang telah kita bahas

  • Cara menggunakan GPU di Cloud Run.
  • Cara menggunakan Hugging Face untuk mengambil model.
  • Cara men-deploy model Gemma 2 (2B) Google di Cloud Run menggunakan vLLM sebagai mesin inferensi.
  • Cara memanggil layanan backend untuk melakukan penyelesaian kalimat.

9. Pembersihan

Untuk menghindari biaya yang tidak disengaja (misalnya, jika layanan Cloud Run tidak sengaja dipanggil lebih banyak kali daripada alokasi pemanggilan Cloud Run bulanan Anda di tingkat gratis), Anda dapat menghapus Cloud Run atau menghapus project yang Anda buat di Langkah 2.

Untuk menghapus layanan Cloud Run, buka Konsol Cloud Run di https://console.cloud.google.com/run, lalu hapus layanan vllm-gemma-2-2b. Anda mungkin juga ingin menghapus akun layanan vllm-gemma-2-2b.

Jika Anda memilih untuk menghapus seluruh project, Anda dapat membuka https://console.cloud.google.com/cloud-resource-manager, memilih project yang Anda buat di Langkah 2, lalu memilih Hapus. Jika menghapus project, Anda harus mengubah project di Cloud SDK. Anda dapat melihat daftar semua project yang tersedia dengan menjalankan gcloud projects list.