EasyLLMOps: MLOps ที่ง่ายดายสำหรับโมเดลภาษาอันทรงพลัง
EasyLLMOps เป็นโปรเจ็กต์ที่สร้างด้วย Open WebUI ซึ่งสามารถนำไปใช้งานบน Google Kubernetes Engine (GKE) เพื่อจัดการและปรับขนาดโมเดลภาษา โดยนำเสนอทั้ง Terraform และวิธีการปรับใช้ด้วยตนเอง และรวมแนวทางปฏิบัติ MLOps ที่แข็งแกร่งไว้ด้วย ซึ่งรวมถึงไปป์ไลน์ CI/CD ที่มี Jenkins และ Ansible สำหรับระบบอัตโนมัติ การตรวจสอบด้วย Prometheus และ Grafana สำหรับข้อมูลเชิงลึกด้านประสิทธิภาพ และการบันทึกแบบรวมศูนย์ด้วยสแต็ก ELK สำหรับการแก้ไขปัญหาและการวิเคราะห์ นักพัฒนาสามารถค้นหาเอกสารและคำแนะนำโดยละเอียดได้จากเว็บไซต์ของโครงการ
นักพัฒนาสร้างและปรับใช้แอปพลิเคชันที่ขับเคลื่อนด้วย LLM นักวิทยาศาสตร์ข้อมูลและวิศวกรการเรียนรู้ของเครื่องที่ทำงานร่วมกับ LLM ทีม DevOps ที่รับผิดชอบในการจัดการโครงสร้างพื้นฐาน LLM องค์กรที่ต้องการบูรณาการ LLM เข้ากับการดำเนินงานของตน
ในกรณีที่คุณไม่ต้องการใช้เวลามาก โปรดเรียกใช้สคริปต์นี้และเพลิดเพลินกับกาแฟของคุณ:
chmod +x ./cluster.sh
./cluster.sh
อย่าลืมตรวจสอบสิทธิ์กับ GCP ก่อนใช้ Terraform:
gcloud auth application-default login
ส่วนนี้จะให้คำแนะนำเริ่มต้นอย่างรวดเร็วเพื่อให้แอปพลิเคชันพร้อมใช้งานโดยเร็วที่สุด โปรดดูส่วนต่อไปนี้สำหรับคำแนะนำโดยละเอียดเพิ่มเติม
1. ตั้งค่าคลัสเตอร์:
หากคุณกำลังปรับใช้แอปพลิเคชันกับ GKE คุณสามารถใช้ Terraform เพื่อทำให้การตั้งค่าคลัสเตอร์ Kubernetes เป็นแบบอัตโนมัติได้ ไปที่ไดเร็กทอรี iac/terraform
และเริ่มต้น Terraform:
cd iac/terraform
terraform init
วางแผนและใช้การกำหนดค่า:
สร้างแผนปฏิบัติการเพื่อตรวจสอบทรัพยากรที่ Terraform จะสร้างหรือแก้ไข จากนั้นใช้การกำหนดค่าเพื่อตั้งค่าคลัสเตอร์:
terraform plan
terraform apply
2. ดึงข้อมูลคลัสเตอร์:
หากต้องการโต้ตอบกับคลัสเตอร์ GKE คุณจะต้องเรียกข้อมูลการกำหนดค่า คุณสามารถดูการกำหนดค่าคลัสเตอร์ปัจจุบันได้ด้วยคำสั่งต่อไปนี้:
cat ~ /.kube/config
ตรวจสอบว่าตั้งค่าบริบท kubectl
อย่างถูกต้องเพื่อจัดการคลัสเตอร์
สำหรับกระบวนการปรับใช้แบบลงมือปฏิบัติจริงมากขึ้น ให้ทำตามขั้นตอนเหล่านี้:
1. ปรับใช้ตัวควบคุม Nginx Ingress:
Nginx Ingress Controller จัดการการเข้าถึงบริการภายนอกในคลัสเตอร์ Kubernetes ของคุณ สร้างเนมสเปซและติดตั้ง Ingress Controller โดยใช้ Helm:
kubectl create ns nginx-system
kubens nginx-system
helm upgrade --install nginx-ingress ./deployments/nginx-ingress
โปรดระบุที่อยู่ IP ของตัวควบคุม Nginx Ingress เนื่องจากคุณจะต้องใช้ในภายหลัง
2. กำหนดค่าความลับของคีย์ API:
จัดเก็บตัวแปรสภาพแวดล้อม เช่น คีย์ API ไว้อย่างปลอดภัยในความลับของ Kubernetes สร้างเนมสเปซสำหรับการให้บริการโมเดลและสร้างข้อมูลลับจากไฟล์ .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. ให้สิทธิ์:
ทรัพยากร Kubernetes มักต้องการสิทธิ์เฉพาะ ใช้บทบาทและการผูกที่จำเป็น:
cd deployments/infrastructure
kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml
4. ปรับใช้บริการแคชโดยใช้ Redis:
ตอนนี้ปรับใช้บริการแคชความหมายโดยใช้ Redis:
cd ./deployments/redis
helm dependency build
helm upgrade --install redis .
5. ปรับใช้ LiteLLM:
ปรับใช้บริการ LiteLLM:
kubens model-serving
helm upgrade --install litellm ./deployments/litellm
6. ปรับใช้ Open WebUI:
ถัดไป ทำให้ UI ของเว็บใช้งานได้กับคลัสเตอร์ GKE ของคุณ:
cd open-webui
kubectl apply -f ./kubernetes/manifest/base -n model-serving
7. เล่นกับแอปพลิเคชัน:
เปิดเบราว์เซอร์และไปที่ URL ของคลัสเตอร์ GKE ของคุณ (เช่น http://172.0.0.0
ในขั้นตอนที่ 1) และเพิ่ม .nip.io
ต่อท้าย URL (เช่น http://172.0.0.0.nip.io
) . คุณควรเห็น Open WebUI:
สำหรับไปป์ไลน์ CI/CD อัตโนมัติ ให้ใช้ Jenkins และ Ansible ดังต่อไปนี้:
1. ตั้งค่าเซิร์ฟเวอร์เจนกินส์:
ขั้นแรก สร้างบัญชีบริการและมอบหมายบทบาท Compute Admin
จากนั้นสร้างไฟล์คีย์ Json สำหรับบัญชีบริการและจัดเก็บไว้ในไดเร็กทอรี iac/ansible/secrets
ถัดไปสร้างอินสแตนซ์ Google Compute Engine ชื่อ "jenkins-server" ที่ใช้งาน Ubuntu 22.04 พร้อมด้วยกฎไฟร์วอลล์ที่อนุญาตการรับส่งข้อมูลบนพอร์ต 8081 และ 50000
ansible-playbook iac/ansible/deploy_jenkins/create_compute_instance.yaml
ปรับใช้ Jenkins บนเซิร์ฟเวอร์โดยการติดตั้งข้อกำหนดเบื้องต้น ดึงอิมเมจ Docker และสร้างคอนเทนเนอร์พิเศษที่สามารถเข้าถึงซ็อกเก็ต Docker และพอร์ตที่เปิดเผย 8081 และ 50000
ansible-playbook -i iac/ansible/inventory iac/ansible/deploy_jenkins/deploy_jenkins.yaml
2. เข้าถึงเจนกินส์:
ในการเข้าถึงเซิร์ฟเวอร์ Jenkins ผ่าน SSH เราจำเป็นต้องสร้างคู่คีย์สาธารณะ/ส่วนตัว รันคำสั่งต่อไปนี้เพื่อสร้างคู่คีย์:
ssh-keygen
เปิด Metadata
และคัดลอกค่า ssh-keys
เราจำเป็นต้องค้นหารหัสผ่านเซิร์ฟเวอร์เจนกินส์เพื่อให้สามารถเข้าถึงเซิร์ฟเวอร์ได้ ขั้นแรก ให้เข้าถึงเซิร์ฟเวอร์ Jenkins:
ssh < USERNAME > : < EXTERNAL_IP >
จากนั้นรันคำสั่งต่อไปนี้เพื่อรับรหัสผ่าน:
sudo docker exec -it jenkins-server bash
cat /var/jenkins_home/secrets/initialAdminPassword
เมื่อปรับใช้ Jenkins แล้ว ให้เข้าถึงผ่านเบราว์เซอร์ของคุณ:
http://<EXTERNAL_IP>:8081
3. ติดตั้งปลั๊กอินเจนกินส์:
ติดตั้งปลั๊กอินต่อไปนี้เพื่อรวม Jenkins เข้ากับ Docker, Kubernetes และ GKE:
หลังจากติดตั้งปลั๊กอินแล้ว ให้รีสตาร์ท Jenkins
sudo docker restart jenkins-server
4. กำหนดค่าเจนกินส์:
4.1. เพิ่ม webhooks ไปยังที่เก็บ GitHub ของคุณเพื่อทริกเกอร์การสร้าง Jenkins
ไปที่ที่เก็บ GitHub และคลิกที่ Settings
คลิกที่ Webhooks
จากนั้นคลิกที่ Add Webhook
ป้อน URL ของเซิร์ฟเวอร์ Jenkins ของคุณ (เช่น http://<EXTERNAL_IP>:8081/github-webhook/
) จากนั้นคลิกที่ Let me select individual events
และเลือก Let me select individual events
เลือก Pull Request
Push
and Pull และคลิกที่ Add Webhook
4.2. เพิ่มที่เก็บ Github เป็นที่เก็บซอร์สโค้ด Jenkins
ไปที่แดชบอร์ด Jenkins และคลิกที่ New Item
ป้อนชื่อโครงการของคุณ (เช่น easy-llmops
) และเลือก Multibranch Pipeline
คลิกที่ OK
คลิกที่ Configure
จากนั้นคลิกที่ Add Source
เลือก GitHub
และคลิกที่ Add
ป้อน URL ของที่เก็บ GitHub ของคุณ (เช่น https://github.com/bmd1905/EasyLLMOps
) ในฟิลด์ Credentials
ให้เลือก Add
และเลือก Username with password
ป้อนชื่อผู้ใช้และรหัสผ่าน GitHub ของคุณ (หรือใช้โทเค็นการเข้าถึงส่วนบุคคล) คลิกที่ Test Connection
แล้วคลิกที่ Save
4.3. ตั้งค่าข้อมูลรับรองฮับนักเทียบท่า
ขั้นแรก สร้างบัญชี Docker Hub ไปที่เว็บไซต์ Docker Hub และคลิกที่ Sign Up
กรอกชื่อผู้ใช้และรหัสผ่านของคุณ คลิกที่ Sign Up
คลิกที่ Create Repository
ป้อนชื่อสำหรับพื้นที่เก็บข้อมูลของคุณ (เช่น easy-llmops
) และคลิกที่ Create
จากแดชบอร์ด Jenkins ให้ไปที่ Manage Jenkins
> Credentials
คลิกที่ Add Credentials
เลือก Username with password
แล้วคลิก Add
ป้อนชื่อผู้ใช้ Docker Hub โทเค็นการเข้าถึง และตั้งค่า ID
เป็น dockerhub
4.4. ตั้งค่าข้อมูลรับรอง Kubernetes
ขั้นแรก สร้างบัญชีบริการสำหรับเซิร์ฟเวอร์ Jenkins เพื่อเข้าถึงคลัสเตอร์ GKE ไปที่คอนโซล GCP และไปที่ IAM และผู้ดูแลระบบ > บัญชีบริการ สร้างบัญชีบริการใหม่ด้วยบทบาท Kubernetes Engine Admin
ตั้งชื่อและคำอธิบายให้กับบัญชีบริการ คลิกที่บัญชีบริการแล้วคลิกที่แท็บ Keys
คลิกที่ Add Key
และเลือก JSON
เป็นประเภทคีย์ คลิกที่ Create
และดาวน์โหลดไฟล์ JSON
จากนั้น จากแดชบอร์ด Jenkins ให้ไปที่ Manage Jenkins
> Cloud
คลิกที่ New cloud
เลือก Kubernetes
ป้อนชื่อคลัสเตอร์ของคุณ (เช่น 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
model-serving ). In the
field, select
เพิ่ม and select
บัญชีบริการ Google จากส่วนตัว ป้อนรหัสโครงการและเส้นทางไปยังไฟล์ JSON
5. ทดสอบการตั้งค่า:
พุชคอมมิตใหม่ไปยังที่เก็บ GitHub ของคุณ คุณควรเห็นโครงสร้างใหม่ในเจนกินส์
1. สร้างเว็บฮุค Discord:
ขั้นแรก สร้างเว็บฮุค Discord ไปที่เว็บไซต์ Discord และคลิกที่ Server Settings
คลิกที่ Integrations
คลิกที่ Create Webhook
ป้อนชื่อ webhook ของคุณ (เช่น easy-llmops-discord-webhook
) และคลิกที่ Create
คัดลอก URL ของเว็บฮุค
2. กำหนดค่าที่เก็บ Helm
ก่อนอื่น เราต้องเพิ่มที่เก็บ Helm ที่จำเป็นสำหรับ Prometheus และ 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
คำสั่งเหล่านี้จะเพิ่มที่เก็บ Prometheus และ Grafana Helm อย่างเป็นทางการ และอัปเดตข้อมูลแผนภูมิ Helm ในเครื่องของคุณ
3. ติดตั้งการพึ่งพา
Prometheus ต้องการการพึ่งพาบางอย่างที่สามารถจัดการได้ด้วย Helm นำทางไปยังไดเร็กทอรีการมอนิเตอร์และสร้างการขึ้นต่อกันเหล่านี้:
helm dependency build ./deployments/monitoring/kube-prometheus-stack
4. ปรับใช้โพรมีธีอุส
ตอนนี้ เราจะปรับใช้ Prometheus และบริการที่เกี่ยวข้องโดยใช้ 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
คำสั่งนี้ทำหน้าที่ดังต่อไปนี้:
helm upgrade --install
: สิ่งนี้จะติดตั้ง Prometheus หากไม่มีอยู่ หรืออัปเกรดหากมี-f deployments/monitoring/kube-prometheus-stack.expanded.yaml
: สิ่งนี้ระบุไฟล์ค่าที่กำหนดเองสำหรับการกำหนดค่าkube-prometheus-stack
: นี่คือชื่อรุ่นสำหรับการติดตั้ง Helmdeployments/monitoring/kube-prometheus-stack
: นี่คือแผนภูมิที่จะใช้สำหรับการติดตั้ง-n monitoring
: นี่เป็นการระบุเนมสเปซที่จะติดตั้งตามค่าเริ่มต้น บริการจะไม่ถูกเปิดเผยจากภายนอก หากต้องการเข้าถึงคุณสามารถใช้การส่งต่อพอร์ต:
สำหรับโพร:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090
จากนั้นเข้าถึง Prometheus ที่ http://localhost:9090
สำหรับกราฟาน่า:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80
จากนั้นเข้าถึง Grafana ที่ http://localhost:3000
ข้อมูลประจำตัวเริ่มต้นสำหรับ Grafana มักจะเป็น:
5. ทดสอบการแจ้งเตือน
ขั้นแรกเราต้องสร้างการแจ้งเตือนตัวอย่าง ไปที่ไดเร็กทอรี monitoring
และรันคำสั่งต่อไปนี้:
kubectl port-forward -n monitoring svc/alertmanager-operated 9093:9093
จากนั้นในเทอร์มินัลใหม่ ให้รันคำสั่งต่อไปนี้:
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
คำสั่งนี้สร้างการแจ้งเตือนตัวอย่าง คุณสามารถตรวจสอบได้ว่าการแจ้งเตือนถูกสร้างขึ้นโดยการรันคำสั่งต่อไปนี้:
curl http://localhost:9093/api/v2/status
หรือคุณสามารถตรวจสอบช่อง Discord ด้วยตนเองได้
การตั้งค่านี้มอบความสามารถในการตรวจสอบที่ครอบคลุมสำหรับคลัสเตอร์ Kubernetes ของคุณ ด้วย Prometheus ที่รวบรวมตัววัดและ Grafana แสดงภาพ คุณสามารถติดตามประสิทธิภาพ ตั้งค่าการแจ้งเตือนสำหรับปัญหาที่อาจเกิดขึ้น และรับข้อมูลเชิงลึกอันมีค่าเกี่ยวกับโครงสร้างพื้นฐานและแอปพลิเคชันของคุณได้อย่างมีประสิทธิภาพ
การบันทึกแบบรวมศูนย์ถือเป็นสิ่งสำคัญสำหรับการตรวจสอบและแก้ไขปัญหาแอปพลิเคชันที่ใช้งานบน Kubernetes ส่วนนี้จะแนะนำคุณตลอดการตั้งค่าสแต็ก ELK (Elasticsearch, Logstash, Kibana) ด้วย Filebeat สำหรับการบันทึกคลัสเตอร์ GKE ของคุณ
0. วิ่งเร็ว
คุณสามารถใช้สคริปต์ helmfile เดี่ยวนี้เพื่อเริ่มต้นสแต็ก ELK:
cd deployments/ELK
helmfile sync
1. ติดตั้ง ELK Stack พร้อม Helm
เราจะใช้ Helm เพื่อปรับใช้ส่วนประกอบสแต็ก ELK:
ขั้นแรก สร้างเนมสเปซสำหรับส่วนประกอบการบันทึก:
kubectl create ns logging
kubens logging
ถัดไป ติดตั้ง Elasticsearch:
helm install elk-elasticsearch elastic/elasticsearch -f deployments/ELK/elastic.expanded.yaml --namespace logging --create-namespace
รอให้ Elasticsearch พร้อม:
echo " Waiting for Elasticsearch to be ready... "
kubectl wait --for=condition=ready pod -l app=elasticsearch-master --timeout=300s
สร้างความลับสำหรับ Logstash เพื่อเข้าถึง 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 )
ติดตั้งคิบาน่า:
helm install elk-kibana elastic/kibana -f deployments/ELK/kibana.expanded.yaml
ติดตั้ง Logstash:
helm install elk-logstash elastic/logstash -f deployments/ELK/logstash.expanded.yaml
ติดตั้ง Filebeat:
helm install elk-filebeat elastic/filebeat -f deployments/ELK/filebeat.expanded.yaml
2. เข้าถึงคิบานะ:
เปิดเผย Kibana โดยใช้บริการและเข้าถึงผ่านเบราว์เซอร์ของคุณ:
kubectl port-forward -n logging svc/elk-kibana-kibana 5601:5601
โปรดใช้สคริปต์นี้เพื่อรับรหัสผ่าน Kibana:
kubectl get secrets --namespace=logging elasticsearch-master-credentials -ojsonpath= ' {.data.password} ' | base64 -d
เปิดเบราว์เซอร์ของคุณและไปที่ http://localhost:5601
3. ตรวจสอบการรวบรวมบันทึก
ตอนนี้คุณควรจะดูบันทึกจากพ็อด Kubernetes ใน Kibana ได้แล้ว คุณสามารถสร้างแดชบอร์ดและการแสดงภาพเพื่อวิเคราะห์บันทึกของคุณและรับข้อมูลเชิงลึกเกี่ยวกับพฤติกรรมของแอปพลิเคชันของคุณ
โปรดไปที่ Cast AI เพื่อสมัครบัญชีฟรีและรับ TOKEN
จากนั้นรันบรรทัดนี้เพื่อเชื่อมต่อกับ GKE:
curl -H " Authorization: Token <TOKEN> " " https://api.cast.ai/v1/agent.yaml?provider=gke " | kubectl apply -f -
กด I ran this script
บน UI ของ Cast AI จากนั้นคัดลอกโค้ดการกำหนดค่าและวางลงในเทอร์มินัล:
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 ' ) "
กด I ran this script
อีกครั้ง และรอให้การติดตั้งเสร็จสิ้น
จากนั้นคุณจะเห็นแดชบอร์ดของคุณบน UI ของ Cast AI:
ถึงเวลาเพิ่มประสิทธิภาพคลัสเตอร์ของคุณด้วย Cast AI! ไปที่ส่วน Available savings
แล้วคลิกปุ่ม Rebalance
โปรดไปที่ Langfuse และ Supabase เพื่อลงทะเบียนบัญชีฟรีและรับคีย์ API จากนั้นแทนที่ placehoders ในไฟล์ .env.example ด้วยคีย์ API ของคุณ
เรายินดีต้อนรับการมีส่วนร่วมของ EasyLLMOps! โปรดดู CONTRIBUTING.md ของเราสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเริ่มต้น
EasyLLMOps ได้รับการเผยแพร่ภายใต้ใบอนุญาต MIT ดูไฟล์ใบอนุญาตสำหรับรายละเอียดเพิ่มเติม
หากคุณใช้ EasyLLMOps ในการวิจัยของคุณ โปรดอ้างอิงดังต่อไปนี้:
@software{EasyLLMOps2024,
author = {Minh-Duc Bui},
title = {EasyLLMOps: Effortless MLOps for Powerful Language Models.},
year = {2024},
url = {https://github.com/bmd1905/EasyLLMOps}
}
หากมีคำถาม ปัญหา หรือความร่วมมือ โปรดเปิดปัญหาบนพื้นที่เก็บข้อมูล GitHub ของเรา หรือติดต่อผู้ดูแลโดยตรง