En esta guía, se muestra cómo optimizar los costos de las cargas de trabajo de entrega de LLM en GKE. En este instructivo, se usa una combinación de perfiles de clase de procesamiento personalizados, VMs Spot y flex-start para realizar inferencias rentables.
En esta guía, se usa Mixtral 8x7b como ejemplo de LLM que puedes implementar.
Esta guía está dirigida a ingenieros de aprendizaje automático (AA), administradores y operadores de plataformas, y especialistas en datos y en IA que estén interesados en usar las capacidades de organización de contenedores de Kubernetes para entregar LLM. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud , consulta Tareas y roles comunes de los usuarios de GKE Enterprise.
Precios de inicio flexible
Se recomienda el inicio flexible si tu carga de trabajo requiere recursos aprovisionados de forma dinámica según sea necesario, por hasta siete días con reservas a corto plazo, sin administración compleja de cuotas y con acceso rentable. El inicio flexible cuenta con la tecnología del programador dinámico de cargas de trabajo y se factura según los precios del programador dinámico de cargas de trabajo:
- Descuento (hasta un 53%) en CPU virtuales, GPU y TPU.
- Pagas por lo que usas.
Fondo
En esta sección, se describen las técnicas disponibles que puedes usar para obtener recursos de procesamiento, incluidos los aceleradores de GPU, según los requisitos de tus cargas de trabajo de IA/AA. En GKE, estas técnicas se denominan estrategias de obtención de aceleradores.
GPU
Las unidades de procesamiento gráfico (GPU) te permiten acelerar cargas de trabajo específicas, como el aprendizaje automático y el procesamiento de datos. GKE ofrece nodos equipados con estas potentes GPUs para optimizar el rendimiento de las tareas de aprendizaje automático y procesamiento de datos. GKE proporciona una variedad de opciones de tipo de máquina para la configuración de nodos, incluidos los tipos de máquinas con GPUs NVIDIA H100, A100 y L4.
Para obtener más información, consulta Acerca de las GPUs en GKE.
Modo de aprovisionamiento de inicio flexible
El modo de aprovisionamiento de inicio flexible, potenciado por el programador dinámico de cargas de trabajo, es un tipo de consumo de GPU en el que GKE conserva tu solicitud de GPU y aprovisiona recursos automáticamente cuando hay capacidad disponible. Considera usar la opción de inicio flexible para las cargas de trabajo que necesitan capacidad de GPU por un tiempo limitado, de hasta siete días, y no tienen una fecha de inicio fija. Para obtener más información, consulta flex-start.
VMs Spot
Puedes usar GPUs con VMs Spot si tus cargas de trabajo pueden tolerar interrupciones frecuentes en los nodos. Usar VMs Spot o flex-start reduce el precio de la ejecución de GPUs. El uso de VMs Spot en combinación con el inicio flexible proporciona una opción de respaldo cuando la capacidad de las VMs Spot no está disponible.
Para obtener más información, consulta Cómo usar VMs Spot con grupos de nodos de GPU.
Clases de procesamiento personalizadas
Puedes solicitar GPUs con clases de procesamiento personalizadas. Las clases de procesamiento personalizadas te permiten definir una jerarquía de configuraciones de nodos para que GKE las priorice durante las decisiones de escalamiento de nodos, de modo que las cargas de trabajo se ejecuten en el hardware que seleccionaste. Para obtener más información, consulta Acerca de las clases de procesamiento personalizadas.
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.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Make sure that you have the following role or roles on the project:
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 Grant access.
-
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 un rol.
- Para otorgar funciones adicionales, haz clic en Agregar otro rol y agrega cada rol adicional.
- Haz clic en Guardar.
-
- Asegúrate de tener un clúster de GKE Autopilot o Standard que ejecute la versión 1.32.2-gke.1652000 o posterior. Tu clúster debe habilitar el aprovisionamiento automático de nodos y configurar los límites de GPU.
- Crea una cuenta de Hugging Face, si todavía no la tienes.
- Asegúrate de que tu proyecto tenga la cuota suficiente para las GPU de NVIDIA L4. Para obtener más información, consulta Acerca de las GPU y Cuotas de asignación.
Obtén acceso al modelo
Si aún no tienes uno, genera un nuevo token de Hugging Face:
- Haz clic en Tu perfil > Configuración > Tokens de acceso.
- Selecciona Token nuevo.
- Especifica el nombre que desees y un rol de al menos
Read
. - Selecciona Generate un token.
Crea un perfil de clase de procesamiento personalizado
En esta sección, crearás un perfil de clase de procesamiento personalizado. Los perfiles de clase de procesamiento personalizados definen los tipos y las relaciones entre los múltiples recursos de procesamiento que usa tu carga de trabajo.
- En la Google Cloud consola, haz clic en
Activar Cloud Shell en la Google Cloud consola para iniciar una sesión de Cloud Shell. Se abrirá una sesión en el panel inferior de la consola de Google Cloud .
Crea un archivo de manifiesto
dws-flex-start.yaml
:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: dws-model-inference-class spec: priorities: - machineType: g2-standard-24 spot: true - machineType: g2-standard-24 flexStart: enabled: true nodeRecycling: leadTimeSeconds: 3600 nodePoolAutoCreation: enabled: true
Aplica el manifiesto
dws-flex-start.yaml
:kubectl apply -f dws-flex-start.yaml
GKE implementa máquinas g2-standard-24
con aceleradores L4.
GKE usa clases de procesamiento para priorizar primero las VMs Spot y, luego, las de inicio flexible.
Implementa la carga de trabajo del LLM
Crea un Secret de Kubernetes que contenga el token de Hugging Face con el siguiente comando:
kubectl create secret generic model-inference-secret \ --from-literal=HUGGING_FACE_TOKEN=HUGGING_FACE_TOKEN \ --dry-run=client -o yaml | kubectl apply -f -
Reemplaza
HUGGING_FACE_TOKEN
por tu token de acceso de Hugging Face.Crea un archivo llamado
mixtral-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: inference-mixtral-ccc spec: nodeSelector: cloud.google.com/compute-class: dws-model-inference-class replicas: 1 selector: matchLabels: app: llm template: metadata: labels: app: llm spec: containers: - name: llm image: us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu124.2-3.ubuntu2204.py311 resources: requests: cpu: "5" memory: "40Gi" nvidia.com/gpu: "2" limits: cpu: "5" memory: "40Gi" nvidia.com/gpu: "2" env: - name: MODEL_ID value: mistralai/Mixtral-8x7B-Instruct-v0.1 - name: NUM_SHARD value: "2" - name: PORT value: "8080" - name: QUANTIZE value: bitsandbytes-nf4 - name: HUGGING_FACE_HUB_TOKEN valueFrom: secretKeyRef: name: model-inference-secret key: HUGGING_FACE_TOKEN volumeMounts: - mountPath: /dev/shm name: dshm - mountPath: /tmp name: ephemeral-volume volumes: - name: dshm emptyDir: medium: Memory - name: ephemeral-volume ephemeral: volumeClaimTemplate: metadata: labels: type: ephemeral spec: accessModes: ["ReadWriteOnce"] storageClassName: "premium-rwo" resources: requests: storage: 100Gi
En este manifiesto, el campo
mountPath
se establece en/tmp
, ya que es la ruta en la que se establece la variable de entornoHF_HOME
en el contenedor de aprendizaje profundo (DLC) para la inferencia de generación de texto (TGI), en lugar de la ruta predeterminada/data
que se establece dentro de la imagen predeterminada de TGI. El modelo descargado se almacenará en este directorio.Implementa el modelo:
kubectl apply -f mixtral-deployment.yaml
GKE programa un Pod nuevo para implementar, lo que activa el escalador automático del grupo de nodos para agregar un segundo nodo antes de implementar la segunda réplica del modelo.
Verifica el estado del modelo:
watch kubectl get deploy inference-mixtral-ccc
Si el modelo se implementó correctamente, el resultado es similar al siguiente:
NAME READY UP-TO-DATE AVAILABLE AGE inference-mixtral-ccc 1/1 1 1 10m
Para salir de la visualización, presiona
CTRL + C
.Consulta los grupos de nodos que aprovisionó GKE:
kubectl get nodes -L cloud.google.com/gke-nodepool
El resultado es similar a este:
NAME STATUS ROLES AGE VERSION GKE-NODEPOOL gke-flex-na-nap-g2-standard--0723b782-fg7v Ready <none> 10m v1.32.3-gke.1152000 nap-g2-standard-24-spot-gpu2-1gbdlbxz gke-flex-nap-zo-default-pool-09f6fe53-fzm8 Ready <none> 32m v1.32.3-gke.1152000 default-pool gke-flex-nap-zo-default-pool-09f6fe53-lv2v Ready <none> 32m v1.32.3-gke.1152000 default-pool gke-flex-nap-zo-default-pool-09f6fe53-pq6m Ready <none> 32m v1.32.3-gke.1152000 default-pool
El nombre del grupo de nodos creado indica el tipo de máquina. En este caso, GKE aprovisionó VMs Spot.
Interactúa con el modelo usando curl
En esta sección, se muestra cómo puedes realizar una prueba de inferencia básica para verificar el modelo implementado.
Configura la redirección de puertos al modelo:
kubectl port-forward service/llm-service 8080:8080
El resultado es similar a este:
Forwarding from 127.0.0.1:8080 -> 8080
En una sesión de terminal nueva, chatea con tu modelo usando
curl
:curl http://localhost:8080/v1/completions \ -X POST \ -H "Content-Type: application/json" \ -d '{ "model": "mixtral-8x7b-instruct-gptq", "prompt": "<s>[INST]Who was the first president of the United States?[/INST]", "max_tokens": 40}'
El resultado es similar al siguiente:
George Washington was a Founding Father and the first president of the United States, serving from 1789 to 1797.
Realiza una limpieza
Para evitar que se apliquen cargos a tu Google Cloud cuenta por los recursos usados en esta página, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el proyecto
- 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.
Borra el recurso individual
Borra los recursos de Kubernetes que creaste a partir de esta guía:
kubectl delete deployment inference-mixtral-ccc kubectl delete service llm-service kubectl delete computeclass dws-model-inference-class kubectl delete secret model-inference-secret
Borra el clúster:
gcloud container clusters delete CLUSTER_NAME
¿Qué sigue?
- Obtén más información para entrenar una carga de trabajo pequeña con inicio flexible.
- Obtén más información sobre las GPU en GKE.