EasyLLMOps:輕鬆實現強大語言模型的 MLOps。
EasyLLMOps 是一個使用 Open WebUI 建置的項目,可以部署在 Google Kubernetes Engine (GKE) 上,用於管理和擴展語言模型。它提供 Terraform 和手動部署方法,並結合了強大的 MLOps 實踐。這包括使用 Jenkins 和 Ansible 實現自動化的 CI/CD 管道、使用 Prometheus 和 Grafana 進行監控以獲取效能洞察,以及使用 ELK 堆疊進行集中日誌記錄以進行故障排除和分析。開發人員可以在專案網站上找到詳細的文件和說明。
開發人員建置和部署 LLM 支援的應用程式。與法學碩士一起工作的資料科學家和機器學習工程師。 DevOps 團隊負責管理 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入口控制器:
Nginx Ingress Controller 管理對 Kubernetes 叢集中服務的外部存取。建立命名空間並使用 Helm 安裝 Ingress Controller:
kubectl create ns nginx-system
kubens nginx-system
helm upgrade --install nginx-ingress ./deployments/nginx-ingress
請描述 Nginx Ingress Controller 的 IP 位址,稍後您將需要它。
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:
接下來,將 Web UI 部署到您的 GKE 叢集:
cd open-webui
kubectl apply -f ./kubernetes/manifest/base -n model-serving
7. 試用該應用程式:
開啟瀏覽器並導覽至 GKE 叢集的 URL(例如步驟 1 中的http://172.0.0.0
)並將.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 映像並建立可存取 Docker 套接字和公開連接埠 8081 和 50000 的特權容器,在伺服器上部署 Jenkins。
ansible-playbook -i iac/ansible/inventory iac/ansible/deploy_jenkins/deploy_jenkins.yaml
2. 訪問Jenkins:
要透過 SSH 存取 Jenkins 伺服器,我們需要建立公鑰/私鑰對。執行以下命令建立密鑰對:
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://<EXTERNAL_IP>:8081
3.安裝Jenkins插件:
安裝以下插件以將 Jenkins 與 Docker、Kubernetes 和 GKE 整合:
安裝插件後,重新啟動 Jenkins。
sudo docker restart jenkins-server
4.配置詹金斯:
4.1.將 webhook 新增至 GitHub 儲存庫以觸發 Jenkins 建置。
前往 GitHub 儲存庫並點擊Settings
。按一下Webhooks
,然後按Add Webhook
。輸入 Jenkins 伺服器的 URL(例如http://<EXTERNAL_IP>:8081/github-webhook/
)。然後點擊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
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
。按一下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
, enter the namespace of your cluster (eg
model-serving ). In the
「憑證」 field, select
and select
「私人的 Google 服務帳戶」。輸入您的專案 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.配置Helm存儲庫
首先,我們需要為 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.安裝依賴項
Prometheus 需要某些可以使用 Helm 管理的依賴項。導航到監視目錄並建置這些依賴項:
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
:這是 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
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 上部署的應用程式並對其進行故障排除至關重要。本部分將引導您使用 Filebeat 設定 ELK 堆疊(Elasticsearch、Logstash、Kibana)來記錄 GKE 叢集。
0.快速奔跑
您可以使用這個 helmfile 腳本來啟動 ELK 堆疊:
cd deployments/ELK
helmfile sync
1. 使用 Helm 安裝 ELK Stack
我們將使用 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. 訪問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. 驗證日誌收集
現在您應該能夠在 Kibana 中查看來自 Kubernetes Pod 的日誌。您可以建立儀表板和視覺化來分析日誌並深入了解應用程式的行為。
請前往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
,然後複製配置程式碼並將其貼上到終端機中:
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 金鑰,然後將 .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 儲存庫上提出問題或直接聯絡維護人員。