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:
- Crea una Google Cloud cuenta de servicio.
- Crea una cuenta de servicio de Kubernetes en tu clúster.
- Vincula la cuenta de servicio de Kubernetes a la Google Cloud cuenta de servicio.
Crea una Google Cloud cuenta de servicio
En la Google Cloud consola, ve a la página Crear cuenta de servicio:
En el campo ID de cuenta de servicio, introduce
gke-ai-sa
.Haz clic en Crear y continuar.
En la lista Rol, selecciona el rol Cloud Storage > Storage Insights Collector Service.
Haz clic en
Añadir otro rol.En la lista Selecciona un rol, elige el rol Cloud Storage > Administrador de objetos de Storage.
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:
Crea un espacio de nombres de Kubernetes:
kubectl create namespace gke-ai-namespace
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:
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.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
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
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 -
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
Despliega los servicios para acceder a la implementación:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
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.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
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
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 -
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
Despliega los servicios para acceder a la implementación:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
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.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
Crea un entorno virtual de Python en Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activate
Instala los paquetes de Python necesarios.
pip install -r src/client/triton-requirements.txt
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 ensrc/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
Crea un entorno virtual de Python en Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activate
Instala los paquetes de Python necesarios.
pip install -r src/client/tfserve-requirements.txt
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 de0
a9
. Puedes usar las imágenes almacenadas ensrc/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.