En este instructivo, se muestra cómo implementar y administrar aplicaciones de IA/ML basadas en agentes en contenedores con Google Kubernetes Engine (GKE). Si combinas el kit de desarrollo de agentes (ADK) de Google con un modelo de lenguaje grande (LLM) autoalojado, como Llama 3.1, que se entrega con vLLM, puedes poner en funcionamiento agentes de IA de manera eficiente y a gran escala, y mantener el control total de la pila de modelos. En este instructivo, se explica el proceso integral para llevar un agente basado en Python desde el desarrollo hasta la implementación en producción en un clúster de GKE Autopilot con aceleración de GPU.
Este instructivo está dirigido a ingenieros de aprendizaje automático (AA), desarrolladores y arquitectos de nube que estén interesados en usar las capacidades de organización de contenedores de Kubernetes para entregar aplicaciones de IA/AA basadas en agentes. Para obtener más información sobre los roles comunes y las tareas de ejemplo a los que hacemos referencia en el contenido de Google Cloud, consulta Roles de usuario y tareas comunes de GKE Enterprise.
Antes de comenzar, asegúrate de conocer la siguiente información:
Fondo
En esta sección, se describen las tecnologías clave que se usan en este instructivo.
Kit de desarrollo de agentes (ADK)
El Kit de desarrollo de agentes (ADK) es un framework flexible y modular para desarrollar y, luego, implementar agentes de IA. Si bien está optimizado para Gemini y el ecosistema de Google, el ADK no requiere que uses un modelo o una implementación específicos, y está diseñado para ser compatible con otros frameworks. El ADK se diseñó para que el desarrollo de agentes se asemeje más al desarrollo de software, de modo que los desarrolladores puedan crear, implementar y coordinar con mayor facilidad arquitecturas basadas en agentes que abarcan desde tareas básicas hasta flujos de trabajo complejos.
Para obtener más información, consulta la documentación del ADK.
Servicio de Kubernetes administrado por GKE
Google Cloud ofrece una variedad de servicios, incluido GKE, que es adecuado para implementar y administrar cargas de trabajo de IA/AA. GKE es un servicio administrado de Kubernetes que simplifica la implementación, el escalamiento y la administración de aplicaciones alojadas en contenedores. GKE proporciona la infraestructura necesaria, incluidos recursos escalables, procesamiento distribuido y redes eficientes, para satisfacer las demandas computacionales de los LLM.
Para obtener más información sobre los conceptos clave de Kubernetes, consulta Comienza a aprender sobre Kubernetes. Para obtener más información sobre GKE y cómo te ayuda a escalar, automatizar y administrar Kubernetes, consulta la descripción general de GKE.
vLLM
vLLM es un framework de entrega de LLM de código abierto altamente optimizado que puede aumentar la capacidad de procesamiento de entrega en GPUs, con funciones como las siguientes:
- Implementación optimizada de transformadores con PagedAttention.
- Agrupación en lotes continua para mejorar la capacidad de procesamiento general de la entrega
- Paralelismo de tensor y entrega distribuida en varias GPUs
Para obtener más información, consulta la documentación de vLLM.
Prepare el entorno
En este instructivo, se usa Cloud Shell para administrar recursos alojados en Google Cloud.
Cloud Shell viene preinstalado con el software que necesitas para este instructivo, incluidos kubectl, terraform y Google Cloud CLI.
Para configurar tu entorno con Cloud Shell, sigue estos pasos:
- En la Google Cloud consola, inicia una sesión de Cloud Shell y haz clic en
Activar Cloud Shell. Esta acción inicia una sesión en un panel de la consola. Google Cloud
Configura las variables de entorno predeterminadas:
gcloud config set project PROJECT_ID export GOOGLE_CLOUD_REGION=REGION export PROJECT_ID=PROJECT_IDReemplaza los siguientes valores:
- PROJECT_ID: El Google Cloud ID del proyecto.
- REGION: La Google Cloud región (por ejemplo,
us-east4) para aprovisionar tu clúster de GKE, Artifact Registry y otros recursos regionales. Asegúrate de especificar una región que admita GPU L4 y tipos de máquinas G2. Para verificar la disponibilidad de regiones, consulta Regiones y zonas de GPU en la documentación de Compute Engine.
Clona el proyecto de ejemplo
Desde la terminal de Cloud Shell, clona el repositorio de código de muestra del instructivo:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.gitNavega hacia el directorio del instructivo:
cd kubernetes-engine-samples/ai-ml/adk-vllm
Crea y configura recursos de Google Cloud
Para implementar tu agente, primero debes aprovisionar los recursos de Google Cloudnecesarios. Puedes crear el clúster de GKE y el repositorio de Artifact Registry con gcloud CLI o Terraform.
gcloud
En esta sección, se proporcionan comandos de gcloud CLI para configurar tu clúster de GKE y Artifact Registry.
Crea un clúster de GKE: Puedes implementar tu aplicación agentiva alojada en contenedores en un clúster de GKE Autopilot o Standard. Usa un clúster de Autopilot para una experiencia de Kubernetes completamente administrada. Para elegir el modo de operación de GKE que mejor se adapte a tus cargas de trabajo, consulta Acerca de los modos de operación de GKE.
Autopilot
En Cloud Shell, ejecute el siguiente comando:
gcloud container clusters create-auto CLUSTER_NAME \ --location=$GOOGLE_CLOUD_REGIONReemplaza CLUSTER_NAME por el nombre de tu clúster de GKE.
Con Autopilot, GKE aprovisiona automáticamente nodos según las solicitudes de recursos de tu carga de trabajo. La GPU requerida para el LLM se solicita en el manifiesto
deploy-llm.yamlcon unnodeSelector.Para agregar una solicitud de
nodeSelectora la GPU denvidia-l4, sigue estos pasos:- Abre
kubernetes-engine-samples/ai-ml/adk-vllm/deploy-llm/deploy-llm.yamlen un editor. Agrega el siguiente
nodeSelectordebajo despec.template.spec:nodeSelector: cloud.google.com/gke-accelerator: nvidia-l4
Estándar
En Cloud Shell, ejecuta el siguiente comando para crear un clúster de Standard:
gcloud container clusters create CLUSTER_NAME \ --location=$GOOGLE_CLOUD_REGIONReemplaza CLUSTER_NAME por el nombre de tu clúster de GKE.
Crea un grupo de nodos habilitado para GPU para tu clúster ejecutando el siguiente comando:
gcloud container node-pools create gpu-node-pool \ --cluster=CLUSTER_NAME \ --location=$GOOGLE_CLOUD_REGION \ --machine-type=g2-standard-8 \ --accelerator=type=nvidia-l4,count=1 \ --enable-gvnicEl archivo
deploy-llm.yamlespecifica una GPUnvidia-l4, que está disponible en la serie de máquinas G2. Para obtener más información sobre este tipo de máquina, consulta Tipos de máquinas con GPU en la documentación de Compute Engine.
- Abre
Crea un repositorio de Artifact Registry: Crea un repositorio de Artifact Registry para almacenar y administrar de forma segura la imagen de contenedor de Docker de tu agente.
gcloud artifacts repositories create REPO_NAME \ --repository-format=docker \ --location=$GOOGLE_CLOUD_REGIONReemplaza REPO_NAME por el nombre del repositorio de Artifact Registry que deseas usar (por ejemplo,
adk-repo).Obtén la URL del repositorio: Para verificar la ruta completa a tu repositorio, ejecuta este comando. Usarás este formato para etiquetar tu imagen de Docker cuando compiles la imagen del agente.
gcloud artifacts repositories describe REPO_NAME \ --location $GOOGLE_CLOUD_REGION
Terraform
En esta sección, se describe cómo usar la configuración de Terraform incluida en el repositorio de ejemplo para aprovisionar tus recursos de Google Cloud automáticamente.
Navega al directorio de Terraform: El directorio
\terraformcontiene todos los archivos de configuración necesarios para crear el clúster de GKE y otros recursos requeridos.cd terraformCrea un archivo de variables de Terraform: Copia el archivo de variables de ejemplo proporcionado (
example_vars.tfvars) para crear tu propio archivovars.tfvars.cp example_vars.tfvars vars.tfvarsAbre el archivo
vars.tfvarsen un editor y reemplaza los valores de marcador de posición por tu configuración específica. Como mínimo, debes reemplazar PROJECT_ID por el ID de tu proyecto Google Cloud y CLUSTER_NAME por el nombre de tu clúster de GKE.Inicializa Terraform: Para descargar los complementos del proveedor necesarios para Google Cloud, ejecuta este comando.
terraform initRevisa el plan de ejecución: Este comando muestra los cambios en la infraestructura que realizará Terraform.
terraform plan -var-file=vars.tfvarsAplica la configuración: Para crear los recursos en tu proyecto de Google Cloud , ejecuta el plan de Terraform. Confirma con
yescuando se te solicite.terraform apply -var-file=vars.tfvars
Después de ejecutar estos comandos, Terraform aprovisiona tu clúster de GKE y tu repositorio de Artifact Registry, y configura los roles de IAM y las cuentas de servicio necesarios, incluida la federación de identidades para cargas de trabajo para GKE.
Si deseas obtener más información para usar Terraform, consulta Aprovisiona recursos de GKE con Terraform.
Configura kubectl para comunicarse con tu clúster
Para configurar kubectl para que se comunique con tu clúster, ejecuta el siguiente comando:
gcloud container clusters get-credentials CLUSTER_NAME \
--location=${GOOGLE_CLOUD_REGION}
Reemplaza CLUSTER_NAME por el nombre de tu clúster de GKE.
Compila la imagen del agente
Después de crear la infraestructura con gcloud CLI o Terraform, sigue estos pasos para compilar tu aplicación del agente.
Otorga el rol de IAM requerido para Cloud Build: El servicio de Cloud Build requiere permisos para enviar la imagen del contenedor del agente a Artifact Registry. Otorga el rol de
roles/artifactregistry.writera la cuenta de servicio predeterminada de Compute Engine, que usa Cloud Build.Construye el correo electrónico para la cuenta de servicio predeterminada de Compute Engine:
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)") export COMPUTE_SA_EMAIL=${PROJECT_NUMBER}-compute@developer.gserviceaccount.comOtorga el rol
roles/artifactregistry.writera la cuenta de servicio:gcloud projects add-iam-policy-binding $PROJECT_ID \ --member=serviceAccount:${COMPUTE_SA_EMAIL} \ --role=roles/artifactregistry.writer
Compila y envía la imagen del contenedor del agente: Desde el directorio raíz del proyecto (
adk/llama/vllm), compila tu imagen de Docker y envíala a Artifact Registry ejecutando estos comandos.export IMAGE_URL="${GOOGLE_CLOUD_REGION}-docker.pkg.dev/${PROJECT_ID}/REPO_NAME/adk-agent:latest" gcloud builds submit --tag $IMAGE_URLVerifica que se haya enviado la imagen: Después de que se complete correctamente el proceso de compilación, verifica que la imagen de contenedor de tu agente se haya enviado a Artifact Registry. Para ello, enumera las imágenes de tu repositorio.
gcloud artifacts docker images list ${GOOGLE_CLOUD_REGION}-docker.pkg.dev/${PROJECT_ID}/REPO_NAMEDeberías ver un resultado que enumere la imagen que acabas de enviar y etiquetar como
latest.
Implementa el modelo
Después de configurar tu clúster de GKE y compilar la imagen del agente, el siguiente paso es implementar el modelo Llama 3.1 alojado por tu cuenta en el clúster. Para ello, implementa un servidor de inferencia de vLLM preconfigurado que extrae el modelo de Hugging Face y lo entrega de forma interna dentro del clúster.
Crea un secreto de Kubernetes para las credenciales de Hugging Face: Para permitir que el clúster de GKE descargue el modelo Llama 3.1 restringido, debes proporcionar tu token de Hugging Face como un secreto de Kubernetes. El manifiesto
deploy-llm.yamlestá configurado para usar este secreto para la autenticación.kubectl create secret generic hf-secret \ --from-literal=hf-token-secret=HUGGING_FACE_TOKENReemplaza HUGGING_FACE_TOKEN por tu token.
Ver el manifiesto: Desde el directorio raíz del proyecto (
adk/llama/vllm), navega al directorio/deploy-llmque contiene el manifiesto de Deployment del modelo.cd deploy-llmAplica el manifiesto: Ejecuta el siguiente comando para aplicar el manifiesto
deploy-llm.yamla tu clúster.kubectl apply -f deploy-llm.yamlEl comando crea tres recursos de Kubernetes:
- Es una implementación que ejecuta el servidor de vLLM, configurado para usar el modelo
meta-llama/Llama-3.1-8B-Instruct. - Un Service llamado
vllm-llama3-serviceque expone el servidor de vLLM en una dirección IP interna del clúster, lo que permite que el agente del ADK se comunique con él. - Un ConfigMap que contiene una plantilla de chat de Jinja que requiere el modelo de Llama 3.1
- Es una implementación que ejecuta el servidor de vLLM, configurado para usar el modelo
Verifica la implementación del modelo: El servidor de vLLM extrae los archivos del modelo de Hugging Face. Este proceso puede tardar varios minutos. Puedes supervisar el estado del Pod para asegurarte de que esté listo.
Espera a que la Deployment esté disponible.
kubectl wait --for=condition=available --timeout=600s deployment/vllm-llama3-deploymentConsulta los registros del Pod en ejecución para confirmar que el servidor se inició correctamente.
export LLM_POD=$(kubectl get pods -l app=vllm-llama3 -o jsonpath='{.items[0].metadata.name}') kubectl logs -f $LLM_PODLa implementación estará lista cuando veas un resultado de registro similar al siguiente, que indica que se inició el servidor del LLM y que las rutas de la API están disponibles:
INFO 07-16 14:15:16 api_server.py:129] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)Envía una solicitud directamente al servidor del modelo para confirmar que el LLM está listo. Para ello, abre una nueva terminal de Cloud Shell y ejecuta el siguiente comando para retransmitir
vllm-llama3-servicea tu máquina local:kubectl port-forward service/vllm-llama3-service 8000:8000En otra terminal, envía una solicitud de muestra al extremo de API del modelo con
curl. Por ejemplo:curl -X POST http://localhost:8000/v1/completions \ -H "Content-Type: application/json" \ -d '{ "model": "meta-llama/Llama-3.1-8B-Instruct", "prompt": "Hello!", "max_tokens": 10 }'Si el comando devuelve una respuesta JSON exitosa, tu LLM está listo. Ahora puedes finalizar el proceso de reenvío de puertos. Para ello, vuelve a la ventana de la terminal y presiona
Ctrl+C. Luego, continúa con la implementación del agente.
Implementa la aplicación del agente
El siguiente paso es implementar la aplicación del agente basada en el ADK.
Navega al directorio
/deploy-agent: Desde el directorio raíz de tu proyecto (adk/llama/vllm), navega al directorio/deploy-agentque contiene el código fuente del agente y el manifiesto de implementación.cd ../deploy-agentActualiza el manifiesto de implementación del agente:
El archivo de manifiesto
deploy-agent.yamlde muestra contiene un marcador de posición para el ID de tu proyecto en la URL de la imagen de contenedor. Debes reemplazar el marcador de posición por el ID de tu proyecto Google Cloud .image: us-central1-docker.pkg.dev/PROJECT_ID/adk-repo/adk-agent:latestPara realizar esta sustitución en el lugar, puedes ejecutar el siguiente comando:
sed -i "s/<PROJECT_ID>/$PROJECT_ID/g" deploy-agent.yamlAsegúrate de que la ruta de
readinessProbeesté establecida en/en lugar de/dev-ui. Para realizar esta sustitución en el lugar, puedes ejecutar el siguiente comando:sed -i "s|path: /dev-ui/|path: /|g" deploy-agent.yaml
Aplica el manifiesto: Ejecuta el siguiente comando para aplicar el manifiesto
deploy-agent.yamla tu clúster.kubectl apply -f deploy-agent.yamlCon este comando, se crean dos recursos de Kubernetes:
- Una Deployment llamada
adk-agentque ejecuta la imagen de contenedor del agente compilado de forma personalizada. - Un servicio llamado
adk-agentde tipo NodePort que expone la aplicación del agente para que se pueda acceder a ella con fines de prueba.
- Una Deployment llamada
Verifica la implementación del agente: Comprueba el estado del Pod para asegurarte de que se ejecute correctamente.
Espera a que la Deployment esté disponible:
kubectl wait --for=condition=available --timeout=300s deployment/adk-agentObserva los registros del Pod del agente en ejecución:
export AGENT_POD=$(kubectl get pods -l app=adk-agent -o jsonpath='{.items[0].metadata.name}') kubectl logs -f $AGENT_POD
La implementación se realiza correctamente cuando ves un resultado de registro similar al siguiente, que indica que el servidor de Uvicorn está en ejecución y listo para aceptar solicitudes:
INFO: Uvicorn running on http://0.0.0.0:8001 (Press CTRL+C to quit)
Prueba tu agente implementado
Después de implementar correctamente el servidor de vLLM y la aplicación del agente, puedes probar la funcionalidad de extremo a extremo interactuando con la IU web del agente.
Reenvía el servicio del agente a tu máquina local: El servicio
adk-agentes de tipoNodePort, pero la forma más directa de acceder a él desde tu entorno de Cloud Shell es usar el comandokubectl port-forward. Ejecuta este comando para crear un túnel seguro hacia el Pod del agente.kubectl port-forward $AGENT_POD 8001:8001Accede a la IU web del agente: En Cloud Shell, haz clic en el botón Vista previa en la Web y selecciona Vista previa en el puerto 8001. Se abrirá una pestaña nueva del navegador que mostrará la interfaz de chat del agente.
Interactúa con el agente: Hazle una pregunta al agente que invoque su herramienta
get_weather. Por ejemplo:What's the weather like in Tokyo?Primero, el agente llamará al LLM para comprender la intención e identificar la necesidad de usar la herramienta
get_weather. Luego, ejecutará la herramienta con "Tokio" como parámetro. Por último, usará el resultado de la herramienta para generar una respuesta. Deberías ver una respuesta similar a la siguiente:The weather in Tokyo is 25°C and sunny.(Opcional) Verifica la llamada a la herramienta en los registros: Puedes observar la interacción del agente con el LLM y la ejecución de la herramienta si ves los registros de los Pods respectivos.
Registros del Pod del agente: En una terminal nueva, visualiza los registros del Pod
adk-agent. Verás la llamada a la herramienta y su resultado.kubectl logs -f $AGENT_PODEl resultado muestra que se llamó a la herramienta y que se procesó el resultado.
Registros del Pod del LLM: Visualiza los registros del Pod de
vllm-llama3-deploymentpara ver la solicitud entrante del agente.kubectl logs -f $LLM_PODEn los registros, se muestra la instrucción completa que el agente envió al LLM, incluido el mensaje del sistema, tu búsqueda y la definición de la herramienta
get_weather.
Cuando termines de realizar las pruebas, puedes finalizar el proceso de port-forward. Para ello, vuelve a la ventana de la terminal y presiona Ctrl+C.