Entrega un modelo con una sola GPU en GKE


En este instructivo, se muestra cómo entregar un modelo simple con GPU en modo Google Kubernetes Engine (GKE). En este instructivo, se crea un clúster de GKE que usa una sola GPU de núcleo de tensor L4 y prepara la infraestructura de GKE para ejecutar inferencias en línea. En este instructivo, se usan dos de los frameworks más usados para la entrega en línea:

Objetivos

Este instructivo está dirigido a ingenieros de infraestructura, ingenieros de MLOps, ingenieros de DevOps o administradores de clústeres que deseen alojar un modelo de aprendizaje automático (AA) previamente entrenado en un clúster de GKE.

En este instructivo, se abarcan los siguientes pasos:

  1. Crea un clúster de GKE Autopilot o Standard.
  2. Configura un bucket de Cloud Storage, en el que reside el modelo previamente entrenado.
  3. Implementa el framework de inferencia en línea que selecciones.
  4. Lleva a cabo una solicitud de prueba al servicio implementado.

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

  • GKE
  • Cloud Storage
  • Aceleradores de GPU L4
  • Tráfico de salida

Usa la calculadora de precios para generar una estimación de los costos según el uso previsto.

Cuando finalices este instructivo, puedes borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

Configura tu proyecto

  1. 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.
  2. En la consola de Google Cloud, en la página del selector de proyectos, haz clic en Crear proyecto para comenzar a crear un proyecto de Google Cloud nuevo.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita la API de GKE.

    Habilita la API

  5. En la consola de Google Cloud, en la página del selector de proyectos, haz clic en Crear proyecto para comenzar a crear un proyecto de Google Cloud nuevo.

    Ir al selector de proyectos

  6. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  7. Habilita la API de GKE.

    Habilita la API

Establece valores predeterminados para Google Cloud CLI

  1. En la consola de Google Cloud, inicia una instancia de Cloud Shell:
    Abrir Cloud Shell

  2. Descarga el código fuente para esta app de ejemplo:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    cd kubernetes-engine-samples/ai-ml/gke-online-serving-single-gpu
    
  3. Configura las variables de entorno predeterminadas:

    gcloud config set project PROJECT_ID
    gcloud config set compute/region COMPUTE_REGION
    

    Reemplaza los siguientes valores:

  4. En Cloud Shell, crea las siguientes variables de entorno:

    export PROJECT_ID=$(gcloud config get project)
    export REGION=$(gcloud config get compute/region)
    export K8S_SA_NAME=gpu-k8s-sa
    export GSBUCKET=$PROJECT_ID-gke-bucket
    export MODEL_NAME=mnist
    export CLUSTER_NAME=online-serving-cluster
    

Crea un clúster de GKE

Puedes entregar modelos en una sola GPU 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. Con GKE Autopilot, los recursos se escalan automáticamente en función de las solicitudes del modelo.

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

Ejecuta el siguiente comando para crear un clúster de GKE Autopilot:

  gcloud container clusters create-auto ${CLUSTER_NAME} \
      --region=${REGION} \
      --project=${PROJECT_ID} \
      --release-channel=rapid

GKE crea un clúster de Autopilot con nodos de CPU y GPU según lo solicitan las cargas de trabajo implementadas.

Estándar

  1. Ejecuta el siguiente comando para crear un clúster de GKE Standard:

      gcloud container clusters create ${CLUSTER_NAME} \
        --project=${PROJECT_ID}  \
        --region=${REGION}  \
        --workload-pool=${PROJECT_ID}.svc.id.goog \
        --addons GcsFuseCsiDriver \
        --release-channel=rapid \
        --num-nodes=1
    

    La creación del clúster puede tomar varios minutos.

  2. Ejecuta el siguiente comando para crear el grupo de nodos:

      gcloud container node-pools create gpupool \
        --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \
        --project=${PROJECT_ID} \
        --location=${REGION} \
        --node-locations=${REGION}-a \
        --cluster=${CLUSTER_NAME} \
        --machine-type=g2-standard-8 \
        --num-nodes=1
    

    GKE crea un solo grupo de nodos que contiene una GPU L4 para cada nodo.

Crea un bucket de Cloud Storage

Crea un bucket de Cloud Storage para almacenar el modelo previamente entrenado que se entregará

En Cloud Shell, ejecuta lo siguiente:

gcloud storage buckets create gs://$GSBUCKET

Configura tu clúster a fin de acceder al bucket mediante la federación de identidades para cargas de trabajo para GKE

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

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

Crea una cuenta de servicio de Google Cloud.

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

    Ve a Crear cuenta de servicio

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

  3. Haz clic en Crear y continuar.

  4. En la lista Rol, selecciona el rol Cloud Storage > Servicio de recopilador de Storage Insights.

  5. Haz clic en Agregar otro rol.

  6. En la lista Seleccionar un rol, selecciona el rol Cloud Storage > Administrador de objetos de almacenamiento.

  7. Haz clic en Continuar y, luego, en Listo.

Crea 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 ServiceAccount de Kubernetes en el espacio de nombres:

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

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

En Cloud Shell, ejecute los siguientes comandos:

  1. Agrega una vinculación de IAM a la cuenta de servicio de 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 ServiceAccount de Kubernetes en Google Cloud.

  2. Anota la ServiceAccount 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
    

Implementa el servidor de inferencia en línea

Cada framework de inferencia en línea espera encontrar el modelo de AA previamente entrenado en un formato específico. En la siguiente sección, se muestra cómo implementar el servidor de inferencia según el framework que desees usar:

Triton

  1. En Cloud Shell, copia el modelo de AA previamente entrenado en el bucket de Cloud Storage:

    gsutil cp -r src/triton-model-repository gs://$GSBUCKET
    
  2. Implementa el framework en Kubernetes:

    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 es similar al siguiente:

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

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
    
  5. Comprueba que la IP externa esté asignada:

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

    El resultado es 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
    

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

  6. Comprueba que el servicio y la implementación funcionen de forma correcta:

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

    El resultado es 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 AA previamente entrenado en el bucket de Cloud Storage:

    gsutil cp -r src/tfserve-model-repository gs://$GSBUCKET
    
  2. Implementa el framework en Kubernetes:

    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 es similar al siguiente:

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

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
    
  5. Comprueba que la IP externa esté asignada:

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

    El resultado es 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
    

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

  6. Comprueba que el servicio y la implementación funcionen de forma correcta:

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

    Reemplaza EXTERNAL_IP por tu dirección IP externa.

    El resultado es 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": ""
            }
          }
        ]
    }
    

Entrega 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 con la carga de una imagen:

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

    Reemplaza lo siguiente:

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

    Según la imagen que uses, el resultado es 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
    

Reemplaza lo siguiente:

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

Según la imagen que uses, obtendrás un resultado similar al siguiente:

  Calling TensorFlow Serve HTTP Service    ->      Prediction result: 5

Limpia

Para evitar que se generen cargos en tu cuenta de Google Cloud por los recursos que creaste en esta guía, lleva a cabo una de las siguientes acciones:

  • Mantén el clúster de GKE: Borra los recursos de Kubernetes en el clúster y los recursos de Google Cloud
  • Mantén el proyecto de Google Cloud: Borra el clúster de GKE y los recursos de Google Cloud.
  • Borra el proyecto

Borra los recursos de Kubernetes en el clúster y los recursos de Google Cloud

  1. Borra el espacio de nombres de Kubernetes y las cargas de trabajo que implementaste:

Triton

kubectl -n gke-ai-namespace delete -f src/gke-config/service-triton.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-triton.yaml
kubectl delete namespace gke-ai-namespace

TF Serving

kubectl -n gke-ai-namespace delete -f src/gke-config/service-tfserve.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-tfserve.yaml
kubectl delete namespace gke-ai-namespace
  1. Borra el bucket de Cloud Storage:

    1. Ve a la página Buckets:

      Ir a Buckets

    2. Selecciona la casilla de verificación correspondiente a PROJECT_ID-gke-bucket.

    3. Haz clic en Borrar.

    4. Para confirmar la eliminación, escribe DELETE y haz clic en Borrar.

  2. Borra la cuenta de servicio de Google Cloud:

    1. Ve a la página Cuentas de servicio:

      Ir a Cuentas de servicio

    2. Selecciona tu proyecto.

    3. Selecciona la casilla de verificación correspondiente a gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Haz clic en Borrar.

    5. Para confirmar la eliminación, haz clic en Borrar.

Borra el clúster de GKE y los recursos de Google Cloud

  1. Borra el clúster de GKE:

    1. Ve a la página Clústeres:

      Ir a los clústeres

    2. Selecciona la casilla de verificación correspondiente a online-serving-cluster.

    3. Haz clic en Borrar.

    4. Para confirmar la eliminación, escribe online-serving-cluster y haz clic en Borrar.

  2. Borra el bucket de Cloud Storage:

    1. Ve a la página Buckets:

      Ir a Buckets

    2. Selecciona la casilla de verificación correspondiente a PROJECT_ID-gke-bucket.

    3. Haz clic en Borrar.

    4. Para confirmar la eliminación, escribe DELETE y haz clic en Borrar.

  3. Borra la cuenta de servicio de Google Cloud:

    1. Ve a la página Cuentas de servicio:

      Ir a Cuentas de servicio

    2. Selecciona tu proyecto.

    3. Selecciona la casilla de verificación correspondiente a gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Haz clic en Borrar.

    5. Para confirmar la eliminación, haz clic en Borrar.

Borra el proyecto

  1. En la consola de Google Cloud, 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.

¿Qué sigue?