EasyLLMOps: простые MLOps для мощных языковых моделей.
EasyLLMOps — это проект, созданный с использованием Open WebUI, который можно развернуть в Google Kubernetes Engine (GKE) для управления и масштабирования языковых моделей. Он предлагает как методы Terraform, так и методы ручного развертывания, а также включает в себя надежные методы MLOps. Сюда входят конвейеры CI/CD с Jenkins и Ansible для автоматизации, мониторинг с помощью Prometheus и Grafana для анализа производительности, а также централизованное ведение журналов с помощью стека ELK для устранения неполадок и анализа. Подробную документацию и инструкции разработчики могут найти на сайте проекта.
Разработчики создают и развертывают приложения на базе LLM. Специалисты по данным и инженеры по машинному обучению, работающие с LLM. Команды DevOps, отвечающие за управление инфраструктурой LLM. Организации, желающие интегрировать LLM в свою деятельность.
Если вы не хотите тратить много времени, запустите этот скрипт и наслаждайтесь кофе:
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:
Контроллер Nginx Ingress управляет внешним доступом к сервисам в вашем кластере Kubernetes. Создайте пространство имен и установите Ingress Controller с помощью Helm:
kubectl create ns nginx-system
kubens nginx-system
helm upgrade --install nginx-ingress ./deployments/nginx-ingress
Пожалуйста, укажите IP-адрес входного контроллера Nginx, так как он понадобится вам позже.
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. Разверните открытый веб-интерфейс:
Затем разверните веб-интерфейс в кластере 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
). . Вы должны увидеть открытый веб-интерфейс:
Для автоматизированных конвейеров CI/CD используйте Jenkins и Ansible следующим образом:
1. Настройте сервер Jenkins:
Сначала создайте учетную запись службы и назначьте ей роль Compute Admin
. Затем создайте файл ключей Json для учетной записи службы и сохраните его в каталоге iac/ansible/secrets
.
Затем создайте экземпляр Google Compute Engine с именем «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://<EXTERNAL_IP>:8081
3. Установите плагины Jenkins:
Установите следующие плагины для интеграции Jenkins с Docker, Kubernetes и GKE:
После установки плагинов перезапустите Jenkins.
sudo docker restart jenkins-server
4. Настройте Дженкинса:
4.1. Добавьте веб-перехватчики в свой репозиторий GitHub, чтобы запускать сборки Jenkins.
Перейдите в репозиторий GitHub и нажмите Settings
. Нажмите Webhooks
, а затем нажмите Add Webhook
. Введите URL-адрес вашего сервера Jenkins (например, http://<EXTERNAL_IP>:8081/github-webhook/
). Затем нажмите Let me select individual events
и выберите « Let me select individual events
. Выберите Push
and Pull Request
и нажмите 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
. Нажмите Add Credentials
. Выберите Username with password
и нажмите Add
. Введите имя пользователя Docker Hub, токен доступа и установите ID
dockerhub
.
4.4. Настройте учетные данные Kubernetes.
Сначала создайте учетную запись службы для сервера Jenkins для доступа к кластеру GKE. Перейдите в консоль GCP и выберите IAM & Admin > Service Accounts. Создайте новую учетную запись службы с ролью 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 Namespace , enter the namespace of your cluster (eg
model-serving ). In the
field, select
«Добавить» and select
«Личный аккаунт службы Google». Введите идентификатор проекта и путь к файлу JSON.
5. Проверьте настройку:
Отправьте новый коммит в свой репозиторий GitHub. Вы должны увидеть новую сборку в Дженкинсе.
1. Создайте вебхук Discord:
Сначала создайте вебхук Discord. Перейдите на сайт Discord и нажмите Server Settings
. Нажмите Integrations
. Нажмите Create Webhook
. Введите имя для вашего веб-перехватчика (например, easy-llmops-discord-webhook
) и нажмите Create
. Скопируйте URL-адрес веб-перехватчика.
2. Настройте репозитории Helm
Для начала нам нужно добавить необходимые репозитории Helm для Prometheus и Grafana:
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. Развертывание Прометея
Теперь мы развернем 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
Затем войдите в Прометей по адресу 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. В этом разделе вы узнаете, как настроить стек ELK (Elasticsearch, Logstash, Kibana) с помощью Filebeat для регистрации вашего кластера GKE.
0. Быстрый бег
Вы можете использовать этот единственный скрипт helmfile, чтобы запустить стек ELK:
cd deployments/ELK
helmfile sync
1. Установите стек ELK с помощью Helm
Мы будем использовать 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 )
Установите Кибану:
helm install elk-kibana elastic/kibana -f deployments/ELK/kibana.expanded.yaml
Установите Логсташ:
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 с помощью службы и получите к ней доступ через браузер:
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 в Kibana. Вы можете создавать информационные панели и визуализации для анализа журналов и получения информации о поведении вашего приложения.
Пожалуйста, перейдите на сайт Cast AI, чтобы зарегистрировать бесплатную учетную запись и получить ТОКЕН.
Затем запустите эту строку для подключения к GKE:
curl -H " Authorization: Token <TOKEN> " " https://api.cast.ai/v1/agent.yaml?provider=gke " | kubectl apply -f -
Нажмите « I ran this script
в пользовательском интерфейсе Cast 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
еще раз» и дождусь завершения установки.
Затем вы сможете увидеть свои информационные панели в пользовательском интерфейсе Cast AI:
Пришло время оптимизировать ваш кластер с помощью 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 или свяжитесь напрямую с сопровождающими.