Come eseguire l'inferenza LLM su GPU Cloud Run con vLLM e l'SDK per Python OpenAI

1. Introduzione

Panoramica

Cloud Run ha recentemente aggiunto il supporto delle GPU. È disponibile come anteprima pubblica in lista d'attesa. Se ti interessa provare la funzionalità, compila questo modulo per iscriverti alla lista d'attesa. Cloud Run è una piattaforma di container su Google Cloud che semplifica l'esecuzione del codice in un container, senza la necessità di gestire un cluster.

Attualmente, le GPU disponibili sono GPU Nvidia L4 con 24 GB di vRAM. È presente una sola GPU per istanza Cloud Run e viene comunque applicata la scalabilità automatica di Cloud Run. Ciò include lo scale out fino a 5 istanze (con aumento della quota disponibile) e lo scale down a zero delle istanze quando non ci sono richieste.

Un caso d'uso delle GPU è l'esecuzione di modelli linguistici di grandi dimensioni (LLM) aperti. Questo tutorial illustra come eseguire il deployment di un servizio che esegue un LLM.

Il servizio è un servizio di backend che esegue vLLM, un motore di inferenza per i sistemi di produzione. Questo codelab utilizza Gemma 2 di Google con un modello ottimizzato per l'istruzione dei parametri per 2 miliardi di parametri.

Cosa imparerai a fare

  • Come utilizzare le GPU su Cloud Run.
  • Come utilizzare Hugging Face per recuperare un modello.
  • Come eseguire il deployment del modello ottimizzato per le istruzioni Gemma 2 2b di Google su Cloud Run utilizzando vLLM come motore di inferenza.
  • Come richiamare il servizio di backend per completare la frase.

2. Configurazione e requisiti

Prerequisiti

  • Hai eseguito l'accesso alla console Cloud.
  • Hai già eseguito il deployment di un servizio Cloud Run. Ad esempio, per iniziare, puoi seguire la guida rapida al deployment di un servizio web dal codice sorgente.
  • Hai un account Hugging Face e hai accettato la licenza Gemma 2 2b all'indirizzo https://huggingface.co/google/gemma-2-2b-it; altrimenti non potrai scaricarlo.
  • Hai creato un token di accesso che ha accesso al modello google/gemma-2-2b-it.

Attiva Cloud Shell

  1. Dalla console Cloud, fai clic su Attiva Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Se è la prima volta che avvii Cloud Shell, ti verrà mostrata una schermata intermedia che descrive di cosa si tratta. Se ti è stata presentata una schermata intermedia, fai clic su Continua.

d95252b003979716.png

Il provisioning e la connessione a Cloud Shell dovrebbero richiedere solo qualche istante.

7833d5e1c5d18f54.png

Questa macchina virtuale viene caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Gran parte, se non tutto, del lavoro in questo codelab può essere svolto con un browser.

Una volta stabilita la connessione a Cloud Shell, dovresti vedere che hai eseguito l'autenticazione e che il progetto è impostato sul tuo ID progetto.

  1. Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list

Output comando

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Esegui questo comando in Cloud Shell per confermare che il comando gcloud è a conoscenza del tuo progetto:
gcloud config list project

Output comando

[core]
project = <PROJECT_ID>

In caso contrario, puoi impostarlo con questo comando:

gcloud config set project <PROJECT_ID>

Output comando

Updated property [core/project].

3. Abilita le API e imposta le variabili di ambiente

Abilita API

Prima di poter iniziare a utilizzare questo codelab, ci sono diverse API che dovrai abilitare. Questo codelab richiede l'utilizzo delle API seguenti. Puoi abilitare queste API eseguendo questo comando:

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

Configura le variabili di ambiente

Puoi impostare le variabili di ambiente che verranno utilizzate in questo codelab.

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. Crea un account di servizio

Questo account di servizio viene utilizzato per creare il servizio Cloud Run e accedere a un secret da Secret Manager.

Innanzitutto, crea l'account di servizio eseguendo questo comando:

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

Quindi, concedi il ruolo Utente Vertex AI all'account di servizio.

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

Ora, crea un secret in Secret Manager chiamato HF_TOKEN per il tuo token di accesso a Hugging Face. Cloud Build utilizza l'account di servizio per accedere a questo secret in fase di build per estrarre il modello Gemma 2 (2B) da Hugging Face. Puoi scoprire di più su secret e Cloud Build qui.

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

Concedi all'account di servizio l'accesso al secret HF_TOKEN in Secret Manager.

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

5. Crea l'immagine in Artifact Registry

Per prima cosa, crea un repository in Artifact Registry.

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

Poi, crea un elemento Dockerfile che incorporerà il secret di Secret Manager. Scopri di più sul flag Docker buildx –secrets qui.

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

Ora crea un 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"

Infine, invia una build.

gcloud builds submit --config=cloudbuild.yaml

La compilazione può durare circa 8 minuti.

6. Esegui il deployment del servizio

Ora è tutto pronto per eseguire il deployment dell'immagine in Cloud Run.

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

Il deployment può richiedere fino a 5 minuti.

7. Prova il servizio

Una volta eseguito il deployment, puoi utilizzare il servizio di proxy per sviluppatori di Cloud Run, che aggiunge automaticamente un token ID, oppure puoi eseguire il comando curl direttamente per l'URL del servizio.

Utilizzo del servizio di proxy per sviluppatori di Cloud Run

Per utilizzare il servizio di proxy per sviluppatori di Cloud Run, segui questi passaggi:

Innanzitutto, esegui questo comando

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

Quindi, esegui il comando curl

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

Utilizzo diretto dell'URL del servizio

Innanzitutto, recupera l'URL del servizio di cui è stato eseguito il deployment.

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

Cura il servizio

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

Risultati

Dovresti vedere risultati simili ai seguenti:

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

Complimenti per aver completato il codelab.

Ti consigliamo di consultare la documentazione Cloud Run

Argomenti trattati

  • Come utilizzare le GPU su Cloud Run.
  • Come utilizzare Hugging Face per recuperare un modello.
  • Come eseguire il deployment del modello Gemma 2 (2B) di Google su Cloud Run utilizzando vLLM come motore di inferenza.
  • Come richiamare il servizio di backend per completare la frase.

9. Esegui la pulizia

Per evitare addebiti involontari, ad esempio se i servizi Cloud Run vengono inavvertitamente richiamati più volte rispetto all'allocazione mensile dei callout Cloud Run nel livello senza costi, puoi eliminare Cloud Run o eliminare il progetto che hai creato nel passaggio 2.

Per eliminare il servizio Cloud Run, vai alla console Cloud di Cloud Run all'indirizzo https://console.cloud.google.com/run ed elimina il servizio vllm-gemma-2-2b. Potresti anche voler eliminare l'account di servizio vllm-gemma-2-2b.

Se scegli di eliminare l'intero progetto, puoi andare all'indirizzo https://console.cloud.google.com/cloud-resource-manager, selezionare il progetto che hai creato nel passaggio 2 e scegliere Elimina. Se elimini il progetto, dovrai modificarli in Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list.