En este tutorial, puedes servir modelos LLM en TPU v5e o TPU Trillium (v6e) de la siguiente manera:
- Llama 3 8B instruct en una TPU v5e de un solo host.
- Mistral 7B instruct v0.3 en una TPU v5e de un solo host.
- Llama 3.1 70B en una TPU Trillium (v6e) de un solo host.
Esta guía está dirigida a clientes de IA generativa, usuarios nuevos y actuales de GKE, ingenieros de aprendizaje automático, ingenieros de MLOps (DevOps) o administradores de plataformas que quieran usar las funciones de orquestación de contenedores de Kubernetes para ofrecer modelos con Ray en TPUs con vLLM.
Fondo
En esta sección se describen las tecnologías clave que se usan en esta guía.
Servicio de Kubernetes gestionado de GKE
Google Cloud ofrece una amplia gama de servicios, incluido GKE, que es ideal para desplegar y gestionar cargas de trabajo de IA y aprendizaje automático. GKE es un servicio de Kubernetes gestionado que simplifica el despliegue, el escalado y la gestión de aplicaciones en contenedores. GKE proporciona la infraestructura necesaria, incluidos recursos escalables, computación distribuida y redes eficientes, para gestionar las demandas computacionales de los LLMs.
Para obtener más información sobre los conceptos clave de Kubernetes, consulta Empezar a aprender sobre Kubernetes. Para obtener más información sobre GKE y cómo te ayuda a escalar, automatizar y gestionar Kubernetes, consulta la descripción general de GKE.
Operador de rayos
El complemento Ray Operator en GKE proporciona una plataforma de IA y aprendizaje automático integral para servir, entrenar y ajustar cargas de trabajo de aprendizaje automático. En este tutorial, usarás Ray Serve, un framework de Ray, para ofrecer LLMs populares de Hugging Face.
TPUs
Las TPUs son circuitos integrados para aplicaciones específicas (ASIC) desarrollados a medida por Google que se utilizan para acelerar los modelos de aprendizaje automático y de IA creados con frameworks como TensorFlow, PyTorch y JAX.
En este tutorial se explica cómo servir modelos LLM en nodos de TPU v5e o TPU Trillium (v6e) con topologías de TPU configuradas en función de los requisitos de cada modelo para servir peticiones con baja latencia.
vLLM
vLLM es un framework de servicio de LLMs de código abierto muy optimizado que puede aumentar el rendimiento del servicio en las TPUs. Incluye funciones como las siguientes:
- Implementación optimizada de Transformer con PagedAttention
- Agrupación continua para mejorar el rendimiento general del servicio
- Paralelismo de tensores y servicio distribuido en varias GPUs
Para obtener más información, consulta la documentación de vLLM.
Objetivos
Este tutorial abarca los siguientes pasos:
- Crea un clúster de GKE con un grupo de nodos de TPU.
- Despliega un recurso personalizado RayCluster con un segmento de TPU de un solo host. GKE implementa el recurso personalizado RayCluster como pods de Kubernetes.
- Sirve un LLM.
- Interactúa con los modelos.
De forma opcional, puedes configurar los siguientes recursos y técnicas de servicio de modelos que admite el framework Ray Serve:
- Implementa un recurso personalizado de RayService.
- Compón varios modelos con la composición de modelos.
Antes de empezar
Antes de empezar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando
gcloud components update
.
- Crea una cuenta de Hugging Face si aún no tienes una.
- Asegúrate de tener un token de Hugging Face.
- Asegúrate de que tienes acceso al modelo de Hugging Face que quieras usar. Normalmente, se obtiene este acceso firmando un contrato y solicitándolo al propietario del modelo en la página del modelo de Hugging Face.
- Asegúrate de que tienes los siguientes roles de gestión de identidades y accesos:
roles/container.admin
roles/iam.serviceAccountAdmin
roles/container.clusterAdmin
roles/artifactregistry.writer
Prepara tu entorno
Comprueba que tu Google Cloud proyecto tenga suficiente cuota para una TPU v5e de un solo host o una TPU Trillium (v6e) de un solo host. Para gestionar tu cuota, consulta Cuotas de TPU.
En la Google Cloud consola, inicia una instancia de Cloud Shell:
Abrir Cloud ShellClona el repositorio de muestra:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git cd kubernetes-engine-samples
Ve al directorio de trabajo:
cd ai-ml/gke-ray/rayserve/llm
Define las variables de entorno predeterminadas para la creación del clúster de GKE:
Llama-3-8B-Instruct
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CLUSTER_NAME=vllm-tpu export COMPUTE_REGION=REGION export COMPUTE_ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN export GSBUCKET=vllm-tpu-bucket export KSA_NAME=vllm-sa export NAMESPACE=default export MODEL_ID="meta-llama/Meta-Llama-3-8B-Instruct" export VLLM_IMAGE=docker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1 export SERVICE_NAME=vllm-tpu-head-svc
Haz los cambios siguientes:
HUGGING_FACE_TOKEN
: tu token de acceso de Hugging Face.REGION
: la región en la que tienes cuota de TPU. Asegúrate de que la versión de TPU que quieres usar esté disponible en esta región. Para obtener más información, consulta Disponibilidad de las TPU en GKE.ZONE
: la zona con cuota de TPU disponible.VLLM_IMAGE
: la imagen de TPU de vLLM. Puedes usar la imagen públicadocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1
o crear tu propia imagen de TPU.
Mistral-7B
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CLUSTER_NAME=vllm-tpu export COMPUTE_REGION=REGION export COMPUTE_ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN export GSBUCKET=vllm-tpu-bucket export KSA_NAME=vllm-sa export NAMESPACE=default export MODEL_ID="mistralai/Mistral-7B-Instruct-v0.3" export TOKENIZER_MODE=mistral export VLLM_IMAGE=docker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1 export SERVICE_NAME=vllm-tpu-head-svc
Haz los cambios siguientes:
HUGGING_FACE_TOKEN
: tu token de acceso de Hugging Face.REGION
: la región en la que tienes cuota de TPU. Asegúrate de que la versión de TPU que quieres usar esté disponible en esta región. Para obtener más información, consulta Disponibilidad de las TPU en GKE.ZONE
: la zona con cuota de TPU disponible.VLLM_IMAGE
: la imagen de TPU de vLLM. Puedes usar la imagen públicadocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1
o crear tu propia imagen de TPU.
Llama 3.1 70B
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CLUSTER_NAME=vllm-tpu export COMPUTE_REGION=REGION export COMPUTE_ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN export GSBUCKET=vllm-tpu-bucket export KSA_NAME=vllm-sa export NAMESPACE=default export MODEL_ID="meta-llama/Llama-3.1-70B" export MAX_MODEL_LEN=8192 export VLLM_IMAGE=docker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1 export SERVICE_NAME=vllm-tpu-head-svc
Haz los cambios siguientes:
HUGGING_FACE_TOKEN
: tu token de acceso de Hugging Face.REGION
: la región en la que tienes cuota de TPU. Asegúrate de que la versión de TPU que quieres usar esté disponible en esta región. Para obtener más información, consulta Disponibilidad de las TPU en GKE.ZONE
: la zona con cuota de TPU disponible.VLLM_IMAGE
: la imagen de TPU de vLLM. Puedes usar la imagen públicadocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1
o crear tu propia imagen de TPU.
Extrae la imagen del contenedor vLLM:
sudo usermod -aG docker ${USER} newgrp docker docker pull ${VLLM_IMAGE}
Crear un clúster
Puedes servir un LLM en TPUs con Ray en un clúster Autopilot o Estándar de GKE mediante el complemento Ray Operator.
Usa un clúster de Autopilot para disfrutar de una experiencia de Kubernetes totalmente gestionada. Para elegir el modo de funcionamiento de GKE que mejor se adapte a tus cargas de trabajo, consulta Elegir un modo de funcionamiento de GKE.
Usa Cloud Shell para crear un clúster de Autopilot o Estándar:
Autopilot
Crea un clúster de Autopilot de GKE con el complemento RayOperator habilitado:
gcloud container clusters create-auto ${CLUSTER_NAME} \ --enable-ray-operator \ --release-channel=rapid \ --location=${COMPUTE_REGION}
Estándar
Crea un clúster estándar con el complemento Ray Operator habilitado:
gcloud container clusters create ${CLUSTER_NAME} \ --release-channel=rapid \ --location=${COMPUTE_ZONE} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --machine-type="n1-standard-4" \ --addons=RayOperator,GcsFuseCsiDriver
Crea un grupo de nodos de segmento de TPU de un solo host:
Llama-3-8B-Instruct
gcloud container node-pools create tpu-1 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct5lp-hightpu-8t \ --num-nodes=1
GKE crea un grupo de nodos de TPU v5e con un tipo de máquina
ct5lp-hightpu-8t
.Mistral-7B
gcloud container node-pools create tpu-1 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct5lp-hightpu-8t \ --num-nodes=1
GKE crea un grupo de nodos de TPU v5e con un tipo de máquina
ct5lp-hightpu-8t
.Llama 3.1 70B
gcloud container node-pools create tpu-1 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct6e-standard-8t \ --num-nodes=1
GKE crea un grupo de nodos de TPU v6e con un tipo de máquina
ct6e-standard-8t
.
Configurar kubectl para que se comunique con el clúster
Para configurar kubectl de forma que se comunique con tu clúster, ejecuta el siguiente comando:
Autopilot
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--location=${COMPUTE_REGION}
Estándar
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--location=${COMPUTE_ZONE}
Crear un secreto de Kubernetes para las credenciales de Hugging Face
Para crear un secreto de Kubernetes que contenga el token de Hugging Face, ejecuta el siguiente comando:
kubectl create secret generic hf-secret \
--from-literal=hf_api_token=${HF_TOKEN} \
--dry-run=client -o yaml | kubectl --namespace ${NAMESPACE} apply -f -
Crea un segmento de Cloud Storage
Para acelerar el tiempo de inicio de la implementación de vLLM y minimizar el espacio en disco necesario por nodo, usa el controlador de CSI de FUSE de Cloud Storage para montar el modelo descargado y la caché de compilación en los nodos de Ray.
En Cloud Shell, ejecuta el siguiente comando:
gcloud storage buckets create gs://${GSBUCKET} \
--uniform-bucket-level-access
Este comando crea un segmento de Cloud Storage para almacenar los archivos del modelo que descargues de Hugging Face.
Configurar una cuenta de servicio de Kubernetes para acceder al segmento
Crea la cuenta de servicio de Kubernetes:
kubectl create serviceaccount ${KSA_NAME} \ --namespace ${NAMESPACE}
Concede a la cuenta de servicio de Kubernetes acceso de lectura y escritura al segmento de Cloud Storage:
gcloud storage buckets add-iam-policy-binding gs://${GSBUCKET} \ --member "principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/${NAMESPACE}/sa/${KSA_NAME}" \ --role "roles/storage.objectUser"
GKE crea los siguientes recursos para el LLM:
- Un segmento de Cloud Storage para almacenar el modelo descargado y la caché de compilación. Un controlador CSI de FUSE de Cloud Storage lee el contenido del segmento.
- Volúmenes con el almacenamiento en caché de archivos habilitado y la función de descarga paralela de Cloud Storage FUSE.
Práctica recomendada: Usa una caché de archivos respaldada por
tmpfs
oHyperdisk / Persistent Disk
en función del tamaño esperado del contenido del modelo (por ejemplo, los archivos de pesos). En este tutorial, se usa la caché de archivos de Cloud Storage FUSE respaldada por RAM.
Implementar un recurso personalizado RayCluster
Despliega un recurso personalizado RayCluster, que suele constar de un pod del sistema y varios pods de trabajador.
Llama-3-8B-Instruct
Crea el recurso personalizado RayCluster para desplegar el modelo ajustado de instrucciones de Llama 3 8B siguiendo estos pasos:
Inspecciona el archivo de manifiesto
ray-cluster.tpu-v5e-singlehost.yaml
:Aplica el archivo de manifiesto:
envsubst < tpu/ray-cluster.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
El comando
envsubst
sustituye las variables de entorno del manifiesto.
GKE crea un recurso personalizado RayCluster con un workergroup
que contiene un host único de TPU v5e en una topología 2x4
.
Mistral-7B
Crea el recurso personalizado RayCluster para desplegar el modelo Mistral-7B siguiendo estos pasos:
Inspecciona el archivo de manifiesto
ray-cluster.tpu-v5e-singlehost.yaml
:Aplica el archivo de manifiesto:
envsubst < tpu/ray-cluster.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
El comando
envsubst
sustituye las variables de entorno del manifiesto.
GKE crea un recurso personalizado RayCluster con un workergroup
que contiene un host único de TPU v5e en una topología 2x4
.
Llama 3.1 70B
Crea el recurso personalizado RayCluster para desplegar el modelo Llama 3.1 70B siguiendo estos pasos:
Inspecciona el archivo de manifiesto
ray-cluster.tpu-v6e-singlehost.yaml
:Aplica el archivo de manifiesto:
envsubst < tpu/ray-cluster.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
El comando
envsubst
sustituye las variables de entorno del manifiesto.
GKE crea un recurso personalizado RayCluster con un workergroup
que contiene un
TPU v6e de un solo host en una topología 2x4
.
Conectarse al recurso personalizado RayCluster
Una vez creado el recurso personalizado RayCluster, puedes conectarte a él y empezar a publicar el modelo.
Verifica que GKE haya creado el servicio RayCluster:
kubectl --namespace ${NAMESPACE} get raycluster/vllm-tpu \ --output wide
El resultado debería ser similar al siguiente:
NAME DESIRED WORKERS AVAILABLE WORKERS CPUS MEMORY GPUS TPUS STATUS AGE HEAD POD IP HEAD SERVICE IP vllm-tpu 1 1 ### ###G 0 8 ready ### ###.###.###.### ###.###.###.###
Espera hasta que el
STATUS
seaready
y las columnasHEAD POD IP
yHEAD SERVICE IP
tengan una dirección IP.Establece sesiones de
port-forwarding
con el encabezado de Ray:pkill -f "kubectl .* port-forward .* 8265:8265" pkill -f "kubectl .* port-forward .* 10001:10001" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8265:8265 2>&1 >/dev/null & kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 10001:10001 2>&1 >/dev/null &
Verifica que el cliente de Ray puede conectarse al recurso personalizado de RayCluster remoto:
docker run --net=host -it ${VLLM_IMAGE} \ ray list nodes --address http://localhost:8265
El resultado debería ser similar al siguiente:
======== List: YYYY-MM-DD HH:MM:SS.NNNNNN ======== Stats: ------------------------------ Total: 2 Table: ------------------------------ NODE_ID NODE_IP IS_HEAD_NODE STATE STATE_MESSAGE NODE_NAME RESOURCES_TOTAL LABELS 0 XXXXXXXXXX ###.###.###.### True ALIVE ###.###.###.### CPU: 2.0 ray.io/node_id: XXXXXXXXXX memory: #.### GiB node:###.###.###.###: 1.0 node:__internal_head__: 1.0 object_store_memory: #.### GiB 1 XXXXXXXXXX ###.###.###.### False ALIVE ###.###.###.### CPU: 100.0 ray.io/node_id: XXXXXXXXXX TPU: 8.0 TPU-v#e-8-head: 1.0 accelerator_type:TPU-V#E: 1.0 memory: ###.### GiB node:###.###.###.###: 1.0 object_store_memory: ##.### GiB tpu-group-0: 1.0
Desplegar el modelo con vLLM
Para implementar un modelo específico con vLLM, sigue estas instrucciones.
Llama-3-8B-Instruct
docker run \
--env MODEL_ID=${MODEL_ID} \
--net=host \
--volume=./tpu:/workspace/vllm/tpu \
-it \
${VLLM_IMAGE} \
serve run serve_tpu:model \
--address=ray://localhost:10001 \
--app-dir=./tpu \
--runtime-env-json='{"env_vars": {"MODEL_ID": "meta-llama/Meta-Llama-3-8B-Instruct"}}'
Mistral-7B
docker run \
--env MODEL_ID=${MODEL_ID} \
--env TOKENIZER_MODE=${TOKENIZER_MODE} \
--net=host \
--volume=./tpu:/workspace/vllm/tpu \
-it \
${VLLM_IMAGE} \
serve run serve_tpu:model \
--address=ray://localhost:10001 \
--app-dir=./tpu \
--runtime-env-json='{"env_vars": {"MODEL_ID": "mistralai/Mistral-7B-Instruct-v0.3", "TOKENIZER_MODE": "mistral"}}'
Llama 3.1 70B
docker run \
--env MAX_MODEL_LEN=${MAX_MODEL_LEN} \
--env MODEL_ID=${MODEL_ID} \
--net=host \
--volume=./tpu:/workspace/vllm/tpu \
-it \
${VLLM_IMAGE} \
serve run serve_tpu:model \
--address=ray://localhost:10001 \
--app-dir=./tpu \
--runtime-env-json='{"env_vars": {"MAX_MODEL_LEN": "8192", "MODEL_ID": "meta-llama/Meta-Llama-3.1-70B"}}'
Ver el panel de control de Ray
Puedes ver tu implementación de Ray Serve y los registros pertinentes en el panel de control de Ray.
- Haz clic en el botón
Vista previa web, que se encuentra en la parte superior derecha de la barra de tareas de Cloud Shell.
- Haz clic en Cambiar puerto y define el número de puerto como
8265
. - Haz clic en Cambiar y obtener vista previa.
- En el panel de control de Ray, haz clic en la pestaña Serve (Servir).
Cuando el despliegue de servicio tenga el estado HEALTHY
, el modelo estará listo para empezar a procesar entradas.
Aplicar el modelo
En esta guía se destacan los modelos que admiten la generación de texto, una técnica que permite crear contenido de texto a partir de una petición.
Llama-3-8B-Instruct
Configura la redirección de puertos al servidor:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &
Envía una petición al endpoint Serve:
curl -X POST http://localhost:8000/v1/generate -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'
Mistral-7B
Configura la redirección de puertos al servidor:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &
Envía una petición al endpoint Serve:
curl -X POST http://localhost:8000/v1/generate -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'
Llama 3.1 70B
Configura la redirección de puertos al servidor:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &
Envía una petición al endpoint Serve:
curl -X POST http://localhost:8000/v1/generate -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'
Configuración adicional
De forma opcional, puedes configurar los siguientes recursos y técnicas de servicio de modelos que admite el framework Ray Serve:
- Despliega un recurso personalizado de RayService. En los pasos anteriores de este tutorial, se usa RayCluster en lugar de RayService. Recomendamos RayService para entornos de producción.
- Compón varios modelos con la composición de modelos. Configurar la multiplexación y la composición de modelos compatibles con el framework Ray Serve. La composición de modelos te permite encadenar entradas y salidas en varios LLMs y escalar tus modelos como una sola aplicación.
- Crea y despliega tu propia imagen de TPU. Recomendamos esta opción si necesitas un control más preciso sobre el contenido de tu imagen de Docker.
Desplegar un RayService
Puedes desplegar los mismos modelos de este tutorial usando un recurso personalizado RayService.
Elimina el recurso personalizado RayCluster que has creado en este tutorial:
kubectl --namespace ${NAMESPACE} delete raycluster/vllm-tpu
Crea el recurso personalizado RayService para desplegar un modelo:
Llama-3-8B-Instruct
Inspecciona el archivo de manifiesto
ray-service.tpu-v5e-singlehost.yaml
:Aplica el archivo de manifiesto:
envsubst < tpu/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
El comando
envsubst
sustituye las variables de entorno del manifiesto.GKE crea un RayService con un
workergroup
que contiene una TPU v5e de un solo host en una topología2x4
.
Mistral-7B
Inspecciona el archivo de manifiesto
ray-service.tpu-v5e-singlehost.yaml
:Aplica el archivo de manifiesto:
envsubst < tpu/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
El comando
envsubst
sustituye las variables de entorno del manifiesto.GKE crea un RayService con un
workergroup
que contiene una TPU v5e de un solo host en una topología2x4
.
Llama 3.1 70B
Inspecciona el archivo de manifiesto
ray-service.tpu-v6e-singlehost.yaml
:Aplica el archivo de manifiesto:
envsubst < tpu/ray-service.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
El comando
envsubst
sustituye las variables de entorno del manifiesto.
GKE crea un recurso personalizado RayCluster en el que se despliega la aplicación Ray Serve y se crea el recurso personalizado RayService posterior.
Verifica el estado del recurso RayService:
kubectl --namespace ${NAMESPACE} get rayservices/vllm-tpu
Espera a que el estado del servicio cambie a
Running
:NAME SERVICE STATUS NUM SERVE ENDPOINTS vllm-tpu Running 1
Recupera el nombre del servicio principal de RayCluster:
SERVICE_NAME=$(kubectl --namespace=${NAMESPACE} get rayservices/vllm-tpu \ --template={{.status.activeServiceStatus.rayClusterStatus.head.serviceName}})
Establece
port-forwarding
sesiones en la montura Ray para ver el panel de control de Ray:pkill -f "kubectl .* port-forward .* 8265:8265" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8265:8265 2>&1 >/dev/null &
Limpia el recurso RayService:
kubectl --namespace ${NAMESPACE} delete rayservice/vllm-tpu
Crear varios modelos con la composición de modelos
La composición de modelos es una técnica que permite combinar varios modelos en una sola aplicación.
En esta sección, usarás un clúster de GKE para combinar dos modelos, Llama 3 8B IT y Gemma 7B IT, en una sola aplicación:
- El primer modelo es el modelo de asistente que responde a las preguntas formuladas en la petición.
- El segundo modelo es el modelo de resumen. La salida del modelo del asistente se encadena a la entrada del modelo de resumen. El resultado final es la versión resumida de la respuesta del modelo del asistente.
Para acceder al modelo Gemma, sigue estos pasos:
- Inicia sesión en la plataforma Kaggle, firma el contrato de licencia y obtén un token de la API de Kaggle. En este tutorial, usarás un secreto de Kubernetes para las credenciales de Kaggle.
- Accede a la página de consentimiento del modelo en Kaggle.com.
- Inicia sesión en Kaggle si aún no lo has hecho.
- Haz clic en Solicitar acceso.
- En la sección Choose Account for Consent (Elegir cuenta para el consentimiento), selecciona Verify via Kaggle Account (Verificar con la cuenta de Kaggle) para usar tu cuenta de Kaggle y dar el consentimiento.
- Acepta los Términos y Condiciones del modelo.
Configura tu entorno:
export ASSIST_MODEL_ID=meta-llama/Meta-Llama-3-8B-Instruct export SUMMARIZER_MODEL_ID=google/gemma-7b-it
En el caso de los clústeres estándar, crea un grupo de nodos de TPU de un solo host adicional:
gcloud container node-pools create tpu-2 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=MACHINE_TYPE \ --num-nodes=1
Sustituye
MACHINE_TYPE
por uno de los siguientes tipos de máquina:ct5lp-hightpu-8t
para aprovisionar la versión 5e de TPU.ct6e-standard-8t
para aprovisionar la versión 6e de TPU.
Los clústeres de Autopilot aprovisionan automáticamente los nodos necesarios.
Despliega el recurso RayService en función de la versión de TPU que quieras usar:
TPU v5e
Inspecciona el archivo de manifiesto
ray-service.tpu-v5e-singlehost.yaml
:Aplica el archivo de manifiesto:
envsubst < model-composition/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
TPU v6e
Inspecciona el archivo de manifiesto
ray-service.tpu-v6e-singlehost.yaml
:Aplica el archivo de manifiesto:
envsubst < model-composition/ray-service.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
Espera a que el estado del recurso RayService cambie a
Running
:kubectl --namespace ${NAMESPACE} get rayservice/vllm-tpu
El resultado debería ser similar al siguiente:
NAME SERVICE STATUS NUM SERVE ENDPOINTS vllm-tpu Running 2
En este resultado, el estado
RUNNING
indica que el recurso RayService está listo.Confirma que GKE ha creado el servicio para la aplicación Ray Serve:
kubectl --namespace ${NAMESPACE} get service/vllm-tpu-serve-svc
El resultado debería ser similar al siguiente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE vllm-tpu-serve-svc ClusterIP ###.###.###.### <none> 8000/TCP ###
Establece sesiones de
port-forwarding
con el encabezado de Ray:pkill -f "kubectl .* port-forward .* 8265:8265" pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/vllm-tpu-serve-svc 8265:8265 2>&1 >/dev/null & kubectl --namespace ${NAMESPACE} port-forward service/vllm-tpu-serve-svc 8000:8000 2>&1 >/dev/null &
Envía una solicitud al modelo:
curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What is the most popular programming language for machine learning and why?", "max_tokens": 1000}'
El resultado debería ser similar al siguiente:
{"text": [" used in various data science projects, including building machine learning models, preprocessing data, and visualizing results.\n\nSure, here is a single sentence summarizing the text:\n\nPython is the most popular programming language for machine learning and is widely used in data science projects, encompassing model building, data preprocessing, and visualization."]}
Crear y desplegar la imagen de TPU
En este tutorial se usan imágenes de TPU alojadas de vLLM. vLLM proporciona una imagen de Dockerfile.tpu
que crea vLLM sobre la imagen de PyTorch XLA necesaria, que incluye las dependencias de TPU. Sin embargo, también puedes crear e implementar tu propia imagen de TPU para tener un control más preciso sobre el contenido de tu imagen de Docker.
Crea un repositorio de Docker para almacenar las imágenes de contenedor de esta guía:
gcloud artifacts repositories create vllm-tpu --repository-format=docker --location=${COMPUTE_REGION} && \ gcloud auth configure-docker ${COMPUTE_REGION}-docker.pkg.dev
Clona el repositorio de vLLM:
git clone https://github.com/vllm-project/vllm.git cd vllm
Crea la imagen:
docker build -f ./docker/Dockerfile.tpu . -t vllm-tpu
Etiqueta la imagen de TPU con el nombre de Artifact Registry:
export VLLM_IMAGE=${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/vllm-tpu/vllm-tpu:TAG docker tag vllm-tpu ${VLLM_IMAGE}
Sustituye
TAG
por el nombre de la etiqueta que quieras definir. Si no especificas una etiqueta, Docker aplica la etiqueta predeterminada latest.Envía la imagen a Artifact Registry:
docker push ${VLLM_IMAGE}
Eliminar los recursos concretos
Si has usado un proyecto que ya existía y no quieres eliminarlo, puedes eliminar los recursos concretos.
Elimina el recurso personalizado RayCluster:
kubectl --namespace ${NAMESPACE} delete rayclusters vllm-tpu
Elimina el segmento de Cloud Storage:
gcloud storage rm -r gs://${GSBUCKET}
Elimina el repositorio de Artifact Registry:
gcloud artifacts repositories delete vllm-tpu \ --location=${COMPUTE_REGION}
Elimina el clúster:
gcloud container clusters delete ${CLUSTER_NAME} \ --location=LOCATION
Sustituye
LOCATION
por cualquiera de las siguientes variables de entorno:- En los clústeres de Autopilot, usa
COMPUTE_REGION
. - En los clústeres estándar, usa
COMPUTE_ZONE
.
- En los clústeres de Autopilot, usa
Eliminar el proyecto
Si has implementado el tutorial en un Google Cloud proyecto nuevo y ya no lo necesitas, elimínalo siguiendo estos pasos:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Siguientes pasos
- Descubre cómo ejecutar cargas de trabajo de IA y aprendizaje automático optimizadas con las funciones de orquestación de la plataforma GKE.
- Consulta el código de ejemplo en GitHub para saber cómo usar Ray Serve en GKE.
- Para saber cómo recoger y ver métricas de clústeres de Ray que se ejecutan en GKE, sigue los pasos que se indican en el artículo Recoger y ver registros y métricas de clústeres de Ray en GKE.