Easyllmops: Mühelose Mlops für leistungsstarke Sprachmodelle.
EasyllmOps ist ein Projekt, das mit Open Webui erstellt wurde, das in Google Kubernetes Engine (GKE) zur Verwaltung und Skalierung von Sprachmodellen bereitgestellt werden kann. Es bietet sowohl Terraform- als auch manuelle Bereitstellungsmethoden und umfasst robuste MLOPS -Praktiken. Dies umfasst CI/CD -Pipelines mit Jenkins und Ansible zur Automatisierung, Überwachung mit Prometheus und Grafana auf Leistungserkenntnisse und zentralisierte Protokollierung mit dem Elch -Stack für die Fehlerbehebung und Analyse. Entwickler können detaillierte Dokumentationen und Anweisungen auf der Website des Projekts finden.
Entwickler bauen und einsetzen LLM-Anträge. Datenwissenschaftler und maschinelles Lerningenieure, die mit LLMs arbeiten. DevOps -Teams, die für die Verwaltung der LLM -Infrastruktur verantwortlich sind. Organisationen, die LLMs in ihren Betrieb integrieren möchten.
Wenn Sie nicht viel Zeit verbringen möchten, führen Sie dieses Skript aus und genießen Sie Ihren Kaffee:
chmod +x ./cluster.sh
./cluster.sh
Denken Sie daran, sich mit GCP zu authentifizieren, bevor Sie Terraform verwenden:
gcloud auth application-default login
Dieser Abschnitt enthält einen sehr schnellen Start -Leitfaden, um die Anwendung so schnell wie möglich zum Laufen zu bringen. Weitere detailliertere Anweisungen finden Sie in den folgenden Abschnitten.
1. Richten Sie den Cluster ein:
Wenn Sie die Anwendung für GKE bereitstellen, können Sie Terraform verwenden, um die Einrichtung Ihres Kubernetes -Clusters zu automatisieren. Navigieren Sie zum iac/terraform
-Verzeichnis und initialisieren Sie Terraform:
cd iac/terraform
terraform init
Konfiguration planen und anwenden:
Generieren Sie einen Ausführungsplan, um die Ressourcen zu überprüfen, die Terraform erstellt oder ändern, und wenden Sie dann die Konfiguration an, um den Cluster einzurichten:
terraform plan
terraform apply
2. Rufen Sie Clusterinformationen ab:
Um mit Ihrem GKE -Cluster zu interagieren, müssen Sie seine Konfiguration abrufen. Sie können die aktuelle Clusterkonfiguration mit dem folgenden Befehl anzeigen:
cat ~ /.kube/config
Stellen Sie sicher, dass Ihr kubectl
-Kontext korrekt eingestellt ist, um den Cluster zu verwalten.
Befolgen Sie die folgenden Schritte für einen praktischeren Bereitstellungsprozess:
1. Bereitstellen von Nginx Ingress Controller:
Der NGINX Ingress Controller verwaltet den externen Zugriff auf Dienste in Ihrem Kubernetes -Cluster. Erstellen Sie einen Namespace und installieren Sie den Ingress -Controller mit Helm:
kubectl create ns nginx-system
kubens nginx-system
helm upgrade --install nginx-ingress ./deployments/nginx-ingress
BITTE STAGEN Sie die IP -Adresse des Nginx Ingress Controller, da Sie sie später benötigen.
2. Konfigurieren Sie das API -Schlüsselgeheimnis:
Speichern Sie Ihre Umgebungsvariablen wie API -Schlüssel sicher in Kubernetes -Geheimnissen. Erstellen Sie einen Namespace für das Servieren von Modellen und erstellen Sie ein Geheimnis aus Ihrer .env
-Datei:
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.. Zuschussberechtigungen:
Kubernetes -Ressourcen erfordern häufig spezifische Berechtigungen. Wenden Sie die erforderlichen Rollen und Bindungen an:
cd deployments/infrastructure
kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml
V.
Stellen Sie nun den semantischen Caching -Dienst mit Redis ein:
cd ./deployments/redis
helm dependency build
helm upgrade --install redis .
5. Litellm einsetzen:
Stellen Sie den Litellm -Dienst ein:
kubens model-serving
helm upgrade --install litellm ./deployments/litellm
6. Bereitstellen Sie die offene Webui ein:
Stellen Sie als Nächstes die Web -Benutzeroberfläche in Ihrem GKE -Cluster bereit:
cd open-webui
kubectl apply -f ./kubernetes/manifest/base -n model-serving
7. Mit der Anwendung herumspielen:
Öffnen Sie den Browser und navigieren Sie zur URL Ihres http://172.0.0.0.nip.io
-Clusters .nip.io
z http://172.0.0.0
. Sie sollten das offene Webui sehen:
Verwenden Sie für automatisierte CI/CD -Pipelines Jenkins und Ansible wie folgt:
1. Setzen Sie den Jenkins Server ein:
Erstellen Sie zunächst ein Dienstkonto und weisen Sie es die Rolle der Compute Admin
zu. Erstellen Sie dann eine JSON -Schlüsseldatei für das Servicekonto und speichern Sie sie im Verzeichnis iac/ansible/secrets
.
Erstellen Sie als nächstes eine Google Compute Engine-Instanz mit dem Namen "Jenkins-Server", die Ubuntu 22.04 mit einer Firewall-Regel ausführt, die den Verkehr auf den Ports 8081 und 50000 ermöglicht.
ansible-playbook iac/ansible/deploy_jenkins/create_compute_instance.yaml
Stellen Sie Jenkins auf einem Server ein, indem Sie die Voraussetzungen installieren, ein Docker -Image ziehen und einen privilegierten Container mit Zugriff auf den Docker -Socket und den exponierten Ports 8081 und 50000 erstellen.
ansible-playbook -i iac/ansible/inventory iac/ansible/deploy_jenkins/deploy_jenkins.yaml
2. Zugang zu Jenkins:
Um über SSH auf den Jenkins -Server zuzugreifen, müssen wir ein öffentliches/privates Schlüsselpaar erstellen. Führen Sie den folgenden Befehl aus, um ein Schlüsselpaar zu erstellen:
ssh-keygen
Öffnen Sie Metadata
und kopieren Sie den ssh-keys
-Wert.
Wir müssen das Jenkins -Serverkennwort finden, um auf den Server zugreifen zu können. Greifen Sie zunächst auf den Jenkins -Server zu:
ssh < USERNAME > : < EXTERNAL_IP >
Führen Sie dann den folgenden Befehl aus, um das Passwort zu erhalten:
sudo docker exec -it jenkins-server bash
cat /var/jenkins_home/secrets/initialAdminPassword
Sobald Jenkins bereitgestellt ist, greifen Sie über Ihren Browser darauf zu:
http://:8081
3. Installieren Sie Jenkins -Plugins:
Installieren Sie die folgenden Plugins, um Jenkins in Docker, Kubernetes und GKE zu integrieren:
Starten Sie nach der Installation der Plugins Jenkins neu.
sudo docker restart jenkins-server
4. Konfigurieren Sie Jenkins:
4.1. Fügen Sie Ihrem Github -Repository Webhooks hinzu, um Jenkins -Builds auszulösen.
Gehen Sie zum GitHub -Repository und klicken Sie auf Settings
. Klicken Sie auf Webhooks
und klicken Sie dann auf Add Webhook
. Geben Sie die URL Ihres Jenkins-Servers ein (z. B. http://
). Klicken Sie dann auf, Let me select individual events
und Let me select individual events
. Wählen Push
Pull Request
und klicken Sie auf Add Webhook
.
4.2. Fügen Sie Github Repository als Jenkins -Quellcode -Repository hinzu.
Gehen Sie zu Jenkins Dashboard und klicken Sie auf New Item
. Geben Sie einen Namen für Ihr Projekt ein (z. B. easy-llmops
) und wählen Sie Multibranch Pipeline
. Klicken Sie auf OK
. Klicken Sie auf Configure
und klicken Sie dann auf Add Source
. Wählen Sie GitHub
und klicken Sie auf Add
. Geben Sie die URL Ihres Github -Repositorys (z. B. https://github.com/bmd1905/EasyLLMOps
) ein. Wählen Sie im Feld Credentials
Add
und Username with password
auswählen. Geben Sie Ihren GitHub -Benutzernamen und Ihr Passwort ein (oder verwenden Sie ein persönliches Zugriffs -Token). Klicken Sie auf Test Connection
und klicken Sie dann auf Save
.
4.3. Setup Docker Hub Anmeldeinformationen.
Erstellen Sie zunächst ein Docker Hub -Konto. Gehen Sie zur Docker Hub -Website und klicken Sie auf Sign Up
. Geben Sie Ihren Benutzernamen und Ihr Passwort ein. Klicken Sie auf Sign Up
. Klicken Sie auf Create Repository
. Geben Sie einen Namen für Ihr Repository ein (z. B. easy-llmops
) und klicken Sie auf Create
.
Gehen Sie von Jenkins Dashboard aus, um Manage Jenkins
> Credentials
zu verwalten. Klicken Sie auf Add Credentials
. Wählen Sie Username with password
und klicken Sie auf Add
. Geben Sie Ihren Docker Hub -Benutzernamen ein, zugreifen Sie auf Token und setzen Sie ID
an dockerhub
.
4.4. Setup Kubernetes -Anmeldeinformationen.
Erstellen Sie zunächst ein Dienstkonto für den Jenkins -Server, um auf den GKE -Cluster zuzugreifen. Gehen Sie zur GCP -Konsole und navigieren Sie zu IAM & Admin> Service -Konten. Erstellen Sie ein neues Servicekonto mit der Kubernetes Engine Admin
-Rolle. Geben Sie dem Servicekonto einen Namen und eine Beschreibung. Klicken Sie auf das Dienstkonto und klicken Sie dann auf die Keys
Tasten. Klicken Sie auf Add Key
und wählen Sie JSON
als Schlüsseltyp. Klicken Sie auf Create
und Laden Sie die JSON -Datei herunter.
Gehen Sie dann von Jenkins Dashboard aus, um Manage Jenkins
> Cloud
zu verwalten. Klicken Sie auf New cloud
. Wählen Sie Kubernetes
. Geben Sie den Namen Ihres Clusters (z. B. gke-easy-llmops-cluster-1), enter the URL and Certificate from your GKE cluster. In the
Geben Sie gke-easy-llmops-cluster-1), enter the URL and Certificate from your GKE cluster. In the
Kubernetes-Namespace , enter the namespace of your cluster (eg
Modell-Sending ). In the
Wählen Sie ). In the
field, select
Anmeldeinformationen das Konto für das Google -Service aus privat "hinzufügen and select
. Geben Sie Ihren Projekt-ID und den Pfad zur JSON-Datei ein.
5. Testen Sie das Setup:
Drücken Sie ein neues Verpflichtung zu Ihrem Github -Repository. Sie sollten einen Neubau in Jenkins sehen.
1. Erstellen Sie Discord Webhook:
Erstellen Sie zunächst einen Discord Webhook. Gehen Sie zur Website von Discord und klicken Sie auf Server Settings
. Klicken Sie auf Integrations
. Klicken Sie auf Create Webhook
. Geben Sie einen Namen für Ihr Webhook (z. B. EGH easy-llmops-discord-webhook
) ein und klicken Sie auf Create
. Kopieren Sie die Webhook -URL.
2. Konfigurieren Sie Helm -Repositories
Zunächst müssen wir die notwendigen Helm -Repositories für Prometheus und Grafana hinzufügen:
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
Diese Befehle fügen die offiziellen Prometheus- und Grafana -Helm -Repositorys hinzu und aktualisieren Ihre lokalen Helm -Diagramm -Informationen.
3. Installieren Sie Abhängigkeiten
Prometheus erfordert bestimmte Abhängigkeiten, die mit Helm verwaltet werden können. Navigieren Sie zum Überwachungsverzeichnis und erstellen Sie diese Abhängigkeiten:
helm dependency build ./deployments/monitoring/kube-prometheus-stack
V
Jetzt werden wir Prometheus und seine zugehörigen Dienste mit Helm bereitstellen:
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
Dieser Befehl macht Folgendes aus:
helm upgrade --install
: Dies installiert Prometheus, wenn es nicht vorhanden ist, oder aktualisieren Sie es, wenn dies der Fall ist.-f deployments/monitoring/kube-prometheus-stack.expanded.yaml
: Dies gibt eine benutzerdefinierte Wertedatei für die Konfiguration an.kube-prometheus-stack
: Dies ist der Release-Name für die Helminstallation.deployments/monitoring/kube-prometheus-stack
: Dies ist das Diagramm für die Installation.-n monitoring
: Dies gibt den zu installierenden Namespace an.Standardmäßig sind die Dienste extern nicht ausgesetzt. Um darauf zuzugreifen, können Sie Port-Forwarding verwenden:
Für Prometheus:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090
Dann zugreifen Sie Prometheus unter http://localhost:9090
Für Grafana:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80
Dann greifen Sie auf Grafana unter http://localhost:3000
Die Standard -Anmeldeinformationen für Grafana sind normalerweise:
5. Testwarnung
Zuerst müssen wir einen Beispielalarm erstellen. Navigieren Sie zum monitoring
und führen Sie den folgenden Befehl aus:
kubectl port-forward -n monitoring svc/alertmanager-operated 9093:9093
Führen Sie dann in einem neuen Terminal den folgenden Befehl aus:
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
Dieser Befehl erstellt eine Beispielalarm. Sie können überprüfen, ob der Alarm durch Ausführen des folgenden Befehls erstellt wurde:
curl http://localhost:9093/api/v2/status
Oder Sie können den Discord -Kanal manuell überprüfen.
Dieses Setup bietet umfassende Überwachungsfunktionen für Ihren Kubernetes -Cluster. Da Prometheus Metriken sammelt und Grafana sie visualisiert, können Sie die Leistung effektiv verfolgen, Warnungen für potenzielle Probleme einrichten und wertvolle Einblicke in Ihre Infrastruktur und Anwendungen gewinnen.
Die zentrale Protokollierung ist für die Überwachung und Fehlerbehebung von Anwendungen, die auf Kubernetes bereitgestellt werden, unerlässlich. Dieser Abschnitt führt Sie durch die Einrichtung eines Elk -Stacks (Elasticsearch, Logstash, Kibana) mit FileBeat, um Ihren GKE -Cluster zu protokollieren.
0. Schneller Lauf
Sie können dieses einzelne Helmfile -Skript verwenden, um den Elch -Stack zu starten:
cd deployments/ELK
helmfile sync
1. Installieren Sie den Elchstapel mit Helm
Wir werden Helm verwenden, um die Elch -Stack -Komponenten bereitzustellen:
Erstellen Sie zunächst einen Namespace für die Protokollierungskomponenten:
kubectl create ns logging
kubens logging
Installieren Sie als Nächstes Elasticsearch:
helm install elk-elasticsearch elastic/elasticsearch -f deployments/ELK/elastic.expanded.yaml --namespace logging --create-namespace
Warten Sie, bis Elasticsearch bereit ist:
echo " Waiting for Elasticsearch to be ready... "
kubectl wait --for=condition=ready pod -l app=elasticsearch-master --timeout=300s
Erstellen Sie ein Geheimnis für Logstash, um auf Elasticsearch zuzugreifen:
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 )
Kibana installieren:
helm install elk-kibana elastic/kibana -f deployments/ELK/kibana.expanded.yaml
Logstash installieren:
helm install elk-logstash elastic/logstash -f deployments/ELK/logstash.expanded.yaml
Dateibeat installieren:
helm install elk-filebeat elastic/filebeat -f deployments/ELK/filebeat.expanded.yaml
2. Zugang zu Kibana:
Legen Sie Kibana mit einem Service aus und greifen Sie über Ihren Browser darauf zu: greifen Sie darauf zu:
kubectl port-forward -n logging svc/elk-kibana-kibana 5601:5601
Bitte verwenden Sie dieses Skript, um das Kibana -Passwort zu erhalten:
kubectl get secrets --namespace=logging elasticsearch-master-credentials -ojsonpath= ' {.data.password} ' | base64 -d
Öffnen Sie Ihren Browser und navigieren Sie zu http://localhost:5601
.
3.. Überprüfen Sie die Protokollsammlung
Sie sollten jetzt in der Lage sein, Protokolle von Ihren Kubernetes -Pods in Kibana zu sehen. Sie können Dashboards und Visualisierungen erstellen, um Ihre Protokolle zu analysieren und Einblicke in das Verhalten Ihrer Anwendung zu erhalten.
Bitte gehen Sie zu Cast AI, um sich für ein kostenloses Konto anzumelden und das Token zu erhalten.
Führen Sie dann diese Zeile aus, um eine Verbindung zu GKE herzustellen:
curl -H " Authorization: Token " " https://api.cast.ai/v1/agent.yaml?provider=gke " | kubectl apply -f -
Hit I ran this script
, dann kopieren Sie den Konfigurationscode und fügen Sie es in das Terminal ein:
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
und Waite für die Installation abgeschlossen.
Dann können Sie Ihre Dashboards auf der Benutzeroberfläche der Cast Ai sehen:
Es ist Zeit, Ihren Cluster mit Cast AI zu optimieren! Gehen Sie mit der Available savings
und klicken Sie auf die Schaltfläche Rebalance
.
Bitte besuchen Sie Langfuse und Supabase, um sich für ein kostenloses Konto anzumelden und API -Schlüssel zu erhalten. Ersetzen Sie die Lothöder in .Env.example -Datei durch Ihre API -Schlüssel.
Wir begrüßen Beiträge zu Easyllmops! Weitere Informationen zum Einstieg finden Sie in unserem Beitrag zu, um weitere Informationen zum Einstieg zu erhalten.
Easyllmops wird unter der MIT -Lizenz veröffentlicht. Weitere Informationen finden Sie in der Lizenzdatei.
Wenn Sie Easyllmops in Ihrer Forschung verwenden, zitieren Sie dies bitte wie folgt:
@software{EasyLLMOps2024,
author = {Minh-Duc Bui},
title = {EasyLLMOps: Effortless MLOps for Powerful Language Models.},
year = {2024},
url = {https://github.com/bmd1905/EasyLLMOps}
}
Bei Fragen, Problemen oder Kooperationen eröffnen Sie bitte ein Problem in unserem GitHub -Repository oder wenden Sie sich direkt an die Wartenden.