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存储库上打开一个问题,或直接与维护人员联系。