En este instructivo, se muestra cómo entregar un modelo de generación de imágenes de SDXL con unidades de procesamiento tensorial (TPU) en Google Kubernetes Engine (GKE) con MaxDiffusion. En este instructivo, descargarás el modelo de Hugging Face y, luego, lo implementarás en un clúster de Autopilot o Standard con un contenedor que ejecute MaxDiffusion.
Esta guía es un buen punto de partida si necesitas el control detallado, la personalización, la escalabilidad, la resiliencia, la portabilidad y la rentabilidad de Kubernetes administrado cuando implementas y entregas tus cargas de trabajo de IA/AA. Si necesitas una plataforma de IA administrada unificada para compilar y entregar modelos de AA con rapidez de forma rentable, te recomendamos que pruebes nuestra solución de implementación de Vertex AI.
Fondo
La entrega de SDXL con TPU en GKE con MaxDiffusion te permite compilar una solución de entrega sólida y lista para la producción con todos los beneficios de Kubernetes administrado, incluida la rentabilidad, la escalabilidad y una mayor disponibilidad. En esta sección, se describen las tecnologías clave que se usan en este instructivo.
Stable Diffusion XL (SDXL)
Stable Diffusion XL (SDXL) es un tipo de modelo de difusión latente (LDM) compatible con MaxDiffusion para la inferencia. Para la IA generativa, puedes usar LDM para generar imágenes de alta calidad a partir de descripciones de texto. Los LDM son útiles para aplicaciones como la búsqueda de imágenes y la leyenda de imágenes.
SDXL admite inferencia de uno o varios hosts con anotaciones de fragmentación. Esto permite que SDXL se entrene y se ejecute en varias máquinas, lo que puede mejorar la eficiencia.
Para obtener más información, consulta el repositorio de modelos generativos de Stability AI y el documento de SDXL.
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 el siguiente:TensorFlow, PyTorch yJAX.
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 SDXL. GKE
implementa el modelo en los nodos TPU v5e de host único con topologías de TPU configuradas
según los requisitos del modelo para entregar mensajes con baja latencia. En esta guía, el modelo usa un chip TPU v5e con una topología 1x1.
MaxDiffusion
MaxDiffusion es una colección de implementaciones de referencia, escritas en Python y Jax, de varios modelos de difusión latentes que se ejecutan en dispositivos XLA, incluidas TPU y GPU. MaxDiffusion es un punto de partida de los proyectos de difusión para la investigación y la producción.
Para obtener más información, consulta el repositorio de MaxDiffusion.
Objetivos
Este instructivo está dirigido a clientes de IA generativa que usan JAX, usuarios nuevos o existentes de SDXL e ingenieros de AA, ingenieros de MLOps (DevOps) o administradores de plataformas interesados en usar las funciones de organización de contenedores de Kubernetes para entrega de LLM.
En este instructivo, se abarcan los siguientes pasos:
- Crea un clúster de GKE en modo Autopilot o Standard con la topología de TPU recomendada según las características del modelo.
- Compilar una imagen de contenedor de inferencia de SDXL.
- Implementar el servidor de inferencia de SDXL en GKE.
- Entrega el modelo y, luego, interactúa con él a través de una app web.
Arquitectura
En esta sección, se describe la arquitectura de GKE que se usa en este instructivo. La arquitectura consiste en un clúster de GKE Autopilot o Standard que aprovisiona TPU y aloja componentes de MaxDiffusion. GKE usa estos componentes para implementar y entregar los modelos.
En el siguiente diagrama, se muestran los componentes de esta arquitectura:
Esta arquitectura incluye los siguientes componentes:
- Un clúster regional de GKE en modo Autopilot o Estándar.
- Un grupo de nodos de porción de TPU de host único que aloja el modelo SDXL en la implementación de MaxDiffusion.
- El componente Service con un balanceador de cargas de tipo
ClusterIP. Este servicio distribuye el tráfico entrante a todas las réplicas deMaxDiffusion HTTP. - El servidor
WebApp HTTPcon un ServiceLoadBalancerexterno que distribuye el tráfico entrante y redirecciona el modelo que entrega el tráfico al ServiceClusterIP.
Antes de comenzar
- Accede a tu cuenta de Google Cloud . Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the required APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the required APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Asegúrate de tener los siguientes roles en el proyecto: roles/container.admin, roles/iam.serviceAccountAdmin, roles/artifactregistry.admin, roles/cloudbuild.builds.editor
Verifica los roles
-
En la consola de Google Cloud , dirígete a la página IAM.
Ir a IAM - Selecciona el proyecto.
-
En la columna Principal, busca todas las filas que te identifiquen a ti o a un grupo en el que se te incluya. Para saber en qué grupos estás incluido, comunícate con tu administrador.
- Para todas las filas en las que se te especifique o se te incluya, verifica la columna Rol para ver si la lista de roles incluye los roles necesarios.
Otorga los roles
-
En la consola de Google Cloud , dirígete a la página IAM.
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.
- Haz clic en Seleccionar un rol y, luego, busca el rol.
- Para otorgar roles adicionales, haz clic en Agregar otro rol y agrega uno más.
- Haz clic en Guardar.
-
- Verifica que tengas suficiente cuota para los chips TPU v5e PodSlice Lite. En este instructivo, usarás instancias bajo demanda.
Prepare el entorno
En este instructivo, usarás Cloud Shell para administrar recursos alojados enGoogle Cloud. Cloud Shell tiene preinstalado el software que necesitarás para este instructivo, incluidos kubectl y la
CLI de gcloud.
Para configurar tu entorno con Cloud Shell, sigue estos pasos:
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 CLUSTER_VERSION=CLUSTER_VERSION export REGION=REGION_NAME export ZONE=ZONEReemplaza los siguientes valores:
- PROJECT_ID: Es el Google Cloud ID del proyecto.
- CLUSTER_NAME: Es el nombre del clúster de GKE.
- CLUSTER_VERSION : Es la versión de GKE. Debes especificar una versión de GKE que admita la TPU Trillium (v6e). Para obtener más información, consulta Cómo validar la disponibilidad de TPU en GKE.
- REGION_NAME: La región 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 v5e están disponibles (por ejemplo,
us-west1,us-west4,us-central1,us-east1,us-east5oeurope-west4). - (Solo clúster estándar) ZONE: Es la zona en la que los recursos de TPU están disponibles (por ejemplo,
us-west4-a). Para los clústeres en modo Autopilot, no necesitas especificar la zona, solo la región.
Clona el repositorio de ejemplo y abre el directorio del instructivo:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/ai-ml/maxdiffusion-tpu WORK_DIR=$(pwd) gcloud artifacts repositories create gke-llm --repository-format=docker --location=$REGION gcloud auth configure-docker $REGION-docker.pkg.dev
Crea y configura recursos de Google Cloud
Sigue estas instrucciones para crear los recursos necesarios.
Cree un clúster de GKE
Puedes entregar SDXL en TPU en un clúster de GKE Autopilot o Standard. Te recomendamos que uses un clúster de Autopilot para una experiencia de Kubernetes completamente administrada. Para elegir el modo de operación de GKE que se adapte mejor a tus cargas de trabajo, consulta Elige un modo de operación de GKE.
Autopilot
En Cloud Shell, ejecuta el siguiente comando:
gcloud container clusters create-auto ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --location=${REGION} \ --release-channel=rapid \ --cluster-version=${CLUSTER_VERSION}GKE crea un clúster en modo Autopilot con nodos de CPU y TPU según lo solicitan las cargas de trabajo implementadas.
Configura
kubectlpara comunicarse con tu clúster:gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${REGION}
Estándar
Crea un clúster de GKE Estándar regional que use la federación de identidades para cargas de trabajo en GKE.
gcloud container clusters create ${CLUSTER_NAME} \ --enable-ip-alias \ --machine-type=n2-standard-4 \ --num-nodes=2 \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --location=${REGION}La creación del clúster puede tomar varios minutos.
Ejecuta el siguiente comando para crear un grupo de nodos para el clúster:
gcloud container node-pools create maxdiffusion-tpu-nodepool \ --cluster=${CLUSTER_NAME} \ --machine-type=ct5lp-hightpu-1t \ --num-nodes=1 \ --location=${REGION} \ --node-locations=${ZONE} \ --spotGKE crea un grupo de nodos TPU v5e con una topología
1x1y un nodo.Para crear grupos de nodos con diferentes topologías, aprende a planificar tu configuración de TPU. Asegúrate de actualizar los valores de muestra de este instructivo, como
cloud.google.com/gke-tpu-topologyygoogle.com/tpu.Configura
kubectlpara comunicarse con tu clúster:gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${REGION}
Compila el contenedor de inferencia de SDXL
Sigue estas instrucciones a fin de compilar una imagen de contenedor para el servidor de inferencia de SDXL.
Abre el manifiesto
build/server/cloudbuild.yaml:Ejecuta la compilación y crea una imagen de contenedor de inferencia.
cd $WORK_DIR/build/server gcloud builds submit . --region=$REGIONEl resultado contiene la ruta de la imagen de contenedor.
Implementa el servidor de inferencia de SDXL
En esta sección, implementarás el servidor de inferencia de SDXL. Para implementar el servidor, en este instructivo se usa una implementación de Kubernetes. Un Deployment es un objeto de la API de Kubernetes que te permite ejecutar varias réplicas de Pods que se distribuyen entre los nodos de un clúster.
Explora el manifiesto
serve_sdxl_v5e.yaml.Actualiza el ID del proyecto en el manifiesto.
cd $WORK_DIR perl -pi -e 's|PROJECT_ID|PROJECT_ID|g' serve_sdxl_v5e.yaml perl -pi -e 's|REGION|REGION_NAME|g' serve_sdxl_v5e.yamlAplica el manifiesto
kubectl apply -f serve_sdxl_v5e.yamlEl resultado es similar a este:
deployment.apps/max-diffusion-server createdVerifica el estado del modelo:
kubectl get deploy --watchEl resultado es similar a este:
NAME READY UP-TO-DATE AVAILABLE AGE stable-diffusion-deployment 1/1 1 1 8m21sRecupera la dirección
ClusterIP:kubectl get service max-diffusion-serverEl resultado contiene un campo
ClusterIP. Anota el valor CLUSTER-IP.Valida el Deployment:
export ClusterIP=CLUSTER_IP kubectl run curl --image=curlimages/curl \ -it --rm --restart=Never \ -- "$ClusterIP:8000"Reemplaza CLUSTER_IP por el valor CLUSTER-IP que anotaste antes. El resultado es similar a este:
{"message":"Hello world! From FastAPI running on Uvicorn with Gunicorn."} pod "curl" deletedVisualiza los registros desde el Deployment:
kubectl logs -l app=max-diffusion-serverCuando el Deployment finaliza, el resultado es similar al siguiente:
2024-06-12 15:45:45,459 [INFO] __main__: replicate params: 2024-06-12 15:45:46,175 [INFO] __main__: start initialized compiling 2024-06-12 15:45:46,175 [INFO] __main__: Compiling ... 2024-06-12 15:45:46,175 [INFO] __main__: aot compiling: 2024-06-12 15:45:46,176 [INFO] __main__: tokenize prompts:2024-06-12 15:48:49,093 [INFO] __main__: Compiled in 182.91802048683167 INFO: Started server process [1] INFO: Waiting for application startup. INFO: Application startup complete.
Implementa el cliente de webapp
En esta sección, implementarás el cliente de webapp para entregar el modelo SDXL.
Explora el manifiesto
build/webapp/cloudbuild.yaml.Ejecuta la compilación y crea la imagen de contenedor de cliente en el directorio
build/webapp.cd $WORK_DIR/build/webapp gcloud builds submit . --region=$REGIONEl resultado contiene la ruta de la imagen de contenedor.
Abre el manifiesto
serve_sdxl_client.yaml:Edita el ID del proyecto en el manifiesto:
cd $WORK_DIR perl -pi -e 's|PROJECT_ID|PROJECT_ID|g' serve_sdxl_client.yaml perl -pi -e 's|ClusterIP|CLUSTER_IP|g' serve_sdxl_client.yaml perl -pi -e 's|REGION|REGION_NAME|g' serve_sdxl_client.yamlAplica el manifiesto
kubectl apply -f serve_sdxl_client.yamlRecupera la dirección IP
LoadBalancer:kubectl get service max-diffusion-client-serviceEl resultado contiene un campo
LoadBalancer. Toma nota del valor de EXTERNAL-IP.
Interactúa con el modelo mediante la página web
Acceso a la siguiente URL desde un navegador web:
http://EXTERNAL_IP:8080Reemplaza EXTERNAL_IP por el valor de
EXTERNAL_IPque anotaste antes.Interactuar con SDXL mediante la interfaz de chat. Agrega una instrucción y haz clic en Enviar. Por ejemplo:
Create a detailed image of a fictional historical site, capturing its unique architecture and cultural significance
El resultado es una imagen generada por un modelo similar al siguiente ejemplo:

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 el proyecto
- En la Google Cloud consola, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.
Borra los recursos individuales
Conserva el proyecto y borra los recursos individuales, como se describe en la siguiente sección. Ejecuta los siguientes comandos y sigue las instrucciones:
gcloud container clusters delete ${CLUSTER_NAME} --location=${REGION}
¿Qué sigue?
- Configura el instructivo con otras topologías de TPU. Para obtener más información sobre otras topologías de TPU, consulta Planifica tu configuración de TPU.
- Explora el código de muestra del servidor de inferencia de MaxDiffusion en el repositorio de muestra que clonaste en este instructivo.
- Obtén más información sobre las TPU en GKE.
- Explora el repositorio de GitHub de JetStream.
- Explora Vertex AI Model Garden.