EasyLlmops:強大語言模型的輕鬆MLOP。
Easyllmops是一個由開放式webui構建的項目,可以在Google Kubernetes Engine(GKE)上部署,用於管理和擴展語言模型。它提供Terraform和手動部署方法,並結合了強大的MLOP實踐。這包括帶有Jenkins的CI/CD管道以及可自動化的Ansible,與Prometheus和Grafana一起監視性能洞察力,以及與ELK堆棧進行集中登錄以進行故障排除和分析。開發人員可以在項目網站上找到詳細的文檔和說明。
開發人員構建和部署LLM驅動的應用程序。數據科學家和機器學習工程師與LLMS合作。 DevOps團隊負責管理LLM基礎架構。希望將LLM集成到其運營中的組織。
如果您不想花很多時間,請運行此腳本並享用咖啡:
chmod +x ./cluster.sh
./cluster.sh
請記住在使用Terraform之前使用GCP進行身份驗證:
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群集中對服務的外部訪問。創建一個名稱空間,然後使用Helm安裝入口控制器:
kubectl create ns nginx-system
kubens nginx-system
helm upgrade --install nginx-ingress ./deployments/nginx-ingress
請介紹Nginx Ingress Controller的IP地址,因為稍後您需要。
2。配置API密鑰秘密:
將環境變量(例如API鍵)存儲在Kubernetes Secrets中。為模型服務創建一個名稱空間,並從您的.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:
接下來,將Web UI部署到您的GKE群集:
cd open-webui
kubectl apply -f ./kubernetes/manifest/base -n model-serving
7.玩應用程序:
打開瀏覽器並導航到GKE群集的URL(例如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
目錄中。
接下來,創建一個名為“ jenkins-server”的Google Compute Engine實例,該實例運行Ubuntu 22.04具有防火牆規則,允許端口8081和50000上的流量。
ansible-playbook iac/ansible/deploy_jenkins/create_compute_instance.yaml
通過安裝先決條件,拉碼頭映像並創建一個具有訪問Docker套接字的特權容器並曝光端口8081和50000來部署服務器上的Jenkins。
ansible-playbook -i iac/ansible/inventory iac/ansible/deploy_jenkins/deploy_jenkins.yaml
2。訪問詹金斯:
要通過SSH訪問Jenkins Server,我們需要創建一個公共/私鑰對。運行以下命令創建一個密鑰對:
ssh-keygen
打開Metadata
並複制ssh-keys
值。
我們需要找到Jenkins服務器密碼以訪問服務器。首先,訪問Jenkins服務器:
ssh < USERNAME > : < EXTERNAL_IP >
然後運行以下命令以獲取密碼:
sudo docker exec -it jenkins-server bash
cat /var/jenkins_home/secrets/initialAdminPassword
部署詹金斯後,通過瀏覽器訪問它:
http://:8081
3。安裝Jenkins插件:
安裝以下插件將Jenkins與Docker,Kubernetes和GKE集成:
安裝插件後,重新啟動Jenkins。
sudo docker restart jenkins-server
4。配置Jenkins:
4.1。將Webhooks添加到您的GitHub存儲庫中,以觸發Jenkins的構建。
轉到GitHub存儲庫,然後單擊Settings
。單擊Webhooks
,然後單擊Add Webhook
。輸入Jenkins Server的URL(例如http://
)。然後單擊Let me select individual events
,然後選擇Let me select individual events
。選擇Push
Pull Request
,然後單擊Add Webhook
。
4.2。將GitHub存儲庫添加為Jenkins源代碼存儲庫。
轉到Jenkins儀表板,然後單擊New Item
。輸入您的項目名稱(例如easy-llmops
),然後選擇Multibranch Pipeline
。單擊OK
。單擊Configure
,然後單擊Add Source
。選擇GitHub
,然後單擊Add
。輸入您的GitHub存儲庫的URL(例如https://github.com/bmd1905/EasyLLMOps
)。在Credentials
字段中,選擇Username with password
Add
並選擇用戶名。輸入您的github用戶名和密碼(或使用個人訪問令牌)。單擊Test Connection
,然後單擊Save
。
4.3。設置Docker Hub憑據。
首先,創建一個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憑據。
首先,為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
, enter the namespace of your cluster (eg
模型服務). In the
“憑據” field, select
添加and select
Google Service帳戶。輸入您的項目ID和JSON文件的路徑。
5。測試設置:
將新的提交推向您的GitHub存儲庫。您應該在詹金斯(Jenkins)看到新的版本。
1。創建Discord Webhook:
首先,創建一個Discord Webhook。轉到Discord網站,然後單擊Server Settings
。單擊Integrations
。單擊Create Webhook
。輸入您的Webhook(例如easy-llmops-discord-webhook
)的名稱,然後單擊Create
。複製Webhook URL。
2。配置頭盔存儲庫
首先,我們需要為Prometheus和Grafana添加必要的Helm存儲庫:
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。安裝依賴項
普羅米修斯需要某些依賴性,可以用掌舵來管理。導航到監視目錄並構建這些依賴性:
helm dependency build ./deployments/monitoring/kube-prometheus-stack
4。部署普羅米修斯
現在,我們將使用Helm部署Prometheus及其相關服務:
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
:這是掌舵安裝的發行名稱。deployments/monitoring/kube-prometheus-stack
:這是用於安裝的圖表。-n monitoring
:這指定要安裝的命名空間。默認情況下,服務不會外部暴露。要訪問它們,您可以使用端口 - 轉向:
對於普羅米修斯:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090
然後在http://localhost:9090
訪問Prometheus
對於Grafana:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80
然後在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收集指標並將其可視化,您可以有效地跟踪性能,為潛在問題設置警報,並獲得對基礎架構和應用程序的寶貴見解。
集中記錄對於監視和故障排除在Kubernetes上部署的應用程序至關重要。本節指導您使用FileBeat設置麋鹿堆棧(Elasticsearch,Logstash,Kibana),用於記錄您的GKE群集。
0。快速運行
您可以使用此單個Helmfile腳本來啟動麋鹿堆棧:
cd deployments/ELK
helmfile sync
1。安裝麋鹿堆棧
我們將使用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 )
安裝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。訪問基巴納:
使用服務揭露基巴納並通過瀏覽器訪問它:
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。驗證日誌集合
現在,您應該能夠從Kibana的Kubernetes Pods看到日誌。您可以創建儀表板和可視化,以分析日誌並獲得對應用程序行為的見解。
請去Cast AI註冊免費帳戶並獲取令牌。
然後運行此行以連接到GKE:
curl -H " Authorization: Token " " https://api.cast.ai/v1/agent.yaml?provider=gke " | kubectl apply -f -
點擊I ran this script
,然後復製配置代碼並將其粘貼到終端:
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
,然後將安裝完成。
然後,您可以在Cast AI的UI上看到儀表板:
是時候用Cast AI優化群集了!前往Available savings
範圍,然後單擊Rebalance
按鈕。
請訪問langfuse和supabase以註冊一個免費帳戶並獲取API鍵,然後用您的API鍵在.env.example文件中替換Apthoders。
我們歡迎對Easyllmops的貢獻!請參閱我們的貢獻。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存儲庫上打開一個問題,或直接與維護人員聯繫。