EasyLlmops: MLOPs بدون جهد لنماذج اللغة القوية.
EasyLlmops هو مشروع تم تصميمه باستخدام WebUi المفتوح يمكن نشره على محرك Google Kubernetes (GKE) لإدارة نماذج اللغة وتوسيع نطاقها. إنه يوفر كل من أساليب النشر اليدوي واليدوي ، ويتضمن ممارسات MLOPs قوية. ويشمل ذلك خطوط أنابيب CI/CD مع Jenkins و Ansible من أجل الأتمتة ، والمراقبة مع Prometheus و Grafana لرؤى الأداء ، وتسجيل مركزي مع مكدس الأيائل لاستكشاف الأخطاء وإصلاحها. يمكن للمطورين العثور على وثائق مفصلة وإرشادات على موقع المشروع.
المطورين بناء ونشر التطبيقات التي تعمل بالطاقة. علماء البيانات ومهندسي التعلم الآلي الذين يعملون مع LLMS. فرق DevOps المسؤولة عن إدارة البنية التحتية LLM. المنظمات التي تتطلع إلى دمج LLMs في عملياتها.
في حال كنت لا ترغب في قضاء الكثير من الوقت ، يرجى تشغيل هذا البرنامج النصي والاستمتاع بقهوتك:
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 الوصول الخارجي إلى الخدمات في مجموعة 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:
قم بتخزين متغيرات البيئة الخاصة بك ، مثل مفاتيح 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 المفتوح:
بعد ذلك ، نشر واجهة المستخدم على مجموعة 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 الآلية ، استخدم Jenkins و Ansible على النحو التالي:
1. إعداد خادم Jenkins:
أولاً ، قم بإنشاء حساب خدمة وقم بتعيين دور Compute Admin
. ثم قم بإنشاء ملف مفتاح JSON لحساب الخدمة وقم بتخزينه في دليل iac/ansible/secrets
.
بعد ذلك ، قم بإنشاء مثيل محرك Google Compute الذي يسمى "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 لتتمكن من الوصول إلى الخادم. أولاً ، الوصول إلى خادم Jenkins:
ssh < USERNAME > : < EXTERNAL_IP >
ثم قم بتشغيل الأمر التالي للحصول على كلمة المرور:
sudo docker exec -it jenkins-server bash
cat /var/jenkins_home/secrets/initialAdminPassword
بمجرد نشر Jenkins ، يمكنك الوصول إليه عبر متصفحك:
http://:8081
3. قم بتثبيت الإضافات Jenkins:
قم بتثبيت المكونات الإضافية التالية لدمج Jenkins مع Docker و Kubernetes و GKE:
بعد تثبيت الإضافات ، أعد تشغيل Jenkins.
sudo docker restart jenkins-server
4. تكوين جنكينز:
4.1. أضف Webhooks إلى مستودع GitHub الخاص بك إلى تشغيل Builds Jenkins.
انتقل إلى مستودع 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.
انتقل إلى لوحة معلومات 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. انتقل إلى موقع Docker Hub وانقر فوق Sign Up
. أدخل اسم المستخدم وكلمة المرور. انقر فوق Sign Up
. انقر فوق Create Repository
. أدخل اسمًا لمستودعك (مثل easy-llmops
) وانقر فوق Create
.
من لوحة معلومات Jenkins ، انتقل إلى Manage Jenkins
Credentials
Jenkins. انقر فوق Add Credentials
. حدد Username with password
وانقر فوق Add
. أدخل اسم مستخدم Docker Hub الخاص بك ، و Access Token ، وقم بتعيين ID
إلى dockerhub
.
4.4. الإعداد Kubernetes بيانات الاعتماد.
أولاً ، قم بإنشاء حساب خدمة لخادم Jenkins للوصول إلى مجموعة GKE. انتقل إلى وحدة التحكم في GCP وانتقل إلى حسابات الخدمة IAM & ADMIN. قم بإنشاء حساب خدمة جديد مع دور 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 , enter the namespace of your cluster (eg
خدمة الطراز ). In the
field, select
إضافة and select
حساب خدمة Google من Private`. أدخل معرف المشروع والمسار إلى ملف JSON.
5. اختبار الإعداد:
ادفع التزام جديد بمستودع GitHub الخاص بك. يجب أن ترى بناء جديد في جنكينز.
1. إنشاء Discord Webhook:
أولاً ، إنشاء Discord Webhook. انتقل إلى موقع 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
تضيف هذه الأوامر مستودعات Prometheus و Grafana 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
: هذا هو اسم الإصدار لتثبيت Helm.deployments/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
عادة ما تكون بيانات الاعتماد الافتراضية لغرافانا:
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. يوجهك هذا القسم من خلال إعداد مكدس الأيائل (Elasticsearch ، Logstash ، Kibana) مع FileBeat لتسجيل مجموعة GKE.
0. تشغيل سريع
يمكنك استخدام هذا البرنامج النصي المفرد لبدء مكدس الأيائل:
cd deployments/ELK
helmfile sync
1. قم بتثبيت مكدس الأيائل مع Helm
سوف نستخدم Helm لنشر مكونات مكدس الأيائل:
أولاً ، قم بإنشاء مساحة اسم لمكونات التسجيل:
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. الوصول إلى كيبانا:
فضح الكيبانا باستخدام خدمة والوصول إليها من خلال متصفحك:
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 في كيبانا. يمكنك إنشاء لوحات معلومات وتصورات لتحليل سجلاتك واكتساب رؤى حول سلوك التطبيق الخاص بك.
يرجى الذهاب إلى Cast AI للتسجيل للحصول على حساب مجاني والحصول على الرمز المميز.
ثم قم بتشغيل هذا الخط للاتصال بـ GKE:
curl -H " Authorization: Token " " https://api.cast.ai/v1/agent.yaml?provider=gke " | kubectl apply -f -
اضغط على I ran this script
على واجهة المستخدم الخاصة بـ 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 لإكمال التثبيت.
ثم يمكنك رؤية لوحات المعلومات الخاصة بك على واجهة المستخدم الخاصة بـ AI:
حان الوقت لتحسين مجموعةك مع AI Cast! اذهب إلى Available savings
Seaction وانقر فوق زر Rebalance
.
يرجى الانتقال إلى Langfuse و Supabase للتسجيل للحصول على حساب مجاني والحصول على مفاتيح API ، ثم استبدل العوامل الوطنية في ملف .env.example مع مفاتيح API الخاصة بك.
نرحب بالمساهمات في EasyLlmops! يرجى الاطلاع على المساهمة. md لمزيد من المعلومات حول كيفية البدء.
يتم إصدار EasyllMops تحت رخصة معهد ماساتشوستس للتكنولوجيا. انظر ملف الترخيص لمزيد من التفاصيل.
إذا كنت تستخدم EasyLlmops في بحثك ، فيرجى الاستشهاد به على النحو التالي:
@software{EasyLLMOps2024,
author = {Minh-Duc Bui},
title = {EasyLLMOps: Effortless MLOps for Powerful Language Models.},
year = {2024},
url = {https://github.com/bmd1905/EasyLLMOps}
}
للأسئلة أو القضايا أو التعاون ، يرجى فتح مشكلة على مستودع GitHub أو الاتصال بالمحافظة مباشرة.