EasyLLMOps: MLOps yang Mudah untuk Model Bahasa yang Kuat.
EasyLLMOps adalah proyek yang dibuat dengan Open WebUI yang dapat diterapkan di Google Kubernetes Engine (GKE) untuk mengelola dan menskalakan model bahasa. Ia menawarkan metode penerapan Terraform dan manual, serta menggabungkan praktik MLOps yang kuat. Hal ini mencakup pipeline CI/CD dengan Jenkins dan Ansible untuk otomatisasi, pemantauan dengan Prometheus dan Grafana untuk wawasan kinerja, dan pencatatan log terpusat dengan tumpukan ELK untuk pemecahan masalah dan analisis. Pengembang dapat menemukan dokumentasi dan instruksi terperinci di situs web proyek.
Pengembang membangun dan menerapkan aplikasi yang didukung LLM. Ilmuwan data dan insinyur pembelajaran mesin yang bekerja dengan LLM. Tim DevOps bertanggung jawab mengelola infrastruktur LLM. Organisasi yang ingin mengintegrasikan LLM ke dalam operasi mereka.
Jika Anda tidak ingin menghabiskan banyak waktu, jalankan skrip ini dan nikmati kopi Anda:
chmod +x ./cluster.sh
./cluster.sh
Ingatlah untuk mengautentikasi dengan GCP sebelum menggunakan Terraform:
gcloud auth application-default login
Bagian ini memberikan panduan memulai yang sangat cepat untuk mengaktifkan dan menjalankan aplikasi sesegera mungkin. Silakan merujuk ke bagian berikut untuk instruksi lebih rinci.
1. Siapkan Klaster:
Jika Anda men-deploy aplikasi ke GKE, Anda dapat menggunakan Terraform untuk mengotomatiskan penyiapan cluster Kubernetes Anda. Arahkan ke direktori iac/terraform
dan inisialisasi Terraform:
cd iac/terraform
terraform init
Rencanakan dan Terapkan Konfigurasi:
Buat rencana eksekusi untuk memverifikasi sumber daya yang akan dibuat atau dimodifikasi oleh Terraform, lalu terapkan konfigurasi untuk menyiapkan cluster:
terraform plan
terraform apply
2. Ambil Informasi Klaster:
Untuk berinteraksi dengan cluster GKE, Anda perlu mengambil konfigurasinya. Anda dapat melihat konfigurasi cluster saat ini dengan perintah berikut:
cat ~ /.kube/config
Pastikan konteks kubectl
Anda diatur dengan benar untuk mengelola klaster.
Untuk proses penerapan yang lebih praktis, ikuti langkah-langkah berikut:
1. Terapkan Pengontrol Nginx Ingress:
Pengontrol Nginx Ingress mengelola akses eksternal ke layanan di cluster Kubernetes Anda. Buat namespace dan instal Ingress Controller menggunakan Helm:
kubectl create ns nginx-system
kubens nginx-system
helm upgrade --install nginx-ingress ./deployments/nginx-ingress
Harap sebutkan alamat IP Pengontrol Nginx Ingress, karena Anda akan memerlukannya nanti.
2. Konfigurasikan Rahasia Kunci API:
Simpan variabel lingkungan Anda, seperti kunci API, dengan aman di rahasia Kubernetes. Buat namespace untuk penyajian model dan buat rahasia dari file .env
Anda:
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. Berikan Izin:
Sumber daya Kubernetes sering kali memerlukan izin khusus. Terapkan peran dan ikatan yang diperlukan:
cd deployments/infrastructure
kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml
4. Terapkan layanan caching menggunakan Redis:
Sekarang, terapkan layanan cache semantik menggunakan Redis:
cd ./deployments/redis
helm dependency build
helm upgrade --install redis .
5. Terapkan LiteLLM:
Terapkan layanan LiteLLM:
kubens model-serving
helm upgrade --install litellm ./deployments/litellm
6. Terapkan Open WebUI:
Selanjutnya, Deploy UI web ke cluster GKE Anda:
cd open-webui
kubectl apply -f ./kubernetes/manifest/base -n model-serving
7. Bermain-main dengan Aplikasi:
Buka browser dan buka URL cluster GKE Anda (misalnya http://172.0.0.0
pada langkah 1) dan tambahkan .nip.io
di akhir URL (misalnya http://172.0.0.0.nip.io
) . Anda akan melihat Open WebUI:
Untuk pipeline CI/CD otomatis, gunakan Jenkins dan Ansible sebagai berikut:
1. Siapkan Server Jenkins:
Pertama, buat Akun Layanan dan tetapkan peran Compute Admin
. Kemudian buat file kunci Json untuk Akun Layanan dan simpan di direktori iac/ansible/secrets
.
Selanjutnya buat instance Google Compute Engine bernama "jenkins-server" yang menjalankan Ubuntu 22.04 dengan aturan firewall yang mengizinkan lalu lintas pada port 8081 dan 50000.
ansible-playbook iac/ansible/deploy_jenkins/create_compute_instance.yaml
Terapkan Jenkins di server dengan menginstal prasyarat, menarik image Docker, dan membuat kontainer istimewa dengan akses ke soket Docker dan port terbuka 8081 dan 50000.
ansible-playbook -i iac/ansible/inventory iac/ansible/deploy_jenkins/deploy_jenkins.yaml
2. Akses Jenkins:
Untuk mengakses server Jenkins melalui SSH, kita perlu membuat pasangan kunci publik/pribadi. Jalankan perintah berikut untuk membuat pasangan kunci:
ssh-keygen
Buka Metadata
dan salin nilai ssh-keys
.
Kita perlu mencari password server Jenkins untuk dapat mengakses server. Pertama, akses server Jenkins:
ssh < USERNAME > : < EXTERNAL_IP >
Kemudian jalankan perintah berikut untuk mendapatkan kata sandi:
sudo docker exec -it jenkins-server bash
cat /var/jenkins_home/secrets/initialAdminPassword
Setelah Jenkins diterapkan, akses melalui browser Anda:
http://:8081
3. Instal Plugin Jenkins:
Instal plugin berikut untuk mengintegrasikan Jenkins dengan Docker, Kubernetes, dan GKE:
Setelah menginstal plugin, restart Jenkins.
sudo docker restart jenkins-server
4. Konfigurasikan Jenkins:
4.1. Tambahkan webhook ke repositori GitHub Anda untuk memicu pembangunan Jenkins.
Buka repositori GitHub dan klik Settings
. Klik Webhooks
lalu klik Add Webhook
. Masukkan URL server Jenkins Anda (misalnya http://
). Kemudian klik Let me select individual events
dan pilih Let me select individual events
. Pilih Pull Request
Push
dan Tarik dan klik Add Webhook
.
4.2. Tambahkan repositori Github sebagai repositori kode sumber Jenkins.
Buka dasbor Jenkins dan klik New Item
. Masukkan nama untuk proyek Anda (misalnya easy-llmops
) dan pilih Multibranch Pipeline
. Klik OK
. Klik Configure
lalu klik Add Source
. Pilih GitHub
dan klik Add
. Masukkan URL repositori GitHub Anda (misalnya https://github.com/bmd1905/EasyLLMOps
). Di bidang Credentials
, pilih Add
dan pilih Username with password
. Masukkan nama pengguna dan kata sandi GitHub Anda (atau gunakan token akses pribadi). Klik Test Connection
lalu klik Save
.
4.3. Siapkan kredensial hub buruh pelabuhan.
Pertama, buat akun Docker Hub. Buka situs web Docker Hub dan klik Sign Up
. Masukkan nama pengguna dan kata sandi Anda. Klik Sign Up
. Klik Create Repository
. Masukkan nama untuk repositori Anda (misalnya easy-llmops
) dan klik Create
.
Dari dasbor Jenkins, buka Manage Jenkins
> Credentials
. Klik Add Credentials
. Pilih Username with password
dan klik Add
. Masukkan nama pengguna Docker Hub Anda, token akses, dan atur ID
ke dockerhub
.
4.4. Siapkan kredensial Kubernetes.
Pertama, buat Akun Layanan untuk server Jenkins guna mengakses cluster GKE. Buka konsol GCP dan buka IAM & Admin > Akun Layanan. Buat akun layanan baru dengan peran Kubernetes Engine Admin
. Berikan nama dan deskripsi pada akun layanan. Klik pada akun layanan dan kemudian klik pada tab Keys
. Klik Add Key
dan pilih JSON
sebagai jenis kunci. Klik Create
dan unduh file JSON.
Lalu, dari dasbor Jenkins, buka Manage Jenkins
> Cloud
. Klik pada New cloud
. Pilih Kubernetes
. Masukkan nama cluster Anda (misalnya gke-easy-llmops-cluster-1), enter the URL and Certificate from your GKE cluster. In the
Namespace Kubernetes , enter the namespace of your cluster (eg
model-serving ). In the
field, select
Tambah and select
Akun Layanan Google dari pribadi`. Masukkan id proyek Anda dan jalur ke file JSON.
5. Uji pengaturannya:
Dorong penerapan baru ke repositori GitHub Anda. Anda akan melihat build baru di Jenkins.
1. Buat webhook Perselisihan:
Pertama, buat webhook Discord. Kunjungi situs web Discord dan klik Server Settings
. Klik Integrations
. Klik Create Webhook
. Masukkan nama untuk webhook Anda (misalnya easy-llmops-discord-webhook
) dan klik Create
. Salin URL webhook.
2. Konfigurasikan Repositori Helm
Pertama, kita perlu menambahkan repositori Helm yang diperlukan untuk Prometheus dan 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
Perintah ini menambahkan repositori resmi Prometheus dan Grafana Helm dan memperbarui informasi grafik Helm lokal Anda.
3. Instal Dependensi
Prometheus memerlukan dependensi tertentu yang dapat dikelola dengan Helm. Navigasikan ke direktori pemantauan dan bangun dependensi ini:
helm dependency build ./deployments/monitoring/kube-prometheus-stack
4. Sebarkan Prometheus
Sekarang, kami akan menerapkan Prometheus dan layanan terkaitnya menggunakan 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
Perintah ini melakukan hal berikut:
helm upgrade --install
: Ini akan menginstal Prometheus jika tidak ada, atau memutakhirkannya jika ada.-f deployments/monitoring/kube-prometheus-stack.expanded.yaml
: Ini menentukan file nilai khusus untuk konfigurasi.kube-prometheus-stack
: Ini adalah nama rilis untuk instalasi Helm.deployments/monitoring/kube-prometheus-stack
: Ini adalah bagan yang digunakan untuk instalasi.-n monitoring
: Ini menentukan namespace yang akan diinstal.Secara default, layanan tidak diekspos secara eksternal. Untuk mengaksesnya, Anda dapat menggunakan penerusan porta:
Untuk Prometheus:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090
Kemudian akses Prometheus di http://localhost:9090
Untuk Grafana:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80
Kemudian akses Grafana di http://localhost:3000
Kredensial default untuk Grafana biasanya:
5. Uji Peringatan
Pertama kita perlu membuat contoh peringatan. Arahkan ke direktori monitoring
dan jalankan perintah berikut:
kubectl port-forward -n monitoring svc/alertmanager-operated 9093:9093
Kemudian, di terminal baru, jalankan perintah berikut:
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
Perintah ini membuat contoh peringatan. Anda dapat memverifikasi bahwa pemberitahuan telah dibuat dengan menjalankan perintah berikut:
curl http://localhost:9093/api/v2/status
Atau, Anda dapat memeriksa saluran Discord secara manual.
Penyiapan ini memberikan kemampuan pemantauan komprehensif untuk cluster Kubernetes Anda. Dengan Prometheus mengumpulkan metrik dan Grafana memvisualisasikannya, Anda dapat melacak kinerja secara efektif, menyiapkan peringatan untuk potensi masalah, dan mendapatkan wawasan berharga tentang infrastruktur dan aplikasi Anda.
Logging terpusat sangat penting untuk memantau dan memecahkan masalah aplikasi yang diterapkan di Kubernetes. Bagian ini memandu Anda menyiapkan tumpukan ELK (Elasticsearch, Logstash, Kibana) dengan Filebeat untuk mencatat log cluster GKE Anda.
0. Lari cepat
Anda dapat menggunakan skrip helmfile tunggal ini untuk memulai tumpukan ELK:
cd deployments/ELK
helmfile sync
1. Instal ELK Stack dengan Helm
Kami akan menggunakan Helm untuk menyebarkan komponen tumpukan ELK:
Pertama, buat namespace untuk komponen logging:
kubectl create ns logging
kubens logging
Selanjutnya, instal Elasticsearch:
helm install elk-elasticsearch elastic/elasticsearch -f deployments/ELK/elastic.expanded.yaml --namespace logging --create-namespace
Tunggu hingga Elasticsearch siap:
echo " Waiting for Elasticsearch to be ready... "
kubectl wait --for=condition=ready pod -l app=elasticsearch-master --timeout=300s
Buat rahasia untuk Logstash untuk mengakses 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 )
Instal Kibana:
helm install elk-kibana elastic/kibana -f deployments/ELK/kibana.expanded.yaml
Instal Logstash:
helm install elk-logstash elastic/logstash -f deployments/ELK/logstash.expanded.yaml
Instal Filebeat:
helm install elk-filebeat elastic/filebeat -f deployments/ELK/filebeat.expanded.yaml
2. Akses Kibana:
Ekspos Kibana menggunakan layanan dan akses melalui browser Anda:
kubectl port-forward -n logging svc/elk-kibana-kibana 5601:5601
Silakan gunakan skrip ini untuk mendapatkan kata sandi Kibana:
kubectl get secrets --namespace=logging elasticsearch-master-credentials -ojsonpath= ' {.data.password} ' | base64 -d
Buka browser Anda dan navigasikan ke http://localhost:5601
.
3. Verifikasi Pengumpulan Log
Anda sekarang seharusnya dapat melihat log dari pod Kubernetes Anda di Kibana. Anda dapat membuat dasbor dan visualisasi untuk menganalisis log dan mendapatkan wawasan tentang perilaku aplikasi Anda.
Silakan buka Cast AI untuk mendaftar akun gratis dan mendapatkan TOKEN.
Kemudian jalankan baris ini untuk terhubung ke GKE:
curl -H " Authorization: Token " " https://api.cast.ai/v1/agent.yaml?provider=gke " | kubectl apply -f -
Tekan I ran this script
di UI Cast AI, lalu salin kode konfigurasi dan tempel ke 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 ' ) "
Tekan I ran this script
lagi dan tunggu hingga instalasi selesai.
Kemudian Anda dapat melihat dasbor Anda di UI Cast AI:
Saatnya mengoptimalkan cluster Anda dengan Cast AI! Buka bagian Available savings
dan klik tombol Rebalance
.
Silakan buka Langfuse dan Supabase untuk mendaftar akun gratis dan mendapatkan kunci API, lalu ganti placehoder di file .env.example dengan kunci API Anda.
Kami menyambut kontribusi ke EasyLLMOps! Silakan lihat CONTRIBUTING.md kami untuk informasi lebih lanjut tentang cara memulai.
EasyLLMOps dirilis di bawah Lisensi MIT. Lihat file LISENSI untuk lebih jelasnya.
Jika Anda menggunakan EasyLLMOps dalam penelitian Anda, harap kutip sebagai berikut:
@software{EasyLLMOps2024,
author = {Minh-Duc Bui},
title = {EasyLLMOps: Effortless MLOps for Powerful Language Models.},
year = {2024},
url = {https://github.com/bmd1905/EasyLLMOps}
}
Untuk pertanyaan, masalah, atau kolaborasi, silakan buka masalah di repositori GitHub kami atau hubungi pengelola secara langsung.