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 存储库上提出问题或直接联系维护人员。