Easyllmops: легкие Mlops для мощных языковых моделей.
EasyllMops - это проект, созданный с открытым веб -сайтом, который можно развернуть в Google Kubernetes Engine (GKE) для управления и масштабирования языковых моделей. Он предлагает как терраформ, так и методы развертывания ручного развертывания, и включает в себя надежные практики MLOPS. Это включает в себя трубопроводы CI/CD с Jenkins и Ansible для автоматизации, мониторинг с Prometheus и Grafana для представления о производительности, а также централизованный журнал со стеком ELK для устранения неполадок и анализа. Разработчики могут найти подробную документацию и инструкции на веб -сайте проекта.
Разработчики, создающие и развертывая приложения LLM. Ученые по данным и инженеры машинного обучения, работающие с LLMS. Команды 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 plan
terraform apply
2. Получить информацию о кластере:
Чтобы взаимодействовать с вашим кластером GKE, вам нужно получить его конфигурацию. Вы можете просмотреть текущую конфигурацию кластера со следующей командой:
cat ~ /.kube/config
Убедитесь, что ваш контекст kubectl
правильно установлен для управления кластером.
Для более практического процесса развертывания выполните эти шаги:
1. Развернуть контроллер Nginx Ingress:
Контроллер Inginx Ingress управляет внешним доступом к службам в вашем кластере Kubernetes. Создайте пространство имен и установите контроллер Ingress, используя Helm:
kubectl create ns nginx-system
kubens nginx-system
helm upgrade --install nginx-ingress ./deployments/nginx-ingress
Пожалуйста, расскажите IP -адрес контроллера Nginx Ingress, так как он вам понадобится позже.
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. развернуть Open Webui:
Затем разверните веб -интерфейс в свой кластер 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
) Полем Вы должны увидеть Open Webui:
Для автоматических трубопроводов 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
После того, как Дженкинс будет развернут, доступ к нему через свой браузер:
http://:8081
3. Установите плагины Jenkins:
Установите следующие плагины для интеграции Jenkins с Docker, Kubernetes и GKE:
После установки плагинов перезапустите Дженкинс.
sudo docker restart jenkins-server
4. Настройте Jenkins:
4.1. Добавьте WebHooks в ваш репозиторий GitHub, чтобы запустить сборки Jenkins.
Перейдите в репозиторий GitHub и нажмите на Settings
. Нажмите на Webhooks
, а затем нажмите Add Webhook
. Введите URL-адрес вашего сервера Jenkins (например, http://
). Затем нажмите Let me select individual events
и выберите, Let me select individual events
. Выберите Pull Request
Push
and PULL и нажмите Add Webhook
.
4.2. Добавить репозиторий GitHub в качестве хранилища исходного кода Дженкинса.
Перейдите на приборную панель 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
.
От DENKINS DASHBOARD, перейдите к 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
. Дайте учетной записи службы имя и описание. Нажмите на учетную запись Service, а затем нажмите на вкладку Keys
. Нажмите Add Key
и выберите JSON
в качестве типа клавиши. Нажмите Create
и скачать файл json».
Затем, от Denkins Dashboard, перейдите к Manage Jenkins
> Cloud
. Нажмите на New cloud
. Выберите Kubernetes
. Введите имя своего кластера (например, gke-easy-llmops-cluster-1), enter the URL and Certificate from your GKE cluster. In the
пространстве имен Kubernetes , enter the namespace of your cluster (eg
, модель ). In the
field, select
«Добавить» and select
учетную запись Google Service из Private`. Введите свой идентификатор проекта и путь к файлу JSON.
5. Проверьте настройку:
Подтолкните новый коммит в ваш репозиторий GitHub. Вы должны увидеть новую сборку в Дженкинсе.
1. Создать Discord Webhook:
Во -первых, создайте Discord Webhook. Перейдите на веб -сайт Discord и нажмите на Server Settings
. Нажмите на Integrations
. Нажмите Create Webhook
. Введите имя для вашего WebHook (например, easy-llmops-discord-webhook
) и нажмите Create
. Скопируйте URL Webhook.
2. Настройка репозитории руля
Во -первых, нам нужно добавить необходимые репозитории для 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. Установите зависимости
Прометей требует определенных зависимостей, которыми можно управлять с рулем. Перейдите в каталог мониторинга и создайте эти зависимости:
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
Учетные данные по умолчанию для Графаны обычно:
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. Этот раздел направляет вас через настройку стека Elk (Elasticsearch, Logstash, Kibana) с FileBeat для регистрации вашего кластера GKE.
0. Quick Run
Вы можете использовать этот сценарий 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. Проверьте коллекцию журналов
Теперь вы должны увидеть журналы из ваших капсул Kubernetes в Кибане. Вы можете создавать панели мониторинга и визуализации для анализа ваших журналов и получить представление о поведении вашего приложения.
Пожалуйста, зайдите в Cast AI, чтобы подписаться на бесплатную учетную запись и получить токен.
Затем запустите эту линию, чтобы подключиться к GKE:
curl -H " Authorization: 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
и Waite для завершения установки.
Тогда вы можете увидеть свои панель на пользовательском интерфейсе актеров:
Пришло время оптимизировать свой кластер с помощью Cast AI! Перейдите к Available savings
ситю и нажмите кнопку Rebalance
.
Пожалуйста, перейдите в Langfuse и Supabase, чтобы подписаться на бесплатную учетную запись и получить клавиши API, а затем замените плацетели в файле .env.example на ключи API.
Мы приветствуем вклад в easyllmops! Пожалуйста, смотрите наш Appling.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 или напрямую свяжитесь с сопровождающими.