Содержание Show
В современном мире машинного обучения и искусственного интеллекта, где данные являются ключом к инновациям и конкурентоспособности, эффективное управление моделями становится все более критичным. MLflow — это инструмент, который облегчает процесс разработки, обучения, отслеживания и развертывания моделей машинного обучения.
В данной статье мы покажем, как развернуть MLflow с помощью Docker, создав контейнерную среду для управления проектами машинного обучения. В процессе мы также установим MinIO для хранения артефактов, что обеспечит удобное и безопасное хранение данных и моделей, поддерживая гибкость и масштабирование ваших экспериментов.
Шаг 1. Аренда облачного сервера
Первым шагом в развертывании MLflow с использованием Docker является получение облачного сервера. Облачные провайдеры, такие как, Yandex Cloud , VK Cloud, или Timeweb Cloud, предоставляют возможность арендовать виртуальные серверы в облаке.
Выберите облачного провайдера, который наиболее соответствует вашим требованиям, и следуйте их инструкциям для создания и настройки виртуального сервера. Обычно вам будет предложено выбрать операционную систему и фигурацию сервера в соответствии с вашими потребностями, такими как количество ядер процессора, объем оперативной памяти и размер хранилища.
После создания сервера в облаке, получите доступ к нему посредством SSH или других предоставленных средств удаленного доступа.
Я собираюсь установить MLflow на сервере, предоставляемом провайдером Timeweb Cloud, который является самым бюджетным вариантом. Также при выборе сервера необходимо предустоновить Docker выбрав последний версию Ubuntu.
Далее подключаемся к серверу через командную строку для удобства дальнейшей работы. На macOS это выглядит следующим образом: заходим в терминал и прописываем учетные данные для доступа к серверу.
zurab@MacBook-Air ~ % ssh root@90.156.226.254
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
root@147.45.106.59's password:
# далее вводим пароль
Далее, необходимо склонировать репозиторий.
git clone https://github.com/Toumash/mlflow-docker.git
Не забудьте установить A-запись вашего домена, указывающую на IP-адрес вашего сервера. Это позволит вашему доменному имени разрешаться в соответствующий IP-адрес, обеспечивая корректную работу вашего контейнера Docker и связанных с ним сервисов.
Шаг 2. Настройка файла .env и запуск контейнера
Далее, войдем в папку и настроим файл .env
cd mlflow-docker
nano .env
Для доступа к MinIO обновите переменные среды AWS_ACCESS_KEY_ID
и AWS_SECRET_ACCESS_KEY
, которые служат в качестве учетных данных, аналогично логину и паролю. Cохраните эти данные, так как они необходимы для аутентификации. Также, если какой-либо из указанных ниже портов занят, вы можете выбрать любой другой свободный порт.
AWS_ACCESS_KEY_ID=admin
AWS_SECRET_ACCESS_KEY=sample_key
AWS_REGION=us-east-1
AWS_BUCKET_NAME=mlflow
MYSQL_DATABASE=mlflow
MYSQL_USER=mlflow_user
MYSQL_PASSWORD=mlflow_password
MYSQL_ROOT_PASSWORD=toor
MLFLOW_S3_ENDPOINT_URL=http://localhost:9000
MLFLOW_TRACKING_URI=http://localhost:5000
После сохранения изменений наступает момент дебюта наших контейнеров — время оживить их запуском.
docker-compose up -d
Ожидаем запуск всех контейнеров и убеждаемся, что у нас все ок!
docker ps
Переходим на IP-адрес сервера с портами 5000 и 9000
http://<your_ip_address>:5000
http://<your_ip_address>:9000
Шаг 3. Установка NGINX и создание конфигурационного файла для веб-приложения
Если NGINX еще не установлен на вашем сервере, выполните следующие команды:
sudo apt update
sudo apt install nginx
Далее мы создаем конфигурационный файл NGINX для веб-приложения. Обычно файлы конфигурации хранятся в /etc/nginx/sites-available/
. Создайте новый файл, например, mlflow, с помощью текстового редактора:
sudo nano /etc/nginx/sites-available/mlflow
Пример базовой конфигурации:
server {
listen 80;
server_name mlflow.domain.com www.mlflow.domain.com;
location / {
proxy_pass http://localhost:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Шаг 4. Создание символической ссылки и проверка конфигурации и перезапуск NGINX
Создайте символическую ссылку на ваш конфигурационный файл в папке sites-enabled
, чтобы активировать его:
sudo ln -s /etc/nginx/sites-available/mlflow /etc/nginx/sites-enabled/
Проверьте конфигурацию на наличие ошибок:
sudo nginx -t
Если конфигурация корректна, перезапустите NGINX:
sudo systemctl restart nginx
Шаг 5. Установка SSL-сертификата
Для установки SSL-сертификата вы можете воспользоваться Let’s Encrypt. Установите Certbot:
sudo apt install certbot python3-certbot-nginx
Затем выпустите SSL-сертификат для вашего домена (замените domain.com):
sudo certbot --nginx -d mlflow.domain.com -d www.mlflow.domain.com
Следуйте инструкциям Certbot для завершения установки. Certbot автоматически обновит конфигурацию NGINX, добавив SSL-сертификаты. После завершения, ваши запросы будут обслуживаться через HTTPS.
Перезапустите NGINX, чтобы применить изменения в конфигурации:
sudo systemctl restart nginx
Теперь веб-приложение MLflow будет доступно через HTTPS с помощью NGINX, который также выполняет проксирование запросов к вашему приложению.
После успешной установки SSL-сертификата рекомендуется оставить конфигурационный файл NGINX без изменений, за исключением ситуаций, когда требуется ручное внесение данных о SSL-сертификате.
Снова переходим к конфигурационному файлу
sudo nano /etc/nginx/sites-available/mlflow
и меняем содержимое на
server {
listen 80;
server_name mlflow.domain.com www.mlflow.domain.com;
# Redirecting to HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name mlflow.domain.com www.mlflow.domain.com;
ssl_certificate /etc/letsencrypt/live/mlflow.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mlflow.domain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://localhost:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Пожалуйста, обратите внимание и замените все упоминания «domain.com» на свой домен в каждом случае. После сохранения проверяем конфигурацию на наличие ошибок:
sudo nginx -t
Если конфигурация корректна, перезапустите NGINX:
sudo systemctl restart nginx
Шаг 6. Автообновление SSL-сертификата с помощью Certbot.
Для автоматического обновления SSL-сертификатов с помощью Certbot, необходимо настроить задачу cron (планировщик задач) для периодической проверки и обновления сертификатов. Сделать это можно следующим образом:
Откройте файл cron для редактирования:
sudo crontab -e
Добавьте строку, которая будет запускать Certbot для автоматической проверки и обновления сертификатов. Например, для обновления сертификатов каждый день в 2 часа ночи, вы можете добавить следующую строку:
0 2 * * * certbot renew
Сохраните файл и закройте редактор.
Эта строка задачи cron вызывает команду certbot renew
, которая автоматически проверяет все установленные SSL-сертификаты и обновляет их, если это необходимо. Certbot умеет проверять срок действия сертификатов и обновлять их, если они скоро истекут.
Чтобы убедиться, что задача cron настроена правильно, вы можете выполнить следующую команду:
sudo certbot renew --dry-run
Эта команда выполняет проверку обновления сертификатов в режиме «сухого запуска», не внося никаких фактических изменений. Если команда завершится успешно, то задача cron должна быть правильно настроена.
После настройки задачи cron, Certbot будет автоматически проверять и обновлять SSL-сертификаты по расписанию. Вы можете следить за процессом обновления, проверяя логи Certbot:
sudo tail -f /var/log/letsencrypt/letsencrypt.log
Это позволит вам видеть, когда сертификаты успешно обновлены или если возникнут какие-либо проблемы.
Теперь у вас настроено автоматическое обновление SSL-сертификатов с помощью Certbot через задачу cron, что обеспечит надежную защиту вашего веб-приложения.
Post Scriptum
Не забудьте выполнить аналогичные действия для установки NGINX и настройки конфигурационного файла для веб-приложения MinIO. Также обратите внимание на порты и указанные URL-адреса.