Servir un modelo con una sola GPU en GKE

En este tutorial se muestra cómo desplegar y servir un modelo de lenguaje extenso (LLM) con GPUs en Google Kubernetes Engine (GKE) con NVIDIA Triton Inference Server y TensorFlow Serving. De esta forma, se proporciona una base para comprender y explorar el despliegue práctico de LLMs para la inferencia en un entorno de Kubernetes gestionado. Despliega un contenedor prediseñado en un clúster de GKE con una sola GPU L4 Tensor Core y prepara la infraestructura de GKE para realizar inferencias online.

Este tutorial está dirigido a ingenieros de aprendizaje automático, administradores y operadores de plataformas, y a especialistas en datos e IA que quieran alojar un modelo de aprendizaje automático preentrenado en un clúster de GKE. Para obtener más información sobre los roles habituales y las tareas de ejemplo que se mencionan en el contenido, consulta Roles y tareas de usuario habituales de GKE. Google Cloud

Antes de leer esta página, asegúrese de que conoce los siguientes conceptos:

Crea un segmento de Cloud Storage

Crea un segmento de Cloud Storage para almacenar el modelo preentrenado que se va a servir.

En Cloud Shell, ejecuta lo siguiente:

gcloud storage buckets create gs://$GSBUCKET

Configurar el clúster para acceder al bucket mediante Workload Identity Federation for GKE

Para permitir que tu clúster acceda al segmento de Cloud Storage, haz lo siguiente:

  1. Crea una Google Cloud cuenta de servicio.
  2. Crea una cuenta de servicio de Kubernetes en tu clúster.
  3. Vincula la cuenta de servicio de Kubernetes a la Google Cloud cuenta de servicio.

Crea una Google Cloud cuenta de servicio

  1. En la Google Cloud consola, ve a la página Crear cuenta de servicio:

    Ir a Crear cuenta de servicio

  2. En el campo ID de cuenta de servicio, introduce gke-ai-sa.

  3. Haz clic en Crear y continuar.

  4. En la lista Rol, selecciona el rol Cloud Storage > Storage Insights Collector Service.

  5. Haz clic en Añadir otro rol.

  6. En la lista Selecciona un rol, elige el rol Cloud Storage > Administrador de objetos de Storage.

  7. Haz clic en Continuar y, a continuación, en Hecho.

Crear una ServiceAccount de Kubernetes en tu clúster

En Cloud Shell, haz lo siguiente:

  1. Crea un espacio de nombres de Kubernetes:

    kubectl create namespace gke-ai-namespace
    
  2. Crea una cuenta de servicio de Kubernetes en el espacio de nombres:

    kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
    

Vincula la cuenta de servicio de Kubernetes a la Google Cloud cuenta de servicio.

En Cloud Shell, ejecuta los siguientes comandos:

  1. Añade un enlace de gestión de identidades y accesos a la cuenta de servicio Google Cloud :

    gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"
    

    La marca --member proporciona la identidad completa de la cuenta de servicio de Kubernetes en Google Cloud.

  2. Anota la cuenta de servicio de Kubernetes:

    kubectl annotate serviceaccount gpu-k8s-sa \
        --namespace gke-ai-namespace \
        iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
    

Implementar el servidor de inferencia online

Cada framework de inferencia online espera encontrar el modelo de aprendizaje automático preentrenado en un formato específico. En la siguiente sección se muestra cómo implementar el servidor de inferencia en función del framework que quieras usar:

Triton

  1. En Cloud Shell, copia el modelo de aprendizaje automático preentrenado en el bucket de Cloud Storage:

    gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
    
  2. Despliega el framework mediante un Deployment. Un Deployment es un objeto de la API de Kubernetes que te permite ejecutar varias réplicas de pods distribuidas entre los nodos de un clúster:

    envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. Valida que GKE haya implementado el framework:

    kubectl get deployments --namespace=gke-ai-namespace
    

    Cuando el framework esté listo, el resultado será similar al siguiente:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    triton-deployment    1/1     1            1           5m29s
    
  4. Despliega los servicios para acceder a la implementación:

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
    
  5. Comprueba que se haya asignado la IP externa:

    kubectl get services --namespace=gke-ai-namespace
    

    El resultado debería ser similar al siguiente:

    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                        AGE
    kubernetes      ClusterIP      34.118.224.1     <none>          443/TCP                                        60m
    triton-server   LoadBalancer   34.118.227.176   35.239.54.228   8000:30866/TCP,8001:31035/TCP,8002:30516/TCP   5m14s
    

    Anota la dirección IP de triton-server en la columna EXTERNAL-IP.

  6. Comprueba que el servicio y la implementación funcionan correctamente:

    curl -v EXTERNAL_IP:8000/v2/health/ready
    

    El resultado debería ser similar al siguiente:

    ...
    < HTTP/1.1 200 OK
    < Content-Length: 0
    < Content-Type: text/plain
    ...
    

TF Serving

  1. En Cloud Shell, copia el modelo de aprendizaje automático preentrenado en el bucket de Cloud Storage:

    gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
    
  2. Despliega el framework mediante un Deployment. Un Deployment es un objeto de la API de Kubernetes que te permite ejecutar varias réplicas de pods distribuidas entre los nodos de un clúster:

    envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. Valida que GKE haya implementado el framework:

    kubectl get deployments --namespace=gke-ai-namespace
    

    Cuando el framework esté listo, el resultado será similar al siguiente:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    tfserve-deployment   1/1     1            1           5m29s
    
  4. Despliega los servicios para acceder a la implementación:

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
    
  5. Comprueba que se haya asignado la IP externa:

    kubectl get services --namespace=gke-ai-namespace
    

    El resultado debería ser similar al siguiente:

    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                        AGE
    kubernetes      ClusterIP      34.118.224.1     <none>          443/TCP                                        60m
    tfserve-server  LoadBalancer   34.118.227.176   35.239.54.228   8500:30003/TCP,8000:32194/TCP                  5m14s
    

    Anota la dirección IP de tfserve-server en la columna EXTERNAL-IP.

  6. Comprueba que el servicio y la implementación funcionan correctamente:

    curl -v EXTERNAL_IP:8000/v1/models/mnist
    

    Sustituye EXTERNAL_IP por tu dirección IP externa.

    El resultado debería ser similar al siguiente:

    ...
    < HTTP/1.1 200 OK
    < Content-Type: application/json
    < Date: Thu, 12 Oct 2023 19:01:19 GMT
    < Content-Length: 154
    <
    {
      "model_version_status": [
            {
            "version": "1",
            "state": "AVAILABLE",
            "status": {
              "error_code": "OK",
              "error_message": ""
            }
          }
        ]
    }
    

Aplicar el modelo

Triton

  1. Crea un entorno virtual de Python en Cloud Shell.

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. Instala los paquetes de Python necesarios.

    pip install -r src/client/triton-requirements.txt
    
  3. Prueba el servidor de inferencia de Triton cargando una imagen:

    cd src/client
    python triton_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
    

    Haz los cambios siguientes:

    • EXTERNAL_IP: tu dirección IP externa.
    • TEST_IMAGE: El nombre del archivo que corresponde a la imagen que quieres probar. Puedes usar las imágenes almacenadas en src/client/images.

    En función de la imagen que uses, el resultado será similar al siguiente:

    Calling Triton HTTP Service      ->      Prediction result: 7
    

TF Serving

  1. Crea un entorno virtual de Python en Cloud Shell.

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. Instala los paquetes de Python necesarios.

    pip install -r src/client/tfserve-requirements.txt
    
  3. Prueba TensorFlow Serving con algunas imágenes.

    cd src/client
    python tfserve_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
    

Haz los cambios siguientes:

  • EXTERNAL_IP: tu dirección IP externa.
  • TEST_IMAGE: un valor de 0 a 9. Puedes usar las imágenes almacenadas en src/client/images.

En función de la imagen que utilices, obtendrás un resultado similar a este:

  Calling TensorFlow Serve HTTP Service    ->      Prediction result: 5

Observar el rendimiento del modelo

Triton

Para observar el rendimiento del modelo, puedes usar la integración del panel de control de Triton en Cloud Monitoring. Con este panel de control, puede ver métricas de rendimiento críticas, como el rendimiento de tokens, la latencia de las solicitudes y las tasas de error.

Para usar el panel de control de Triton, debes habilitar Google Cloud Managed Service para Prometheus, que recoge las métricas de Triton, en tu clúster de GKE. Triton expone métricas en formato Prometheus de forma predeterminada, por lo que no es necesario instalar ningún exportador adicional.

Después, puede ver las métricas en el panel de control de Triton. Para obtener información sobre cómo usar Google Cloud Managed Service para Prometheus y recoger métricas de tu modelo, consulta la guía de observabilidad de Triton en la documentación de Cloud Monitoring.

TF Serving

Para observar el rendimiento del modelo, puedes usar la integración del panel de control de TF Serving en Cloud Monitoring. Con este panel de control, puede ver métricas de rendimiento críticas, como el rendimiento de tokens, la latencia de las solicitudes y las tasas de error.

Para usar el panel de control de TF Serving, debes habilitar Google Cloud Managed Service para Prometheus, que recoge las métricas de TF Serving, en tu clúster de GKE.

Después, puede ver las métricas en el panel de control de TF Serving. Para obtener información sobre cómo usar Google Cloud Managed Service para Prometheus y recoger métricas de tu modelo, consulta la guía de observabilidad de TF Serving en la documentación de Cloud Monitoring.