En esta guía, se muestra cómo entregar modelos de lenguaje grandes (LLMs) de vanguardia, como Llama 3.1 405B, en Google Kubernetes Engine (GKE) con unidades de procesamiento tensorial (TPUs) en varios nodos.
En esta guía, se muestra cómo usar tecnologías portátiles de código abierto (Kubernetes, JetStream, Pathways on Cloud y la API de LeaderWorkerSet [LWS]) para implementar y entregar cargas de trabajo de IA/AA en GKE, aprovechando el control detallado, la escalabilidad, la resiliencia, la portabilidad y la rentabilidad de GKE.
Fondo
Los modelos de lenguaje grandes crecieron en tamaño y ya no caben en una sola porción de TPU de host. Para la inferencia de AA, puedes usar Pathways en Cloud para ejecutar inferencias a gran escala con varios hosts en GKE en varios nodos de TPU interconectados. En esta guía, aprenderás a aprovisionar un clúster de GKE con las porciones de TPU de varios hosts y a usar los archivos binarios de Pathways on Cloud, iniciar el servidor de JetStream con el framework de MaxText y realizar solicitudes de inferencia de varios hosts.
Con la entrega de un LLM con TPU en GKE con JetStream, MaxText y Pathways, puedes compilar una solución de entrega sólida y lista para la producción con todos los beneficios de Kubernetes administrado, incluida la rentabilidad, escalabilidad y disponibilidad mayor. En esta sección, se describen las tecnologías clave que se usan en este instructivo.
Acerca de las TPU
Las TPU son circuitos integrados personalizados específicos de aplicaciones (ASIC) de Google que se usan para acelerar el aprendizaje automático y los modelos de IA compilados con frameworks como TensorFlow, PyTorch y JAX.
Antes de usar las TPU en GKE, te recomendamos que completes la siguiente ruta de aprendizaje:
- Obtén información sobre la disponibilidad actual de la versión de TPU con la arquitectura del sistema de Cloud TPU.
- Obtén información sobre las TPU en GKE.
En este instructivo, se aborda la entrega del modelo Llama 3.1-405B. GKE implementa el modelo en los nodos TPU v6e de varios hosts con topologías de TPU configuradas según los requisitos del modelo para entregar mensajes con baja latencia.
Rutas de aprendizaje en Cloud
Pathways es una capa de organización a gran escala para aceleradores. Pathways está diseñado explícitamente para permitir la exploración de nuevos sistemas e ideas de investigación de AA, al tiempo que conserva el rendimiento de vanguardia para los modelos actuales. Pathways permite que un solo proceso cliente de JAX coordine la computación en una o más porciones de TPU grandes, lo que optimiza los cálculos de AA que abarcan cientos o miles de chips de TPU.
JetStream
JetStream es un framework de entrega de inferencia de código abierto que desarrolla Google. JetStream permite la inferencia de alto rendimiento, alta capacidad de procesamiento y con optimización de memoria en TPU y GPU. JetStream proporciona optimizaciones de rendimiento avanzadas, incluidas técnicas de procesamiento por lotes, optimizaciones de la caché de KV y de cuantización continuas, para facilitar la implementación de LLM. JetStream permite que PyTorch/XLA y JAX TPU entreguen un rendimiento óptimo.
MaxText
MaxText es una implementación de LLM JAX escalable y adaptable, compilada en bibliotecas JAX de código abierto como Flax, Orbax y Optax. La implementación de LLM solo de decodificador de MaxText se escribe en Python. Aprovecha en gran medida el compilador XLA para lograr un alto rendimiento sin necesidad de compilar kernels personalizados.
Para obtener más información sobre los modelos y tamaños de parámetros más recientes que admite MaxText, consulta el repositorio del proyecto de MaxText.
Llama 3.1 405b
Llama 3.1 405B es un modelo de lenguaje grande de Meta diseñado para una variedad de tareas de procesamiento de lenguaje natural, como la generación de texto, la traducción y la respuesta de preguntas. GKE ofrece la infraestructura necesaria para admitir las necesidades de entrenamiento y entrega distribuidos de modelos de esta escala.
Para obtener más información, consulta la documentación de Llama.
Arquitectura
En esta sección, se describe la arquitectura de GKE que se usa en este instructivo. La arquitectura incluye un clúster de GKE Standard que aprovisiona TPU y aloja componentes de JetStream y Pathways para implementar y entregar el modelo.
En el siguiente diagrama, se muestran los componentes de esta arquitectura:
Esta arquitectura incluye los siguientes componentes:
- Un clúster regional de GKE Standard.
- Un grupo de nodos de porción de TPU de varios hosts que aloja los componentes de implementación y de Pathways de JetStream.
Pathways resource manager
administra los recursos del acelerador y coordina la asignación de aceleradores para los trabajos del usuario.- El objeto
Pathways client
se coordina con el objetoPathways resource manager
para determinar dónde se colocan los programas compilados para su ejecución. - El
Pathways worker
se ejecuta y realiza cálculos en máquinas aceleradoras, y envía datos de vuelta a tu carga de trabajo a través del servidor proxy de IFRT. - El
IFRT proxy client
implementa la API de Interim Framework Runtime (IFRT) de OSS y actúa como puente de comunicación entre tu carga de trabajo y los componentes de Pathways. - El
IFRT proxy server
recibe solicitudes delIFRT proxy client
y las reenvía alPathways client
, distribuyendo el trabajo. - El contenedor
JetStream-Pathways
proporciona un servidor de inferencia basado en JAX que recibe solicitudes de inferencia y delega sus procesos de ejecución enPathways workers
. - El componente de Service distribuye el tráfico entrante a todas las réplicas de
JetStream HTTP
. JetStream HTTP
es un servidor HTTP que acepta solicitudes como wrapper del formato requerido de JetStream y las envía al cliente GRPC de JetStream.
Antes de comenzar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the required API.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the required API.
-
Make sure that you have the following role or roles on the project: roles/container.admin, roles/iam.serviceAccountAdmin, roles/resourcemanager.projectIamAdmin
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
Ir a IAM - Selecciona el proyecto.
- Haz clic en Otorgar acceso.
-
En el campo Principales nuevas, ingresa tu identificador de usuario. Esta suele ser la dirección de correo electrónico de una Cuenta de Google.
- En la lista Seleccionar un rol, elige uno.
- Para otorgar roles adicionales, haz clic en Agregar otro rol y agrega uno más.
- Haz clic en Guardar.
- Asegúrate de tener suficiente cuota para dieciséis chips TPU v6e PodSlice Lite. En este instructivo, usarás instancias bajo demanda.
- Asegúrate de que tu proyecto Google Cloud esté en la lista de entidades permitidas para Pathways.
- Firma el acuerdo de consentimiento de licencia.
- Accede a la página de descargas de Meta Llama.
- Revisa y acepta los Términos y Condiciones del modelo para obtener la URL necesaria para descargarlo.
- Para descargar el punto de control del modelo, busca el ID del modelo correspondiente. Para obtener una lista de los modelos compatibles y sus IDs, consulta la documentación de la CLI de Llama. Por ejemplo, usa Llama 3.1-405B-Instruct:bf16-mp16 para el modelo Llama 3.1-405B.
En la Google Cloud consola, haz clic en
Activar Cloud Shell en la Google Cloud consola para iniciar una sesión de Cloud Shell. Esto inicia una sesión en el panel inferior de la consola de Google Cloud .
Configura las variables de entorno predeterminadas:
gcloud config set project PROJECT_ID gcloud config set billing/quota_project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export CLUSTER_NAME=CLUSTER_NAME export BUCKET_NAME=BUCKET_NAME export CONTROL_PLANE_LOCATION=CONTROL_PLANE_LOCATION export NODE_LOCATION=NODE_LOCATION export CLUSTER_VERSION=CLUSTER_VERSION export MACHINE_TYPE=ct6e-standard-4t export TPU_TYPE=v6e export TOPOLOGY=4x4 export WORKERS_PER_SLICE=4
Reemplaza los siguientes valores:
PROJECT_ID
: El Google Cloud ID del proyecto.CLUSTER_NAME
: Es el nombre del clúster de GKE.BUCKET_NAME
: Es el nombre de tu bucket de Cloud Storage. No es necesario especificar el prefijogs://
.CONTROL_PLANE_LOCATION
: Es la región de Compute Engine en la que se encuentran el clúster de GKE, el bucket de Cloud Storage y los nodos TPU. La región contiene zonas en las que los tipos de máquinas de TPU v6e están disponibles (por ejemplo,us-east1
,us-east5
,europe-west4
,asia-northeast1
ous-south1
).NODE_LOCATION
: Es la zona en la que los recursos de TPU están disponibles (por ejemplo,us-east1-d
).CLUSTER_VERSION
: la versión de GKE, que debe ser compatible con el tipo de máquina que deseas usar. Ten en cuenta que es posible que la versión predeterminada de GKE no tenga disponibilidad para la TPU de destino. Para obtener una lista de las versiones mínimas de GKE disponibles por tipo de máquina de TPU, consulta disponibilidad de TPU en GKE.MACHINE_TYPE
: Es el tipo de máquina v6e.TPU_TYPE
: Es un prefijo que se usa para nombrar grupos de nodos (v6e).TOPOLOGY
: Es la topología de la TPU v6e.WORKERS_PER_SLICE
: Es la cantidad de nodos por grupo de nodos o porción de TPU.
Crea un clúster de GKE Standard regional:
gcloud container clusters create CLUSTER_NAME \ --project=PROJECT_ID \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATION \ --scopes=cloud-platform \ --machine-type=n2-standard-32
La creación del clúster puede tomar varios minutos.
Reemplaza
CLUSTER_VERSION
por la versión del clúster adecuada.Crea un grupo de nodos TPU v6e con una topología
4x4
y cuatro nodos cada uno:gcloud container node-pools create multihost-np \ --project=PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --node-locations=NODE_LOCATION \ --cluster=CLUSTER_NAME \ --machine-type=MACHINE_TYPE \ --num-nodes=WORKERS_PER_SLICE \ --tpu-topology=TOPOLOGY \ --scopes cloud-platform \ --placement-type=COMPACT \ --workload-metadata=GCE_METADATA
Crea una cuenta de servicio de IAM para tu aplicación:
gcloud iam service-accounts create jetstream-pathways
Agrega una vinculación de política de IAM para que tu cuenta de servicio de IAM administre Cloud Storage. Esto permite que tu cuenta de servicio de IAM acceda al bucket de almacenamiento en el que se guardará tu punto de control:
gcloud projects add-iam-policy-binding ${PROJECT} \ --member "serviceAccount:jetstream-pathways@${PROJECT}.iam.gserviceaccount.com" \ --role roles/storage.objectUser gcloud projects add-iam-policy-binding ${PROJECT} \ --member "serviceAccount:jetstream-pathways@${PROJECT}.iam.gserviceaccount.com" \ --role roles/storage.insightsCollectorService
Anota la cuenta de servicio de Kubernetes con la dirección de correo electrónico de la cuenta de servicio de IAM.
kubectl annotate serviceaccount default \ iam.gke.io/gcp-service-account=jetstream-pathways@${PROJECT}.iam.gserviceaccount.com
Guarda el siguiente manifiesto como
jetstream-pathways-llama-3-1-405b-4x4.yaml
:Establece el valor del campo
load_parameters_path
en la ruta de acceso del punto de control que se produjo en el proceso de conversión del punto de control.- Para un punto de control bf16, la ruta debe ser similar a
gs://OUTPUT_BUCKET_DIRECTORY/bf16/unscanned/checkpoints/0/items
. - Para un punto de control de int8, debería ser similar a
gs://OUTPUT_BUCKET_DIRECTORY/int8
.
Establece el valor del campo
gcs_scratch_location
en el bucket de Pathways que creaste anteriormente.perl -pi -e 's|CHECKPOINT_PATH|gs://OUTPUT_BUCKET_DIRECTORY/int8|g' jetstream-pathways-llama-3-1-405b-4x4.yaml perl -pi -e 's|PATHWAYS_BUCKET|gs://PATHWAYS_BUCKET|g' jetstream-pathways-llama-3-1-405b-4x4.yaml
- Para un punto de control bf16, la ruta debe ser similar a
- Se implementó el servidor de modelos de JetStream con MaxText y Pathways en GKE con TPU.
- Se creó un punto de control int8 de Llama 3.1-405B en
gs://BUCKET_NAME
. - Se entregó el modelo y se interactuó con él.
Prefill: Es un pase hacia adelante en la instrucción de entrada para inicializar la caché de pares clave-valor.
Decodificación: Es un procedimiento que genera tokens de salida de forma incremental, un token por paso y un valor de KV-cache por iteración.
Configura las variables de entorno predeterminadas:
export NODE_POOL_NAME=dis-v6e-8 export NODE_POOL_SIZE=2 export MACHINE_TYPE=ct6e-standard-4t export TOPOLOGY=2x4 export WORKERS_PER_SLICE=2
Crea dos grupos de nodos que usen nodos
v6e-8
:for i in $(seq 1 NODE_POOL_SIZE); do gcloud container node-pools create NODE_POOL_NAME-${i}-np \ --project=PROJECT \ --cluster=CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --node-locations=NODE_LOCATION \ --machine-type=MACHINE_TYPE \ --num-nodes=WORKERS_PER_SLICE \ --tpu-topology=TOPOLOGY \ --scopes=cloud-platform \ --workload-metadata=GCE_METADATA done
Guarda el siguiente manifiesto como
jetstream-pathways-disagg-llama-2-70b-2-2x4.yaml
:Establece el valor del campo
load_parameters_path
en la ruta de acceso del punto de control que se produjo en el proceso de conversión del punto de control.- Para un punto de control bf16, la ruta debe ser similar a
gs://OUTPUT_BUCKET_DIRECTORY/bf16/unscanned/checkpoints/0/items
. - Para un punto de control de int8, debería ser similar a
gs://OUTPUT_BUCKET_DIRECTORY/int8
.
Establece el valor del campo
gcs_scratch_location
en el bucket de Pathways que creaste anteriormente.perl -pi -e 's|CHECKPOINT_PATH|BUCKET_NAME/maxtext/llama-2-70b/int8|g' jetstream-pathways-disagg-llama-2-70b-2-2x4.yaml perl -pi -e 's|PATHWAYS_BUCKET|gs://PATHWAYS_BUCKET|g' jetstream-pathways-disagg-llama-2-70b-2-2x4.yaml
- Para un punto de control bf16, la ruta debe ser similar a
Aplica el manifiesto
kubectl apply -f jetstream-pathways-disagg-llama-2-70b-2-2x4.yaml
El servidor del modelo puede tardar un tiempo en restablecer el punto de control, según su tamaño. Un modelo de 70B puede tardar unos 8 minutos en restablecer el punto de control, incluido el calentamiento del modelo. Puedes observar los registros para determinar el punto de preparación verificando el inicio del servidor del modelo y publicando el modelo configurando el reenvío de puertos para que puedas interactuar con el modelo.
- Se implementó el servidor de modelos de JetStream con MaxText y Pathways en GKE con TPU y entrega desagregada.
- Se creó un punto de control int8 de Llama 2-70B en
gs://BUCKET_NAME
. - Se entregó el modelo y se interactuó con él.
- Si recibes el mensaje
Empty reply from server
, es posible que el contenedor no haya terminado de descargar los datos del modelo. Vuelve a verificar los registros del Pod en busca del mensajeConnected
, que indica que el modelo está listo para entregar. - Si ves el mensaje
Connection refused
, verifica que tu redirección de puertos esté activa. - Descubre cómo puedes ejecutar modelos de Gemma en GKE y cómo ejecutar cargas de trabajo de IA/AA optimizadas con las funciones de organización de la plataforma de GKE.
- Obtén más información sobre las TPU en GKE.
- Explora el repositorio de GitHub de JetStream.
- Explora Vertex AI Model Garden.
Obtén acceso al modelo
Para acceder al punto de control de Meta Llama 3.1-405B para la implementación en GKE, sigue estos pasos:
Prepare el entorno
En este instructivo, usarás Cloud Shell para administrar recursos alojados enGoogle Cloud. Cloud Shell tiene preinstalado el software que necesitas para este instructivo, incluidos
kubectl
y la CLI de gcloud.Para configurar tu entorno con Cloud Shell, sigue estos pasos:
Crea y configura recursos de Google Cloud
Para crear los recursos necesarios, sigue estas instrucciones:
Crea un clúster de GKE
Configura una cuenta de servicio para acceder a objetos de Storage
Configura una cuenta de servicio de Kubernetes para que actúe como una cuenta de servicio de IAM.
Configura Docker para que se autentique en Artifact Registry
Configura Docker para que se autentique en Artifact Registry y pueda extraer las imágenes de Pathways incluidas en la lista de entidades permitidas:
gcloud auth login gcloud auth configure-docker
Conversión de punto de control
Para convertir un punto de control de Meta Llama 3.1-405B en un punto de control de inferencia int8 compatible con MaxText, completa los pasos que se indican en Conversión de puntos de control con Llama3.1-405B. Tu implementación usa el punto de control con la marca
load_parameters_path
.Crea un bucket de Cloud Storage para almacenar archivos temporales de Pathways
Crea un bucket de Cloud Storage para almacenar tus archivos temporales de Pathways, como la caché de compilación:
export PATHWAYS_BUCKET=PATHWAYS_BUCKET gcloud storage buckets create gs://$PATHWAYS_BUCKET
Implementa JetStream-MaxText y Pathways
Implementa el servidor de modelos de JetStream-MaxText y Pathways.
Conéctate al clúster de GKE
gcloud container clusters get-credentials "${CLUSTER}" --project "${PROJECT}" --location "${ZONE}"
Implementa la API de LeaderWorkerSet (LWS)
LWS es un recurso personalizado diseñado para implementar y administrar aplicaciones distribuidas y con estado, en particular, aquellas con una arquitectura de líder-trabajador. Es especialmente adecuado para cargas de trabajo de IA/AA en las que un modelo grande se fragmenta y se entrega en varios dispositivos en varios nodos.
VERSION=v0.6.1 kubectl apply --server-side -f https://github.com/kubernetes-sigs/lws/releases/download/$VERSION/manifests.yaml
Espera a que el controlador LeaderWorkerSet esté completamente disponible:
kubectl wait deploy/lws-controller-manager -n lws-system --for=condition=available --timeout=5m
El resultado debería ser similar al siguiente ejemplo:
deployment.apps/lws-controller-manager condition met
Valida que el controlador LeaderWorkerSet se ejecute en el espacio de nombres
lws-system
:kubectl get pod -n lws-system
El resultado debería ser similar al siguiente ejemplo:
NAME READY STATUS RESTARTS AGE lws-controller-manager-abcd 1/1 Running 0 40s lws-controller-manager-efgh 1/1 Running 0 40s
Implementa el manifiesto de la carga de trabajo
Aplica el manifiesto de Deployment
Aplica el manifiesto para implementar el servidor:
kubectl apply -f jetstream-pathways-llama-3-1-405b-4x4.yaml
Se debería iniciar el servidor de modelos.
Verifica el inicio del servidor de modelos
Un modelo 405B puede tardar entre 10 y 20 minutos en restablecer el punto de control. También es posible que debas esperar más tiempo durante el calentamiento del modelo si habilitaste la marca
enable_model_warmup
.kubectl logs -f jetstream-pathways-0 -c jax-tpu
El resultado es similar a este:
2025-03-02 02:15:07,682 - JetstreamLogger - INFO - Initializing the driver with 1 prefill engines and 1 generate engines in interleaved mode 2025-03-02 02:15:07,683 - JetstreamLogger - INFO - Spinning up prefill thread 0. 2025-03-02 02:15:07,683 - JetstreamLogger - INFO - Spinning up transfer thread 0. 2025-03-02 02:15:07,684 - JetstreamLogger - INFO - Spinning up generate thread 0. 2025-03-02 02:15:07,684 - JetstreamLogger - INFO - Spinning up detokenize thread 0. 2025-03-02 02:15:07,685 - JetstreamLogger - INFO - Driver initialized. ... ... ... INFO: Started server process [7] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:9999 (Press CTRL+C to quit)
Cómo publicar Llama 3.1-405b
Para entregar el modelo Llama 3.1-405b, configura la redirección de puertos:
kubectl port-forward svc/jetstream-svc 8000:8000
El reenvío de puertos te permite acceder al Service desde fuera del clúster. Puedes acceder a la implementación de JetStream-Pathways a través del servicio ClusterIP de GKE. Solo se puede acceder a los servicios de ClusterIP desde el clúster.
Interactúa con el modelo
En una terminal nueva, ejecuta el siguiente comando:
curl --request POST \ --header "Content-type: application/json" \ -s \ localhost:8000/generate \ --data \ '{ "prompt": "What are the top 5 programming languages", "max_tokens": 200 }'
La solicitud inicial puede tardar varios segundos en completarse debido a la preparación del modelo. El resultado debería ser similar al siguiente ejemplo:
{ "response": " for web development?\nThe top 5 programming languages for web development are:\n1. **JavaScript**: JavaScript is the most popular language for web development, used by over 90% of websites for client-side scripting. It's also popular for server-side programming with technologies like Node.js.\n2. **HTML/CSS**: HTML (Hypertext Markup Language) and CSS (Cascading Style Sheets) are not programming languages, but are essential for building websites. HTML is used for structuring content, while CSS is used for styling and layout.\n3. **Python**: Python is a popular language for web development, especially with frameworks like Django and Flask. It's known for its simplicity, flexibility, and large community of developers.\n4. **Java**: Java is a popular language for building enterprise-level web applications, especially with frameworks like Spring and Hibernate. It's known for its platform independence, strong security features, and large community of developers.\n5. **PHP**: PHP is a mature language for web" }
Completaste correctamente lo siguiente:
Publicación desagregada
La entrega desagregada es una técnica para entregar LLMs mientras se dividen las etapas de precompletado y decodificación en diferentes hosts. Este enfoque optimiza el uso de recursos, lo que puede mejorar la capacidad de procesamiento y la latencia.
Conversión de punto de control
Para convertir un punto de control de Meta Llama 2-70B en un punto de control de inferencia int8 compatible con MaxText, completa los pasos que se indican en Conversión de puntos de control con Llama2-70B. Selecciona Llama2-70B como tu modelo cuando confirmes los Términos y Condiciones de Meta. Tu implementación usa el punto de control con la marca
load_parameters_path
.Reemplaza los siguientes parámetros en tu archivo
checkpoint-job.yaml
:- --meta_url=META_URL - --model_name=llama-2 - --model_path=Llama-2-70b-chat - --output_directory=gs://BUCKET_NAME/maxtext/llama-2-70b
El punto de control se usará en tu implementación con la marca
load_parameters_path
.Implementa JetStream Pathways con la entrega desagregada
Completaste correctamente lo siguiente:
Soluciona problemas
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra los recursos implementados
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que creaste en esta guía, ejecuta los siguientes comandos y sigue las indicaciones:
gcloud container clusters delete CLUSTER_NAME --location=CONTROL_PLANE_LOCATION gcloud iam service-accounts delete jetstream-pathways@PROJECT_ID.iam.gserviceaccount.com gcloud storage rm --recursive gs://BUCKET_NAME
¿Qué sigue?
-