EasyllMops: MLOPS sin esfuerzo para modelos de lenguaje potentes.
EasyllMops es un proyecto creado con WebUI abierto que se puede implementar en Google Kubernetes Engine (GKE) para administrar y escalar modelos de idiomas. Ofrece métodos de implementación de Terraform y manual, e incorpora prácticas sólidas de MLOPS. Esto incluye tuberías de CI/CD con Jenkins y Ansible para automatización, monitoreo con Prometheus y Grafana para información de rendimiento y registro centralizado con la pila de alces para la resolución y análisis. Los desarrolladores pueden encontrar documentación detallada e instrucciones en el sitio web del proyecto.
Desarrolladores que construyen e implementan aplicaciones con LLM. Científicos de datos e ingenieros de aprendizaje automático que trabajan con LLM. DevOps equipos responsables de administrar la infraestructura de LLM. Organizaciones que buscan integrar LLM en sus operaciones.
En caso de que no quiera pasar mucho tiempo, ejecute este guión y disfrute de su café:
chmod +x ./cluster.sh
./cluster.sh
Recuerde autenticarse con GCP antes de usar Terraform:
gcloud auth application-default login
Esta sección proporciona una guía de inicio muy rápida para poner en marcha la aplicación lo antes posible. Consulte las siguientes secciones para obtener instrucciones más detalladas.
1. Configure el clúster:
Si está implementando la aplicación en GKE, puede usar Terraform para automatizar la configuración de su clúster Kubernetes. Navegue al directorio iac/terraform
e inicialice Terraform:
cd iac/terraform
terraform init
Planificar y aplicar la configuración:
Genere un plan de ejecución para verificar los recursos que Terraform creará o modificará, y luego aplique la configuración para configurar el clúster:
terraform plan
terraform apply
2. Recuperar información del clúster:
Para interactuar con su clúster GKE, deberá recuperar su configuración. Puede ver la configuración actual del clúster con el siguiente comando:
cat ~ /.kube/config
Asegúrese de que su contexto kubectl
esté configurado correctamente para administrar el clúster.
Para un proceso de implementación más práctico, siga estos pasos:
1. Implementar el controlador de entrada Nginx:
El controlador Nginx Ingress gestiona el acceso externo a los servicios en su clúster Kubernetes. Cree un espacio de nombres e instale el controlador de ingreso usando Helm:
kubectl create ns nginx-system
kubens nginx-system
helm upgrade --install nginx-ingress ./deployments/nginx-ingress
Por favor, cuente la dirección IP del controlador de Ingress Nginx, ya que la necesitará más tarde.
2. Configurar secreto de la tecla API:
Almacene sus variables de entorno, como las claves API, de forma segura en los secretos de Kubernetes. Cree un espacio de nombres para el servicio de modelo y cree un secreto desde su archivo .env
:
kubectl create ns model-serving
kubens model-serving
kubectl delete secret easyllmops-env
kubectl create secret generic easyllmops-env --from-env-file=.env -n model-serving
kubectl describe secret easyllmops-env -n model-serving
3. Permisos de subvención:
Los recursos de Kubernetes a menudo requieren permisos específicos. Aplicar los roles y enlaces necesarios:
cd deployments/infrastructure
kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml
4. Implementar el servicio de almacenamiento en caché utilizando Redis:
Ahora, despliegue el servicio de almacenamiento en caché semántico utilizando Redis:
cd ./deployments/redis
helm dependency build
helm upgrade --install redis .
5. Implementar litellm:
Implementar el servicio litellm:
kubens model-serving
helm upgrade --install litellm ./deployments/litellm
6. Implemente el webui abierto:
A continuación, implementa la interfaz de usuario web en tu clúster GKE:
cd open-webui
kubectl apply -f ./kubernetes/manifest/base -n model-serving
7. Juega con la aplicación:
Abra el navegador y navegue a la URL de su clúster GKE (por ejemplo, http://172.0.0.0
en el paso 1) y agregue .nip.io
al final de la URL (por ejemplo, http://172.0.0.0.nip.io
) . Debería ver el Webui abierto:
Para tuberías automatizadas de CI/CD, use Jenkins y Ansible de la siguiente manera:
1. Configure el servidor Jenkins:
Primero, cree una cuenta de servicio y asigne el rol Compute Admin
. Luego cree un archivo de clave JSON para la cuenta de servicio y guárdelo en el directorio iac/ansible/secrets
.
A continuación, cree una instancia de Google Compute Engine llamada "Jenkins-Server" que ejecuta Ubuntu 22.04 con una regla de firewall que permite el tráfico en los puertos 8081 y 50000.
ansible-playbook iac/ansible/deploy_jenkins/create_compute_instance.yaml
Implemente jenkins en un servidor instalando requisitos previos, extrayendo una imagen de Docker y creando un contenedor privilegiado con acceso al Socket Docker y los puertos expuestos 8081 y 50000.
ansible-playbook -i iac/ansible/inventory iac/ansible/deploy_jenkins/deploy_jenkins.yaml
2. Acceda a Jenkins:
Para acceder al servidor Jenkins a través de SSH, necesitamos crear un par de claves públicas/privadas. Ejecute el siguiente comando para crear un par de claves:
ssh-keygen
Abra Metadata
y copie el valor ssh-keys
.
Necesitamos encontrar la contraseña del servidor Jenkins para poder acceder al servidor. Primero, acceda al servidor Jenkins:
ssh < USERNAME > : < EXTERNAL_IP >
Luego ejecute el siguiente comando para obtener la contraseña:
sudo docker exec -it jenkins-server bash
cat /var/jenkins_home/secrets/initialAdminPassword
Una vez que se despliega Jenkins, acceda a él a través de su navegador:
http://:8081
3. Instale complementos de Jenkins:
Instale los siguientes complementos para integrar Jenkins con Docker, Kubernetes y GKE:
Después de instalar los complementos, reinicie Jenkins.
sudo docker restart jenkins-server
4. Configurar Jenkins:
4.1. Agregue Webhooks a su repositorio de GitHub para activar las compilaciones de Jenkins.
Vaya al repositorio de GitHub y haga clic en Settings
. Haga clic en Webhooks
y luego haga clic en Add Webhook
. Ingrese la URL de su servidor Jenkins (por ejemplo, http://
). Luego haga clic en Let me select individual events
y seleccione Let me select individual events
. Seleccione Push
y Pull Request
y haga clic en Add Webhook
.
4.2. Agregue el repositorio de GitHub como repositorio de código fuente de Jenkins.
Vaya al tablero de Jenkins y haga clic en New Item
. Ingrese un nombre para su proyecto (por ejemplo, easy-llmops
) y seleccione Multibranch Pipeline
. Haga clic en OK
. Haga clic en Configure
y luego haga clic en Add Source
. Seleccione GitHub
y haga clic en Add
. Ingrese la URL de su repositorio de GitHub (por ejemplo, https://github.com/bmd1905/EasyLLMOps
). En el campo Credentials
, seleccione Add
y seleccionar Username with password
. Ingrese su nombre de usuario y contraseña de GitHub (o use un token de acceso personal). Haga clic en Test Connection
y luego haga clic en Save
.
4.3. Configurar credenciales de Docker Hub.
Primero, cree una cuenta Docker Hub. Vaya al sitio web de Docker Hub y haga clic en Sign Up
. Ingrese su nombre de usuario y contraseña. Haga clic en Sign Up
. Haga clic en Create Repository
. Ingrese un nombre para su repositorio (por ejemplo, easy-llmops
) y haga clic en Create
.
Desde Jenkins Dashboard, vaya a Manage Jenkins
> Credentials
. Haga clic en Add Credentials
. Seleccione Username with password
y haga clic en Add
. Ingrese su nombre de usuario Docker Hub, el token de acceso y establezca ID
en dockerhub
.
4.4. Configurar credenciales de Kubernetes.
Primero, cree una cuenta de servicio para el servidor Jenkins para acceder al clúster GKE. Vaya a la consola GCP y navegue a las cuentas de servicio IAM & Admin>. Cree una nueva cuenta de servicio con el rol Kubernetes Engine Admin
. Dé a la cuenta de servicio un nombre y descripción. Haga clic en la cuenta de servicio y luego haga clic en la pestaña Keys
. Haga clic en Add Key
y seleccione JSON
como tipo de tecla. Haga clic en Create
y descargar el archivo JSON.
Luego, desde el tablero de Jenkins, vaya a Manage Jenkins
> Cloud
. Haga clic en New cloud
. Seleccione Kubernetes
. Ingrese el nombre de su clúster ( gke-easy-llmops-cluster-1), enter the URL and Certificate from your GKE cluster. In the
espacio de nombres de Kubernetes , enter the namespace of your cluster (eg
Model-Serving ). In the
field, select
Agregar and select
la cuenta de servicio de Google de Private`. Ingrese su ID de proyecto y la ruta al archivo JSON.
5. Pruebe la configuración:
Empuje un nuevo compromiso con su repositorio de GitHub. Deberías ver una nueva construcción en Jenkins.
1. Crea Discord Webhook:
Primero, cree un webhook de discordia. Vaya al sitio web de Discord y haga clic en Server Settings
. Haga clic en Integrations
. Haga clic en Create Webhook
. Ingrese un nombre para su webhook (por ejemplo, easy-llmops-discord-webhook
) y haga clic en Create
. Copie la URL webhook.
2. Configurar repositorios de timón
Primero, necesitamos agregar los repositorios de timón necesarios para Prometheus y Grafana:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
Estos comandos agregan los repositorios oficiales de Prometheus y Grafana Helm y actualizan su información local de gráficos de timón.
3. Instalar dependencias
Prometeo requiere ciertas dependencias que se pueden gestionar con timón. Navegue al directorio de monitoreo y cree estas dependencias:
helm dependency build ./deployments/monitoring/kube-prometheus-stack
4. Implementar Prometheus
Ahora, implementaremos Prometheus y sus servicios asociados usando Helm:
kubectl create namespace monitoring
helm upgrade --install -f deployments/monitoring/kube-prometheus-stack.expanded.yaml kube-prometheus-stack deployments/monitoring/kube-prometheus-stack -n monitoring
Este comando hace lo siguiente:
helm upgrade --install
: esto instalará Prometheus si no existe, o lo actualizará si lo hace.-f deployments/monitoring/kube-prometheus-stack.expanded.yaml
: esto especifica un archivo de valores personalizados para la configuración.kube-prometheus-stack
: este es el nombre de lanzamiento para la instalación del timón.deployments/monitoring/kube-prometheus-stack
: este es el gráfico a usar para la instalación.-n monitoring
: esto especifica el espacio de nombres para instalar.Por defecto, los servicios no están expuestos externamente. Para acceder a ellos, puede usar el puerto que avanza:
Para Prometeo:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090
Luego acceda a Prometeo en http://localhost:9090
Para Grafana:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80
Luego acceda a Grafana en http://localhost:3000
Las credenciales predeterminadas para Grafana suelen ser:
5. Alerta de prueba
Primero necesitamos crear una alerta de muestra. Navegue al directorio monitoring
y ejecute el siguiente comando:
kubectl port-forward -n monitoring svc/alertmanager-operated 9093:9093
Luego, en un nuevo terminal, ejecute el siguiente comando:
curl -XPOST -H " Content-Type: application/json " -d ' [
{
"labels": {
"alertname": "DiskSpaceLow",
"severity": "critical",
"instance": "server02",
"job": "node_exporter",
"mountpoint": "/data"
},
"annotations": {
"summary": "Disk space critically low",
"description": "Server02 has only 5% free disk space on /data volume"
},
"startsAt": "2023-09-01T12:00:00Z",
"generatorURL": "http://prometheus.example.com/graph?g0.expr=node_filesystem_free_bytes+%2F+node_filesystem_size_bytes+%2A+100+%3C+5"
},
{
"labels": {
"alertname": "HighMemoryUsage",
"severity": "warning",
"instance": "server03",
"job": "node_exporter"
},
"annotations": {
"summary": "High memory usage detected",
"description": "Server03 is using over 90% of its available memory"
},
"startsAt": "2023-09-01T12:05:00Z",
"generatorURL": "http://prometheus.example.com/graph?g0.expr=node_memory_MemAvailable_bytes+%2F+node_memory_MemTotal_bytes+%2A+100+%3C+10"
}
] ' http://localhost:9093/api/v2/alerts
Este comando crea una alerta de muestra. Puede verificar que la alerta se creó ejecutando el siguiente comando:
curl http://localhost:9093/api/v2/status
O bien, puede verificar manualmente el canal de discordia.
Esta configuración proporciona capacidades de monitoreo integrales para su clúster Kubernetes. Con Prometheus recolectando métricas y Grafana visualizándolas, puede rastrear efectivamente el rendimiento, configurar alertas para posibles problemas y obtener información valiosa sobre su infraestructura y aplicaciones.
El registro centralizado es esencial para monitorear y resolver problemas de aplicaciones implementadas en Kubernetes. Esta sección lo guía a través de la configuración de una pila de alces (Elasticsearch, Logstash, Kibana) con Filebeat para registrar su clúster GKE.
0. Run rápido
Puedes usar este script de Helmfile único para iniciar la pila de alces:
cd deployments/ELK
helmfile sync
1. Instale la pila de alces con timón
Usaremos Helm para implementar los componentes de la pila Elk:
Primero, cree un espacio de nombres para los componentes de registro:
kubectl create ns logging
kubens logging
A continuación, instale Elasticsearch:
helm install elk-elasticsearch elastic/elasticsearch -f deployments/ELK/elastic.expanded.yaml --namespace logging --create-namespace
Espere a que Elasticsearch esté listo:
echo " Waiting for Elasticsearch to be ready... "
kubectl wait --for=condition=ready pod -l app=elasticsearch-master --timeout=300s
Cree un secreto para Logstash para acceder a ElasticSearch:
kubectl create secret generic logstash-elasticsearch-credentials
--from-literal=username=elastic
--from-literal=password= $( kubectl get secrets --namespace=logging elasticsearch-master-credentials -ojsonpath= ' {.data.password} ' | base64 -d )
Instalar kibana:
helm install elk-kibana elastic/kibana -f deployments/ELK/kibana.expanded.yaml
Instalar Logstash:
helm install elk-logstash elastic/logstash -f deployments/ELK/logstash.expanded.yaml
Instalar fileBeat:
helm install elk-filebeat elastic/filebeat -f deployments/ELK/filebeat.expanded.yaml
2. Acceda a Kibana:
Exponga kibana usando un servicio y acceda a él a través de su navegador:
kubectl port-forward -n logging svc/elk-kibana-kibana 5601:5601
Utilice este script para obtener la contraseña de Kibana:
kubectl get secrets --namespace=logging elasticsearch-master-credentials -ojsonpath= ' {.data.password} ' | base64 -d
Abra su navegador y navegue a http://localhost:5601
.
3. Verificar la colección de registros
Ahora debería poder ver registros de sus vainas de Kubernetes en Kibana. Puede crear paneles y visualizaciones para analizar sus registros y obtener información sobre el comportamiento de su aplicación.
Vaya a Cast AI para registrarse para obtener una cuenta gratuita y obtener el token.
Luego ejecute esta línea para conectarse a GKE:
curl -H " Authorization: Token " " https://api.cast.ai/v1/agent.yaml?provider=gke " | kubectl apply -f -
Hit I ran this script
en la interfaz de usuario de Cast AI, luego copie el código de configuración y péguelo en el terminal:
CASTAI_API_TOKEN= < API_TOKEN > CASTAI_CLUSTER_ID= < CASTAI_CLUSTER_ID > CLUSTER_NAME=easy-llmops-gke INSTALL_AUTOSCALER=true INSTALL_POD_PINNER=true INSTALL_SECURITY_AGENT=true LOCATION=asia-southeast1-b PROJECT_ID=easy-llmops /bin/bash -c " $( curl -fsSL ' https://api.cast.ai/v1/scripts/gke/onboarding.sh ' ) "
Presione I ran this script
y Waite para que la instalación complete.
Entonces puedes ver tus paneles en la interfaz de usuario de Cast AI:
¡Es hora de optimizar tu clúster con el elenco AI! Vaya a la altura de Available savings
y haga clic en el botón Rebalance
.
Vaya a Langfuse y Supabase para registrarse para obtener una cuenta gratuita y obtener las claves API, luego reemplace los lugares PlaceHoders en el archivo .env.example con sus claves API.
¡Agradecemos las contribuciones a EasyllMops! Consulte nuestro contribuyente. MD para obtener más información sobre cómo comenzar.
EasyllMops se lanza bajo la licencia MIT. Consulte el archivo de licencia para obtener más detalles.
Si usa EasyllMops en su investigación, cíquelo de la siguiente manera:
@software{EasyLLMOps2024,
author = {Minh-Duc Bui},
title = {EasyLLMOps: Effortless MLOps for Powerful Language Models.},
year = {2024},
url = {https://github.com/bmd1905/EasyLLMOps}
}
Para preguntas, problemas o colaboraciones, abra un problema en nuestro repositorio de GitHub o comuníquese directamente con los mantenedores.