Entrega LLMs en GKE con una estrategia de aprovisionamiento de GPU de alta disponibilidad y optimización de costos

En esta guía, se muestra cómo optimizar los costos de las cargas de trabajo de servicio de LLM en GKE. En este instructivo, se usa una combinación de VMs de inicio flexible, VMs Spot y ComputeClasses 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 IA y datos 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 Roles y tareas comunes del usuario de GKE.

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, durante un máximo de 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 con los precios del programador dinámico de cargas de trabajo:

  • Descuento (hasta un 53%) para 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 GPU en GKE.

Inicio flexible

La opción de inicio flexible, con la tecnología del programador dinámico de cargas de trabajo, es una opción de consumo de GPU en la que GKE conserva tu solicitud de GPU y aprovisiona automáticamente VMs de inicio flexible cuando hay capacidad disponible. Considera usar el 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 inicio flexible 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 no hay capacidad disponible de VMs Spot.

Para obtener más información, consulta Cómo usar VMs Spot con grupos de nodos de GPU.

ComputeClasses

Puedes solicitar GPUs con ComputeClasses. Las ComputeClasses 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 seleccionado. Para obtener más información, consulta Acerca de las ComputeClasses personalizadas.

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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify 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.

    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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify that billing is enabled for your Google Cloud project.

Obtén acceso al modelo

Si aún no tienes uno, genera un nuevo token de Hugging Face:

  1. Haz clic en Tu perfil > Configuración > Tokens de acceso.
  2. Selecciona Token nuevo.
  3. Especifica el nombre que desees y un rol de al menos Read.
  4. Selecciona Generate un token.

Crea un ComputeClass

En esta sección, crearás una ComputeClass personalizada. Los ComputeClasses definen los tipos y las relaciones entre los múltiples recursos de procesamiento que usa tu carga de trabajo.

  1. En la Google Cloud consola, haz clic en Ícono de activación de Cloud Shell 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 .
  2. 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
    
  3. 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 ComputeClasses para priorizar primero las VMs Spot y, luego, las VMs de inicio flexible.

Implementa la carga de trabajo del LLM

  1. 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.

  2. Crea un archivo llamado mixtral-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: inference-mixtral-ccc
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: llm
      template:
        metadata:
          labels:
            app: llm
        spec:
          nodeSelector:
            cloud.google.com/compute-class: dws-model-inference-class
          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 entorno HF_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.

  3. 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.

  4. 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.

  5. Espera a que se descargue el contenedor y comience a entregar el modelo:

    watch "kubectl logs $(kubectl get pods -l app=llm -o custom-columns=:metadata.name --no-headers) | tail"
    

    Para salir de la visualización, presiona CTRL + C.

  6. Consulta los grupos de nodos que aprovisionó GKE:

    kubectl get nodes -L cloud.google.com/gke-nodepool
    

    El resultado es similar a lo siguiente:

      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.

  7. Expón el modelo:

    kubectl expose deployment/inference-mixtral-ccc --port 8080 --name=llm-service
    

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.

  1. Configura la redirección de puertos al modelo:

    kubectl port-forward service/llm-service 8080:8080
    

    El resultado es similar a lo siguiente:

    Forwarding from 127.0.0.1:8080 -> 8080
    
  2. En una sesión de terminal nueva, usa curl para chatear con tu modelo:

    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 cuenta de Google Cloud 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

  1. En la Google Cloud consola, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra el recurso individual

  1. 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
    
  2. Borra el clúster:

    gcloud container clusters delete CLUSTER_NAME
    

¿Qué sigue?