Cómo ejecutar la inferencia de LLM en las GPU de Cloud Run con vLLM y el SDK de OpenAI para Python

1. Introducción

Descripción general

Cloud Run agregó recientemente compatibilidad con GPU. Está disponible como versión preliminar pública en lista de espera. Si te interesa probar la función, completa este formulario para unirte a la lista de espera. Cloud Run es una plataforma de contenedores en Google Cloud que facilita la ejecución de tu código en un contenedor, sin necesidad de que administres un clúster.

Actualmente, las GPU que ponemos a disposición son las GPU Nvidia L4 con 24 GB de vRAM. Hay una GPU por instancia de Cloud Run y aún se aplica el ajuste de escala automático de Cloud Run. Esto incluye escalar verticalmente hasta 5 instancias (con aumento de cuota disponible) y reducir la escala verticalmente a cero cuando no hay solicitudes.

Un caso de uso para las GPU es ejecutar tus propios modelos abiertos de lenguaje grande (LLM). En este instructivo, aprenderás a implementar un servicio que ejecuta un LLM.

Es un servicio de backend que ejecuta vLLM, un motor de inferencia para sistemas de producción. En este codelab, se usa Gemma 2 de Google con 2,000 millones de parámetros ajustados en instrucciones.

Qué aprenderás

  • Cómo usar GPU en Cloud Run
  • Cómo usar Hugging Face para recuperar un modelo
  • Cómo implementar el modelo ajustado a instrucciones Gemma 2 2b de Google en Cloud Run mediante vLLM como motor de inferencia.
  • Cómo invocar el servicio de backend para completar oraciones

2. Configuración y requisitos

Requisitos previos

  • Accediste a la consola de Cloud.
  • Ya implementaste un servicio de Cloud Run. Por ejemplo, puedes seguir la guía de inicio rápido para implementar un servicio web desde el código fuente para comenzar.
  • Tienes una cuenta de Hugging Face y aceptaste la licencia de Gemma 2 2b en https://huggingface.co/google/gemma-2-2b-it; de lo contrario, no podrás descargar el modelo.
  • Creaste un token de acceso que tiene acceso al modelo google/gemma-2-2b-it.

Activar Cloud Shell

  1. En la consola de Cloud, haz clic en Activar Cloud Shelld1264ca30785e435.png.

cb81e7c8e34bc8d.png

Si es la primera vez que inicias Cloud Shell, verás una pantalla intermedia que describe en qué consiste. Si apareció una pantalla intermedia, haz clic en Continuar.

d95252b003979716.png

El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.

7833d5e1c5d18f54.png

Esta máquina virtual está cargada con todas las herramientas de desarrollo necesarias. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que mejora considerablemente el rendimiento de la red y la autenticación. Gran parte de tu trabajo en este codelab, si no todo, se puede hacer con un navegador.

Una vez que te conectes a Cloud Shell, deberías ver que estás autenticado y que el proyecto está configurado con tu ID del proyecto.

  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que tienes la autenticación:
gcloud auth list

Resultado del comando

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Ejecuta el siguiente comando en Cloud Shell para confirmar que el comando de gcloud conoce tu proyecto:
gcloud config list project

Resultado del comando

[core]
project = <PROJECT_ID>

De lo contrario, puedes configurarlo con el siguiente comando:

gcloud config set project <PROJECT_ID>

Resultado del comando

Updated property [core/project].

3. Habilita las APIs y configura las variables de entorno

Habilita las APIs

Antes de comenzar a usar este codelab, debes habilitar varias APIs. Este codelab requiere el uso de las siguientes APIs. Para habilitar esas APIs, ejecuta el siguiente comando:

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

Configura variables de entorno

Puedes establecer variables de entorno que se usarán en este 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 una cuenta de servicio

Esta cuenta de servicio se usa para compilar el servicio de Cloud Run y acceder a un Secret desde Secret Manager.

Primero, ejecuta este comando para crear la cuenta de servicio:

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

Segundo, otorga el rol de usuario de Vertex AI a la cuenta de servicio.

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

Ahora, crea un secreto en Secret Manager llamado HF_TOKEN para tu token de acceso de Hugging Face. Cloud Build usa la cuenta de servicio para acceder a este secreto durante la compilación y extraer el modelo Gemma 2 (2B) de Hugging Face. Puedes obtener más información sobre los secretos y Cloud Build aquí.

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

Otorga a la cuenta de servicio acceso al secreto HF_TOKEN en Secret Manager.

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

5. Crea la imagen en Artifact Registry

Primero, crea un repositorio en Artifact Registry.

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

A continuación, crea un Dockerfile que incorpore el secreto de Secret Manager. Puedes obtener más información sobre la marca de Docker buildx –secrets aquí.

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

Ahora, crea un archivo 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"

Por último, envía una compilación.

gcloud builds submit --config=cloudbuild.yaml

La compilación puede tardar unos 8 minutos.

6. Implemente el servicio

Ya está todo listo para implementar la imagen en 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

La implementación puede tardar hasta 5 minutos.

7. Prueba el servicio

Luego de la implementación, puedes usar el servicio de proxy de desarrollo de Cloud Run, que agrega automáticamente un token de ID, o puedes procesar la URL del servicio directamente.

Usa el servicio de proxy de desarrollo de Cloud Run

Para usar el servicio de proxy de desarrollo de Cloud Run, puedes seguir estos pasos:

Primero, ejecuta el siguiente comando:

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

Luego, ejecuta el 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
}'

Usa la URL del servicio directamente

Primero, recupera la URL del servicio implementado.

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

Curve el servicio

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

Resultados

Deberías ver resultados similares a los siguientes:

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

¡Felicitaciones por completar el codelab!

Te recomendamos que revises la documentación de Cloud Run.

Temas abordados

  • Cómo usar GPU en Cloud Run
  • Cómo usar Hugging Face para recuperar un modelo
  • Cómo implementar el modelo Gemma 2 (2B) de Google en Cloud Run con vLLM como motor de inferencia.
  • Cómo invocar el servicio de backend para completar oraciones

9. Limpia

Para evitar cargos involuntarios (por ejemplo, si los servicios de Cloud Run se invocan de forma involuntaria más veces que tu asignación mensual de invocación de Cloud Run en el nivel gratuito), puedes borrar Cloud Run o el proyecto que creaste en el paso 2.

Para borrar el servicio de Cloud Run, ve a la consola de Cloud Run en https://console.cloud.google.com/run y borra el servicio vllm-gemma-2-2b. Es posible que también quieras borrar la cuenta de servicio vllm-gemma-2-2b.

Si decides borrar el proyecto completo, puedes ir a https://console.cloud.google.com/cloud-resource-manager, seleccionar el proyecto que creaste en el paso 2 y elegir Borrar. Si borras el proyecto, deberás cambiar los proyectos en tu SDK de Cloud. Para ver la lista de todos los proyectos disponibles, ejecuta gcloud projects list.