En este instructivo, se muestra cómo implementar y entregar un modelo de lenguaje grande (LLM) con GPUs en Google Kubernetes Engine (GKE) con NVIDIA Triton Inference Server y TensorFlow Serving. Esto proporciona una base para comprender y explorar la implementación práctica de LLM para la inferencia en un entorno de Kubernetes administrado. Implementarás un contenedor compilado previamente en un clúster de GKE con una sola GPU de núcleo de tensor L4 y prepararás la infraestructura de GKE para realizar inferencias en línea.
Este instructivo está dirigido a ingenieros de aprendizaje automático (AA), administradores y operadores de plataformas, y especialistas en IA y datos que deseen alojar un modelo de aprendizaje automático (AA) previamente entrenado en un clúster de GKE. Para obtener más información sobre los roles comunes y las tareas de ejemplo a los que se hace referencia en el contenido de Google Cloud, consulta Roles y tareas comunes de los usuarios de GKE.
Antes de leer esta página, asegúrate de estar familiarizado con los siguientes temas:
Objetivos
- Crea un clúster de GKE Autopilot o Standard.
- Configura un bucket de Cloud Storage, en el que reside el modelo previamente entrenado.
- Implementa el framework de inferencia en línea que selecciones.
- 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
- 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, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. En la consola de Google Cloud , inicia una instancia de Cloud Shell:
Abrir Cloud ShellDescarga 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-gpuConfigura las variables de entorno predeterminadas:
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGIONReemplaza los siguientes valores:
- PROJECT_ID: Es el Google Cloud ID del proyecto.
- COMPUTE_REGION: La región de Compute Engine que admite el tipo de acelerador que deseas usar, por ejemplo,
us-central1para la GPU L4.
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-clusterEjecuta el siguiente comando para crear un clúster de GKE Standard:
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --location=${REGION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --addons GcsFuseCsiDriver \ --release-channel=rapid \ --num-nodes=1La creación del clúster puede tomar varios minutos.
Ejecuta el siguiente comando para actualizar 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=1GKE crea un grupo de nodos único que contiene una GPU L4 para cada nodo.
- Crea una cuenta de servicio Google Cloud .
- Crea una ServiceAccount de Kubernetes en tu clúster.
- Vincula la ServiceAccount de Kubernetes a la cuenta de servicio Google Cloud .
En la consola de Google Cloud , ve a la página Crear cuenta de servicio:
En el campo ID de cuenta de servicio, ingresa
gke-ai-sa.Haz clic en Crear y continuar.
En la lista Rol, selecciona el rol Cloud Storage > Servicio de recopilador de Storage Insights.
Haz clic en Agregar otro rol.
En la lista Seleccionar un rol, selecciona el rol Cloud Storage > Administrador de objetos de almacenamiento.
Haz clic en Continuar y, luego, en Listo.
Crea un espacio de nombres de Kubernetes:
kubectl create namespace gke-ai-namespaceCrea una ServiceAccount de Kubernetes en el espacio de nombres:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespaceAgrega una vinculación de IAM 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
--memberproporciona la identidad completa de la ServiceAccount de Kubernetes en Google Cloud.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.comEn Cloud Shell, copia el modelo de AA previamente entrenado en el bucket de Cloud Storage:
gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursiveImplementa el framework con un objeto Deployment. Un Deployment es un objeto de la API de Kubernetes que te permite ejecutar varias réplicas de Pods que se distribuyen 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-namespaceCuando el framework está listo, el resultado es similar al siguiente:
NAME READY UP-TO-DATE AVAILABLE AGE triton-deployment 1/1 1 1 5m29sImplementa los servicios para acceder a la Deployment:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yamlComprueba que la IP externa esté asignada:
kubectl get services --namespace=gke-ai-namespaceEl 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 5m14sToma nota de la dirección IP de
triton-serveren la columna EXTERNAL-IP.Comprueba que el servicio y la implementación funcionen de forma correcta:
curl -v EXTERNAL_IP:8000/v2/health/readyEl resultado es similar al siguiente:
... < HTTP/1.1 200 OK < Content-Length: 0 < Content-Type: text/plain ...En Cloud Shell, copia el modelo de AA previamente entrenado en el bucket de Cloud Storage:
gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursiveImplementa el framework con un objeto Deployment. Un Deployment es un objeto de la API de Kubernetes que te permite ejecutar varias réplicas de Pods que se distribuyen 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-namespaceCuando el framework está listo, el resultado es similar al siguiente:
NAME READY UP-TO-DATE AVAILABLE AGE tfserve-deployment 1/1 1 1 5m29sImplementa los servicios para acceder a la Deployment:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yamlComprueba que la IP externa esté asignada:
kubectl get services --namespace=gke-ai-namespaceEl 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 5m14sToma nota de la dirección IP de
tfserve-serveren la columna EXTERNAL-IP.Comprueba que el servicio y la Deployment funcionen de forma correcta:
curl -v EXTERNAL_IP:8000/v1/models/mnistReemplaza
EXTERNAL_IPpor 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": "" } } ] }Crea un entorno virtual de Python en Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activateInstala los paquetes de Python necesarios:
pip install -r src/client/triton-requirements.txtPrueba 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.pngReemplaza 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 ensrc/client/images.
Según la imagen que uses, el resultado es similar al siguiente:
Calling Triton HTTP Service -> Prediction result: 7Crea un entorno virtual de Python en Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activateInstala los paquetes de Python necesarios:
pip install -r src/client/tfserve-requirements.txtPrueba TensorFlow Serving con algunas imágenes.
cd src/client python tfserve_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.pngEXTERNAL_IP: Es la dirección IP externa.TEST_IMAGE: Un valor de0a9. Puedes usar las imágenes almacenadas ensrc/client/images.- 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 Google Cloud : Borra el clúster de GKE y los recursos de Google Cloud .
- Borra el proyecto
- Borra el espacio de nombres de Kubernetes y las cargas de trabajo que implementaste:
Borra el bucket de Cloud Storage:
Ve a la página Buckets:
Selecciona la casilla de verificación correspondiente a
PROJECT_ID-gke-bucket.Haz clic en Borrar.
Para confirmar la eliminación, escribe
DELETEy haz clic en Borrar.
Borra la cuenta de servicio Google Cloud :
Ve a la página Cuentas de servicio:
Selecciona tu proyecto.
Selecciona la casilla de verificación correspondiente a
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.Haz clic en Borrar.
Para confirmar la eliminación, haz clic en Borrar.
Borra el clúster de GKE:
Ve a la página Clústeres:
Selecciona la casilla de verificación correspondiente a
online-serving-cluster.Haz clic en Borrar.
Para confirmar la eliminación, escribe
online-serving-clustery haz clic en Borrar.
Borra el bucket de Cloud Storage:
Ve a la página Buckets:
Selecciona la casilla de verificación correspondiente a
PROJECT_ID-gke-bucket.Haz clic en Borrar.
Para confirmar la eliminación, escribe
DELETEy haz clic en Borrar.
Borra la cuenta de servicio Google Cloud :
Ve a la página Cuentas de servicio:
Selecciona tu proyecto.
Selecciona la casilla de verificación correspondiente a
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.Haz clic en Borrar.
Para confirmar la eliminación, haz clic en Borrar.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Establece valores predeterminados para Google Cloud CLI
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} \
--location=${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
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:
Crea una Google Cloud cuenta de servicio
Crea una ServiceAccount de Kubernetes en tu clúster
En Cloud Shell, haz lo siguiente:
Vincula la ServiceAccount de Kubernetes a la cuenta de servicio Google Cloud
En Cloud Shell, ejecuta los siguientes comandos:
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
TF Serving
Entrega el modelo
Triton
TF Serving
Reemplaza lo siguiente:
Según la imagen que uses, obtendrás un resultado similar al siguiente:
Calling TensorFlow Serve HTTP Service -> Prediction result: 5
Observa el rendimiento del modelo
Triton
Para observar el rendimiento del modelo, puedes usar la integración del panel de Triton en Cloud Monitoring. Con este panel, puedes ver métricas de rendimiento críticas, como el rendimiento de tokens, la latencia de solicitudes y las tasas de error.
Para usar el panel de Triton, debes habilitar Google Cloud Managed Service para Prometheus, que recopila las métricas de Triton, en tu clúster de GKE. De forma predeterminada, Triton expone las métricas en formato Prometheus. No es necesario que instales un exportador adicional.
Luego, puedes ver las métricas con el panel de Triton. Para obtener información sobre cómo usar Google Cloud Managed Service para Prometheus para recopilar 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 TF Serving en Cloud Monitoring. Con este panel, puedes ver métricas de rendimiento críticas, como el rendimiento de tokens, la latencia de solicitudes y las tasas de error.
Para usar el panel de TF Serving, debes habilitar Google Cloud Managed Service para Prometheus, que recopila las métricas de TF Serving, en tu clúster de GKE.
Luego, puedes ver las métricas con el panel de TF Serving. Si deseas obtener información para usar Google Cloud Managed Service para Prometheus y recopilar métricas de tu modelo, consulta la guía de observabilidad de TF Serving en la documentación de Cloud Monitoring.Realiza una limpieza
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que creaste en esta guía, haz una de las siguientes acciones:
Borra los recursos de Kubernetes en el clúster y los recursos de Google Cloud
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