EasyllMops: MOPLles sans effort pour des modèles de langage puissants.
EasyLlMops est un projet construit avec Open WebUI qui peut être déployé sur Google Kubernetes Engine (GKE) pour gérer et mettre à l'échelle des modèles de langage. Il propose à la fois des méthodes Terraform et de déploiement manuel et intègre des pratiques de MLOPS robustes. Cela inclut les pipelines CI / CD avec Jenkins et ANSIBLE pour l'automatisation, la surveillance avec Prometheus et Grafana pour les informations de performance, et la journalisation centralisée avec la pile de wapitis pour le dépannage et l'analyse. Les développeurs peuvent trouver une documentation détaillée et des instructions sur le site Web du projet.
Développeurs Construire et déploier des applications alimentées par LLM. Les scientifiques des données et les ingénieurs d'apprentissage automatique travaillant avec LLMS. Les équipes DevOps responsables de la gestion de l'infrastructure LLM. Les organisations qui cherchent à intégrer les LLM dans leurs opérations.
Si vous ne voulez pas passer beaucoup de temps, veuillez exécuter ce script et profiter de votre café:
chmod +x ./cluster.sh
./cluster.sh
N'oubliez pas d'authentifier avec GCP avant d'utiliser Terraform:
gcloud auth application-default login
Cette section fournit un guide de démarrage très rapide pour faire fonctionner l'application dès que possible. Veuillez vous référer aux sections suivantes pour des instructions plus détaillées.
1. Configurez le cluster:
Si vous déployez l'application sur GKE, vous pouvez utiliser Terraform pour automatiser la configuration de votre cluster Kubernetes. Accédez au répertoire iac/terraform
et initialisez Terraform:
cd iac/terraform
terraform init
Planifier et appliquer la configuration:
Générez un plan d'exécution pour vérifier les ressources que Terraform créera ou modifiera, puis appliquez la configuration pour configurer le cluster:
terraform plan
terraform apply
2. Récupérer les informations du cluster:
Pour interagir avec votre cluster GKE, vous devrez récupérer sa configuration. Vous pouvez afficher la configuration actuelle du cluster avec la commande suivante:
cat ~ /.kube/config
Assurez-vous que votre contexte kubectl
est correctement défini pour gérer le cluster.
Pour un processus de déploiement plus pratique, suivez ces étapes:
1. Déployer le contrôleur d'entrée Nginx:
Le contrôleur Nginx Ingress gère l'accès externe aux services dans votre cluster Kubernetes. Créez un espace de noms et installez le contrôleur d'entrée à l'aide de Helm:
kubectl create ns nginx-system
kubens nginx-system
helm upgrade --install nginx-ingress ./deployments/nginx-ingress
Veuillez histoire l'adresse IP du contrôleur Nginx Ingress, comme vous en aurez besoin plus tard.
2. Configurer le secret de la clé de l'API:
Stockez vos variables d'environnement, telles que les clés d'API, en toute sécurité dans les secrets de Kubernetes. Créez un espace de noms pour le service de modèle et créez un secret à partir de votre fichier .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. Autorisations de subvention:
Les ressources de Kubernetes nécessitent souvent des autorisations spécifiques. Appliquez les rôles et les liaisons nécessaires:
cd deployments/infrastructure
kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml
4. Déployer le service de mise en cache à l'aide de redis:
Maintenant, déployez le service de mise en cache sémantique à l'aide de redis:
cd ./deployments/redis
helm dependency build
helm upgrade --install redis .
5. Déployer Litellm:
Déployez le service Litellm:
kubens model-serving
helm upgrade --install litellm ./deployments/litellm
6. Déployer le webui ouvert:
Ensuite, déployez l'interface utilisateur Web sur votre cluster GKE:
cd open-webui
kubectl apply -f ./kubernetes/manifest/base -n model-serving
7. Jouez avec l'application:
Ouvrez le navigateur et accédez à l'URL de votre cluster GKE (par exemple http://172.0.0.0
à l'étape 1) et ajoutez .nip.io
à la fin de l'URL (par exemple http://172.0.0.0.nip.io
) . Vous devriez voir le webui ouvert:
Pour les pipelines CI / CD automatisés, utilisez des Jenkins et ANSIBLE comme suit:
1. Configurer le serveur Jenkins:
Tout d'abord, créez un compte de service et attribuez-le le rôle Compute Admin
. Créez ensuite un fichier clé JSON pour le compte de service et stockez-le dans le répertoire iac/ansible/secrets
.
Créez ensuite une instance de moteur Google Compute nommé "Jenkins-Server" exécutant Ubuntu 22.04 avec une règle de pare-feu permettant le trafic sur les ports 8081 et 50000.
ansible-playbook iac/ansible/deploy_jenkins/create_compute_instance.yaml
Déployez Jenkins sur un serveur en installant des conditions préalables, en tirant une image Docker et en créant un conteneur privilégié avec l'accès à la prise Docker et aux ports exposés 8081 et 50000.
ansible-playbook -i iac/ansible/inventory iac/ansible/deploy_jenkins/deploy_jenkins.yaml
2. Accès à Jenkins:
Pour accéder au serveur Jenkins via SSH, nous devons créer une paire de clés publique / privée. Exécutez la commande suivante pour créer une paire de clés:
ssh-keygen
Ouvrez Metadata
et copiez la valeur ssh-keys
.
Nous devons trouver le mot de passe Jenkins Server pour pouvoir accéder au serveur. Tout d'abord, accédez au serveur Jenkins:
ssh < USERNAME > : < EXTERNAL_IP >
Ensuite, exécutez la commande suivante pour obtenir le mot de passe:
sudo docker exec -it jenkins-server bash
cat /var/jenkins_home/secrets/initialAdminPassword
Une fois Jenkins déployé, accédez-y via votre navigateur:
http://:8081
3. Installez les plugins Jenkins:
Installez les plugins suivants pour intégrer Jenkins à Docker, Kubernetes et GKE:
Après avoir installé les plugins, redémarrez Jenkins.
sudo docker restart jenkins-server
4. Configurer Jenkins:
4.1. Ajoutez des webhooks à votre référentiel GitHub pour déclencher des builds Jenkins.
Accédez au référentiel GitHub et cliquez sur Settings
. Cliquez sur Webhooks
, puis cliquez sur Add Webhook
. Entrez l'URL de votre serveur Jenkins (par exemple http://
). Cliquez ensuite sur Let me select individual events
et sélectionnez Let me select individual events
. Sélectionnez Push
ET Pull Request
et cliquez sur Add Webhook
.
4.2. Ajoutez le référentiel GitHub en tant que référentiel de code source Jenkins.
Accédez au tableau de bord de Jenkins et cliquez sur New Item
. Entrez un nom pour votre projet (par exemple, easy-llmops
) et sélectionnez Multibranch Pipeline
. Cliquez sur OK
. Cliquez sur Configure
puis cliquez sur Add Source
. Sélectionnez GitHub
et cliquez sur Add
. Entrez l'URL de votre référentiel GitHub (par exemple, https://github.com/bmd1905/EasyLLMOps
). Dans le champ Credentials
, sélectionnez Add
et sélectionner Username with password
. Entrez votre nom d'utilisateur GitHub et votre mot de passe (ou utilisez un jeton d'accès personnel). Cliquez sur Test Connection
, puis cliquez sur Save
.
4.3. Configurez les informations d'identification Docker Hub.
Tout d'abord, créez un compte Docker Hub. Accédez au site Web Docker Hub et cliquez sur Sign Up
. Entrez votre nom d'utilisateur et votre mot de passe. Cliquez sur Sign Up
. Cliquez sur Create Repository
. Entrez un nom pour votre référentiel (par exemple easy-llmops
) et cliquez sur Create
.
Depuis le tableau de bord de Jenkins, allez Manage Jenkins
> Credentials
. Cliquez sur Add Credentials
. Sélectionnez Username with password
et cliquez sur Add
. Entrez votre nom d'utilisateur Docker Hub, votre jeton d'accès et définissez ID
sur dockerhub
.
4.4. Configurez les informations d'identification de Kubernetes.
Tout d'abord, créez un compte de service pour le serveur Jenkins pour accéder au cluster GKE. Accédez à la console GCP et accédez aux comptes de service IAM & Admin>. Créez un nouveau compte de service avec le rôle Kubernetes Engine Admin
. Donnez le compte de service un nom et une description. Cliquez sur le compte Service, puis cliquez sur l'onglet Keys
. Cliquez sur Add Key
et sélectionnez JSON
comme type de clé. Cliquez sur Create
et télécharger le fichier JSON.
Ensuite, à partir du tableau de bord Jenkins, allez Manage Jenkins
> Cloud
. Cliquez sur New cloud
. Sélectionnez Kubernetes
. Entrez le nom de votre cluster (par exemple gke-easy-llmops-cluster-1), enter the URL and Certificate from your GKE cluster. In the
espace de noms de Kubernetes , enter the namespace of your cluster (eg
servant du modèle ). In the
field, select
Ajouter and select
Google Service Compte From Private`. Entrez votre projet-ID et le chemin d'accès au fichier JSON.
5. Testez la configuration:
Poussez un nouvel engagement dans votre référentiel GitHub. Vous devriez voir une nouvelle construction dans Jenkins.
1. Créer Discord WebHook:
Tout d'abord, créez un webhook Discord. Accédez au site Web Discord et cliquez sur Server Settings
. Cliquez sur Integrations
. Cliquez sur Create Webhook
. Entrez un nom pour votre webhook (par exemple, easy-llmops-discord-webhook
) et cliquez sur Create
. Copiez l'URL WebHook.
2. Configurer les référentiels de la barre
Tout d'abord, nous devons ajouter les référentiels de barre nécessaires pour Prometheus et 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
Ces commandes ajoutent les référentiels officiels de Helm Prometheus et Grafana et mettent à jour vos informations locales de graphique de barre.
3. Installez les dépendances
Prométhée nécessite certaines dépendances qui peuvent être gérées avec Helm. Accédez au répertoire de surveillance et créez ces dépendances:
helm dependency build ./deployments/monitoring/kube-prometheus-stack
4. Déployer Prometheus
Maintenant, nous déploierons Prometheus et ses services associés à l'aide de 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
Cette commande fait ce qui suit:
helm upgrade --install
: Cela installera Prometheus s'il n'existe pas, ou la mise à niveau si c'est le cas.-f deployments/monitoring/kube-prometheus-stack.expanded.yaml
: Cela spécifie un fichier de valeurs personnalisé pour la configuration.kube-prometheus-stack
: Ceci est le nom de version de l'installation de Helm.deployments/monitoring/kube-prometheus-stack
: il s'agit du graphique à utiliser pour l'installation.-n monitoring
: Cela spécifie l'espace de noms sur lequel s'installer.Par défaut, les services ne sont pas exposés à l'extérieur. Pour y accéder, vous pouvez utiliser le port de port:
Pour Prometheus:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090
Puis accédez à Prometheus sur http://localhost:9090
Pour Grafana:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80
Puis accédez à Grafana à http://localhost:3000
Les informations d'identification par défaut pour Grafana sont généralement:
5. Alerte de test
Nous devons d'abord créer un exemple d'alerte. Accédez au répertoire monitoring
et exécutez la commande suivante:
kubectl port-forward -n monitoring svc/alertmanager-operated 9093:9093
Ensuite, dans un nouveau terminal, exécutez la commande suivante:
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
Cette commande crée un exemple d'alerte. Vous pouvez vérifier que l'alerte a été créée en exécutant la commande suivante:
curl http://localhost:9093/api/v2/status
Ou, vous pouvez vérifier manuellement le canal Discord.
Cette configuration offre des capacités de surveillance complètes pour votre cluster Kubernetes. Avec Prometheus collectant des mesures et Grafana les visualiser, vous pouvez suivre efficacement les performances, configurer des alertes pour des problèmes potentiels et obtenir des informations précieuses sur votre infrastructure et vos applications.
La journalisation centralisée est essentielle pour la surveillance et le dépannage des applications déployées sur Kubernetes. Cette section vous guide à travers la configuration d'une pile de wapiti (Elasticsearch, Logstash, Kibana) avec Filebeat pour enregistrer votre cluster GKE.
0. Run rapide
Vous pouvez utiliser ce script HelmFile unique pour lancer la pile des wapitis:
cd deployments/ELK
helmfile sync
1. Installez la pile des wapitis avec une barre
Nous utiliserons Helm pour déployer les composants de la pile de wapiti:
Tout d'abord, créez un espace de noms pour les composants de la journalisation:
kubectl create ns logging
kubens logging
Ensuite, installez Elasticsearch:
helm install elk-elasticsearch elastic/elasticsearch -f deployments/ELK/elastic.expanded.yaml --namespace logging --create-namespace
Attendez que Elasticsearch soit prêt:
echo " Waiting for Elasticsearch to be ready... "
kubectl wait --for=condition=ready pod -l app=elasticsearch-master --timeout=300s
Créez un secret pour Logstash pour accéder à 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 )
Installer Kibana:
helm install elk-kibana elastic/kibana -f deployments/ELK/kibana.expanded.yaml
Installer Logstash:
helm install elk-logstash elastic/logstash -f deployments/ELK/logstash.expanded.yaml
Installer filebeat:
helm install elk-filebeat elastic/filebeat -f deployments/ELK/filebeat.expanded.yaml
2. Accès à Kibana:
Exposer Kibana à l'aide d'un service et y accéder via votre navigateur:
kubectl port-forward -n logging svc/elk-kibana-kibana 5601:5601
Veuillez utiliser ce script pour obtenir le mot de passe Kibana:
kubectl get secrets --namespace=logging elasticsearch-master-credentials -ojsonpath= ' {.data.password} ' | base64 -d
Ouvrez votre navigateur et accédez à http://localhost:5601
.
3. Vérifiez la collection de journaux
Vous devriez maintenant pouvoir voir des journaux de vos pods Kubernetes en kibana. Vous pouvez créer des tableaux de bord et des visualisations pour analyser vos journaux et obtenir des informations sur le comportement de votre application.
Veuillez vous lancer dans l'IA pour vous inscrire à un compte gratuit et obtenir le jeton.
Ensuite, exécutez cette ligne pour vous connecter à GKE:
curl -H " Authorization: Token " " https://api.cast.ai/v1/agent.yaml?provider=gke " | kubectl apply -f -
Hit I ran this script
sur l'interface utilisateur de Cast AI, puis copiez le code de configuration et collez-le dans le 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 ' ) "
Hit I ran this script
et attendez que l'installation se termine.
Ensuite, vous pouvez voir vos tableaux de bord sur l'interface utilisateur de Cast AI:
Il est temps d'optimiser votre cluster avec Cast IA! Allez faire le bouton d' Available savings
et cliquez sur le bouton Rebalance
.
Veuillez consulter Langfuse et Supabase pour vous inscrire à un compte gratuit et obtenir des clés API, puis remplacez les lieux de placement dans le fichier .env.example par vos clés API.
Nous accueillons les contributions à EasyllMops! Veuillez consulter notre contribution.md pour plus d'informations sur la façon de commencer.
EasyllMops est libéré sous la licence MIT. Voir le fichier de licence pour plus de détails.
Si vous utilisez EasyllMops dans vos recherches, veuillez le citer comme suit:
@software{EasyLLMOps2024,
author = {Minh-Duc Bui},
title = {EasyLLMOps: Effortless MLOps for Powerful Language Models.},
year = {2024},
url = {https://github.com/bmd1905/EasyLLMOps}
}
Pour des questions, des problèmes ou des collaborations, veuillez ouvrir un problème sur notre référentiel GitHub ou contacter directement les responsables.