Entrega LLM en GKE con una estrategia de aprovisionamiento de GPU de alta disponibilidad y optimizada para el costo


En esta guía, se muestra cómo optimizar los costos de la carga de trabajo cuando implementas un modelo de lenguaje extenso (LLM). La infraestructura de GKE utiliza una combinación de modo de aprovisionamiento de inicio flexible, VMs Spot y perfiles de clase de procesamiento personalizados para optimizar los costos de la carga de trabajo.

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 a especialistas en datos y AI que estén interesados en usar las capacidades de organización de contenedores de Kubernetes para la entrega de 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.

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 o AA. Estas técnicas se denominan estrategias de disponibilidad de aceleradores en GKE.

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 tipos de máquinas 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 es un tipo de reserva de GPU en el que GKE conserva tu solicitud de GPU y aprovisiona recursos automáticamente cuando la capacidad esté disponible. Considera usar el modo de aprovisionamiento de inicio flexible para las cargas de trabajo que necesiten capacidad de GPU por un tiempo limitado, hasta siete días, y no tengan una fecha de inicio fija. Para obtener más información, consulta el modo de aprovisionamiento de inicio flexible.

VMs Spot

Puedes usar las GPUs con VM Spot si tus cargas de trabajo pueden tolerar interrupciones frecuentes en los nodos. Usar las VMs Spot o el modo de aprovisionamiento de inicio flexible reduce el precio de la ejecución de GPUs. El uso de VMs Spot combinado con el modo de aprovisionamiento de inicio flexible proporciona una opción de resguardo 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.

    Go to project selector

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

    Go to project selector

  • 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

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. 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.

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

    1. In the Google Cloud console, go to the IAM page.

      Ir a IAM
    2. Selecciona el proyecto.
    3. Haz clic en Grant access.
    4. 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.

    5. En la lista Seleccionar un rol, elige un rol.
    6. Para otorgar funciones adicionales, haz clic en Agregar otro rol y agrega cada rol adicional.
    7. Haz clic en Guardar.

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

  1. En la consola de Google Cloud, haz clic en Ícono de activación de Cloud Shell Activar Cloud Shell en la consola de Google Cloud 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 clases de procesamiento para priorizar primero las VM Spot y, en segundo lugar, el modo de aprovisionamiento de inicio flexible.

Implementa la carga de trabajo de 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:
      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 de acceso 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 de acceso predeterminada /data que se establece en 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 que se implemente, lo que activa el escalador automático del grupo de nodos para que agregue 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ó de forma correcta, 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. 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 con 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 este:

    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.
    

Limpia

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

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Borra el recurso individual

  1. Borra los recursos de Kubernetes que creaste en 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?