EasyllMops: MLOPs ที่ง่ายดายสำหรับแบบจำลองภาษาที่ทรงพลัง
EasyllMops เป็นโครงการที่สร้างขึ้นด้วย WebUI แบบเปิดที่สามารถนำไปใช้กับ Google Kubernetes Engine (GKE) สำหรับการจัดการและปรับขนาดภาษา มันมีทั้งวิธีการปรับใช้ Terraform และ Manual และรวมเอาวิธีปฏิบัติ MLOP ที่แข็งแกร่ง ซึ่งรวมถึงท่อส่ง CI/CD ที่มีเจนกินส์และ ANSIBLE สำหรับระบบอัตโนมัติการตรวจสอบด้วยโพรและกราฟานาสำหรับข้อมูลเชิงลึกด้านประสิทธิภาพและการบันทึกส่วนกลางกับ Elk Stack สำหรับการแก้ไขปัญหาและการวิเคราะห์ นักพัฒนาสามารถค้นหาเอกสารโดยละเอียดและคำแนะนำในเว็บไซต์ของโครงการ
นักพัฒนาซอฟต์แวร์สร้างและปรับใช้แอพพลิเคชั่นที่ขับเคลื่อนด้วย LLM นักวิทยาศาสตร์ด้านข้อมูลและวิศวกรการเรียนรู้ของเครื่องทำงานกับ LLMS ทีม 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 Controller:
คอนโทรลเลอร์ Nginx Ingress จัดการการเข้าถึงบริการภายนอกในคลัสเตอร์ Kubernetes ของคุณ สร้างเนมสเปซและติดตั้งคอนโทรลเลอร์ Ingress โดยใช้ Helm:
kubectl create ns nginx-system
kubens nginx-system
helm upgrade --install nginx-ingress ./deployments/nginx-ingress
โปรดเล่าที่อยู่ IP ของ Nginx Ingress Controller ตามที่คุณต้องการในภายหลัง
2. กำหนดค่า API Key Secret:
เก็บตัวแปรสภาพแวดล้อมของคุณเช่นคีย์ 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. ปรับใช้ 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
) . คุณควรเห็น webui ที่เปิดอยู่:
สำหรับท่อส่ง CI/CD อัตโนมัติใช้เจนกินส์และแอนซีได้ดังนี้:
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 และพอร์ตที่เปิดเผย 8081 และ 50000
ansible-playbook -i iac/ansible/inventory iac/ansible/deploy_jenkins/deploy_jenkins.yaml
2. เข้าถึงเจนกินส์:
ในการเข้าถึงเซิร์ฟเวอร์เจนกินส์ผ่าน SSH เราจำเป็นต้องสร้างคู่คีย์สาธารณะ/ส่วนตัว เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างคู่คีย์:
ssh-keygen
เปิด Metadata
และคัดลอกค่า ssh-keys
เราจำเป็นต้องค้นหารหัสผ่านเซิร์ฟเวอร์เจนกินส์เพื่อให้สามารถเข้าถึงเซิร์ฟเวอร์ได้ ก่อนอื่นให้เข้าถึงเซิร์ฟเวอร์ Jenkins:
ssh < USERNAME > : < EXTERNAL_IP >
จากนั้นเรียกใช้คำสั่งต่อไปนี้เพื่อรับรหัสผ่าน:
sudo docker exec -it jenkins-server bash
cat /var/jenkins_home/secrets/initialAdminPassword
เมื่อเจนกินส์ถูกปรับใช้ให้เข้าถึงผ่านเบราว์เซอร์ของคุณ:
http://:8081
3. ติดตั้งปลั๊กอินเจนกินส์:
ติดตั้งปลั๊กอินต่อไปนี้เพื่อรวมเจนกินส์เข้ากับ Docker, Kubernetes และ GKE:
หลังจากติดตั้งปลั๊กอินให้รีสตาร์ทเจนกินส์
sudo docker restart jenkins-server
4. กำหนดค่าเจนกินส์:
4.1. เพิ่ม webhooks ลงในที่เก็บ GitHub ของคุณเพื่อกระตุ้นให้เจนกินส์สร้าง
ไปที่ที่เก็บ GitHub และคลิกที่ Settings
คลิกที่ Webhooks
จากนั้นคลิกที่ Add Webhook
ป้อน URL ของเซิร์ฟเวอร์ Jenkins ของคุณ (เช่น http://
) จากนั้นคลิกที่ Let me select individual events
และเลือก Let me select individual events
เลือก Pull Request
Push
และดึงและคลิกที่ Add Webhook
4.2. เพิ่มพื้นที่เก็บข้อมูล GitHub เป็นที่เก็บซอร์สโค้ดเจนกินส์
ไปที่แดชบอร์ด 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
ก่อนอื่นให้สร้างบัญชี Docker Hub ไปที่เว็บไซต์ Docker Hub และคลิกที่ Sign Up
ป้อนชื่อผู้ใช้และรหัสผ่านของคุณ คลิกที่ Sign Up
คลิกที่ Create Repository
ป้อนชื่อสำหรับที่เก็บข้อมูลของคุณ (เช่น easy-llmops
) และคลิกที่ Create
จากแดชบอร์ดเจนกินส์ไป Manage Jenkins
Credentials
เจนกินส์> คลิกที่ Add Credentials
เลือก Username with password
และคลิกที่ Add
ป้อนชื่อผู้ใช้ Docker Hub, การเข้าถึงโทเค็นและตั้งค่า ID
เป็น dockerhub
4.4. การตั้งค่า Kubernetes รับรอง
ขั้นแรกให้สร้างบัญชีบริการสำหรับเซิร์ฟเวอร์เจนกินส์เพื่อเข้าถึงคลัสเตอร์ GKE ไปที่คอนโซล GCP และนำทางไปยัง IAM & Admin> บัญชีบริการ สร้างบัญชีบริการใหม่ด้วยบทบาท Kubernetes Engine Admin
ให้ชื่อและคำอธิบายบัญชีบริการ คลิกที่บัญชีบริการแล้วคลิกที่แท็บ Keys
คลิกที่ Add Key
และเลือก JSON
เป็นประเภทคีย์ คลิกที่ Create
และดาวน์โหลดไฟล์ JSON
จากนั้นจากแดชบอร์ดเจนกินส์ไป Manage Jenkins
> Cloud
คลิกที่ New cloud
เลือก Kubernetes
ป้อนชื่อคลัสเตอร์ของคุณ (เช่น gke-easy-llmops-cluster-1), enter the URL and Certificate from your GKE cluster. In the
เนมสเปซ Kubernetes , enter the namespace of your cluster (eg
การให้บริการแบบจำลอง ). In the
field, select
เพิ่ม and select
บัญชี Google Service จากส่วนตัว ' ป้อน Project-ID ของคุณและเส้นทางไปยังไฟล์ JSON
5. ทดสอบการตั้งค่า:
ผลักดันการกระทำใหม่ไปยังที่เก็บ GitHub ของคุณ คุณควรเห็นงานสร้างใหม่ในเจนกินส์
1. สร้าง discord webhook:
ก่อนอื่นให้สร้าง Webhook Discord ไปที่เว็บไซต์ Discord และคลิกที่ Server Settings
คลิกที่ Integrations
คลิกที่ Create Webhook
ป้อนชื่อสำหรับ webhook ของคุณ (เช่น easy-llmops-discord-webhook
) และคลิกที่ Create
คัดลอก URL WebHook
2. กำหนดค่าที่เก็บเฮล์ม
ก่อนอื่นเราต้องเพิ่มที่เก็บหางเสือที่จำเป็นสำหรับโพรและกราฟานา:
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
คำสั่งเหล่านี้เพิ่มที่เก็บ Helm Prometheus และ Grafana อย่างเป็นทางการและอัปเดตข้อมูลแผนภูมิ Helm ในพื้นที่ของคุณ
3. ติดตั้งการพึ่งพา
Prometheus ต้องการการพึ่งพาบางอย่างที่สามารถจัดการได้ด้วยหางเสือ นำทางไปยังไดเรกทอรีการตรวจสอบและสร้างการอ้างอิงเหล่านี้:
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
สำหรับ Grafana:
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 ของคุณ ด้วยการรวบรวมโปรโมเชียสและ Grafana ที่แสดงภาพพวกเขาคุณสามารถติดตามประสิทธิภาพได้อย่างมีประสิทธิภาพตั้งค่าการแจ้งเตือนสำหรับปัญหาที่อาจเกิดขึ้นและได้รับข้อมูลเชิงลึกที่มีคุณค่าในโครงสร้างพื้นฐานและแอปพลิเคชันของคุณ
การบันทึกส่วนกลางเป็นสิ่งจำเป็นสำหรับการตรวจสอบและแก้ไขปัญหาแอปพลิเคชันที่ปรับใช้กับ Kubernetes ส่วนนี้จะแนะนำคุณผ่านการตั้งค่า Elk Stack (Elasticsearch, Logstash, Kibana) ด้วย fileBeat สำหรับการบันทึกคลัสเตอร์ GKE ของคุณ
0. วิ่งด่วน
คุณสามารถใช้สคริปต์ Helmfile เดี่ยวนี้เพื่อเริ่มต้น Elk Stack:
cd deployments/ELK
helmfile sync
1. ติดตั้ง Elk Stack พร้อมหางเสือ
เราจะใช้หางเสือเพื่อปรับใช้ส่วนประกอบสแต็ก 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 )
ติดตั้ง Kibana:
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:
เปิดเผย 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 Pods ของคุณใน Kibana คุณสามารถสร้างแดชบอร์ดและการสร้างภาพเพื่อวิเคราะห์บันทึกของคุณและรับข้อมูลเชิงลึกเกี่ยวกับพฤติกรรมของแอปพลิเคชันของคุณ
โปรดไปที่ Cast AI เพื่อลงทะเบียนบัญชีฟรีและรับโทเค็น
จากนั้นเรียกใช้บรรทัดนี้เพื่อเชื่อมต่อกับ GKE:
curl -H " Authorization: Token " " https://api.cast.ai/v1/agent.yaml?provider=gke " | kubectl apply -f -
Hit 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
อีกครั้งและ Waite เพื่อให้การติดตั้งเสร็จสมบูรณ์
จากนั้นคุณสามารถเห็นแดชบอร์ดของคุณบน UI ของ Cast AI:
ถึงเวลาที่จะเพิ่มประสิทธิภาพคลัสเตอร์ของคุณด้วย Cast AI! ไปทางทะเลออม Available savings
และคลิกปุ่ม Rebalance
โปรดไปที่ Langfuse และ Supabase เพื่อลงทะเบียนสำหรับบัญชีฟรีและรับปุ่ม API จากนั้นแทนที่ placehoders ในไฟล์. env.example ด้วยปุ่ม API ของคุณ
เรายินดีต้อนรับการมีส่วนร่วมของ EasyllMops! โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเริ่มต้น
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 ของเราหรือติดต่อผู้ดูแลโดยตรง