Привет, Хабр! Я Александр Кузьмичёв, специалист по анализу данных и машинному обучению в ПГК Диджитал. Мы в компании занимаемся разработкой цифровых продуктов для железнодорожных грузоперевозок. Ранее я рассказывал о том, как открытая платформа MLflow помогает нам в работе.
В этой серии статей я хотел бы поделиться с вами увлекательным путешествием в мир MLflow, Optuna, AutoML и развёртывания моделей с помощью MLflow.
Сегодня мы заложим фундамент, начнём с вводной статьи. Я расскажу, как установить и настроить MLflow, а также как опубликовать его с доступом в интернет. Это пригодится для мини- и пет-проектов. В дальнейшем добавлю функционал по логированию, что значительно упростит процесс работы с моделями.
Что потребуется:
Docker
Statics IP- статический (неизменяемый внешний) IP
Internet
Free space ~40gb
Что получим:
MLflow
Jupyter
Minio
Mysql
Настроенные пути к портам
Логин и пароли для моделей
Путь к установке
Для начала нам нужно установить Docker – программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации. Docker позволит нам использовать готовые образы и настроить их под нас. Для публикации экспериментов в сеть нужно приобрести статический IP у вашего интернет-провайдера.
После установки Docker нам также потребуется настроить роутер, а именно – привязать MAC-адрес к определённому IP (192.168.0.151). Выбор пал на этот IP, так как технически проще работать с одним фиксированным адресом. В дальнейшем наш внешний IP будет привязан именно к нему.
Установка MLflow:
Мы постарались сделать процесс сборки по запуску максимально простым — «в один клик».
1. Покупаем статический IPадрес у провайдера

2. Привязываем MAC-адрес ПК к IP (192.168.0.151)
3. Устанавливаем Docker (https://www.docker.com/)
4. Клонируем проект (https://github.com/Triumrus/Mlflow-server-on-windows)
5. Запускаем mlflow-docker-compose\start-mlflow.bat (Ждём, когда установит и скачает все программы)
6. После выполнения и установок закрываем и ещё раз запускаем mlflow-docker-compose\start-mlflow.bat, где он уже запустит сервера

Запуск и остановка серверов
Запуск - mlflow-docker-compose\start-mlflow.bat
Остановка - mlflow-docker-compose\stop-mlflow.bat,
URL
Jupyter - http://localhost:8888/
(Для работы с MLFlow)
Все сохранения и изменения хранятся в папке workMLflow - http://192.168.0.151:5000/
(Сам MLflow)Minio - http://localhost:9001/
(Minio для хранение моделей)
Внешний адрес можно узнать на 2ip.ru
@ Пример: 81.88.208.255
MLflow - http://81.88.208.255:5000/
Minio - http://81.88.208.255:9001/
Логины и пароли (по умолчанию)
Minio и Mysql
Файл .env - устанавливаем свои логин и пароль.
По умолчанию
AWS_ACCESS_KEY_ID=minio
AWS_SECRET_ACCESS_KEY=minio123
MYSQL_DATABASE=mlflow_database
MYSQL_USER=mlflow_user
MYSQL_PASSWORD=mlflow
MYSQL_ROOT_PASSWORD=mysql
MLflow и модели
Файл Caddyfile - устанавливаем свои логин и пароль.
По умолчанию
# mlflow
admin looChaekie9Eitow
# jupyter
# Порты для публикации моделей
#Port Login Password
8001 admin Aiquoos5ahNgai8o
8002 admin aZee2eeshuth7qua
8003 admin Nai8shohj2ki6Cei
Настройка IP-роутера
В роутере за ПК закрепить IP (192.168.0.151)
Настроить переадресацию внешнего IP на ваш.
Заменить 81.88.208.255 на ваш.



Настройка антивируса/защиты
Добавить исключения в антивирус. Добавляем MLflow и порт для каждой модели.

Брандмауэр
Брандмауэр защитника Windows → Дополнительные параметры → Правило для входящих подключений → Создать правило → Для порта → Далее → Протокол TCP → Определенные локальные порты → Вписываем 5000,8001–8003,9000,9001 → Далее → Далее → Далее → Вписываем имя mlflow — ГотовоБрандмауэр
Брандмауэр защитника Windows → Дополнительные параметры → Правило для входящих подключений → Создать правило → Для порта → Далее → Протокол TCP → Определенные локальные порты → Вписываем 5000,8001–8003,9000,9001 → Далее → Далее → Далее → Вписываем имя mlflow — Готово
Брандмауэр
Брандмауэр защитника Windows → Дополнительные параметры → Правило для входящих подключений → Создать правило → Для порта → Далее → Протокол TCP → Определенные локальные порты → Вписываем 5000,8001–8003,9000,9001 → Далее → Далее → Далее → Вписываем имя mlflow — Готово
Брандмауэр
Брандмауэр защитника Windows → Дополнительные параметры → Правило для входящих подключений → Создать правило → Для порта → Далее → Протокол TCP → Определенные локальные порты → Вписываем 5000,8001–8003,9000,9001 → Далее → Далее → Далее → Вписываем имя mlflow — ГотовоБрандмауэр
Брандмауэр защитника Windows → Дополнительные параметры → Правило для входящих подключений → Создать правило → Для порта → Далее → Протокол TCP → Определенные локальные порты → Вписываем 5000,8001–8003,9000,9001 → Далее → Далее → Далее → Вписываем имя mlflow — ГотовоБрандмауэр
Брандмауэр защитника Windows -> Дополнительные параметры -> Правило для входящих подключений -> Создать правило -> Для порта -> Далее -> Протокол TCP -> Определенные локальные порты -> Вписываем 5000,8001-8003,9000,9001 -> Далее -> Далее -> Далее -> Вписываем имя mlflow - Готово
Добавление дополнительных портов (модели/streamlit/другое)
Добавление порта в сетевой доступ
При желании добавить ещё одну модель или приложение с сетевым доступом, надо её повесить на порт, например, 8004
В docker-compose.yml
В строке 11Добавляем нужные порты
caddy: image: caddy:latest container_name: caddy-container volumes: - ./Caddyfile:/etc/caddy/Caddyfile restart: unless-stopped ports: - "5000:5000" - "8001:8001" - "8002:8002" - "8003:8003" - "2019:2019" - "8004:8004" #Добавили нужный порт
В строке 93
Добавляем нужные портыjupyter: build: context: . dockerfile: ./docker/jupyter/Dockerfile container_name: jupyter volumes: - ./jovyan:/home/jovyan - ./credentials:/home/jovyan/.aws/credentials ports: - 8888:8888 expose: - "8001" - "8002" - "8003" - "8004" #Добавили нужный порт command: "start-notebook.sh --NotebookApp.token="
В файл Caddyfile
В конце добавляем
# Доступ из локальной сети без авторизации http://192.168.0.151:8004 { reverse_proxy jupyter:8004 } # /----------/ # Доступ из сети без авторизации http://81.88.210.241:8004 { reverse_proxy jupyter:8004 } # ИЛИ # # Доступ из сети С авторизаций. # Добавляет авторизацию # Пароль можно зашифровать в DOCKER в контейнере "caddy-container" # Команда : caddy hash-password http://81.88.210.241:8004 { basic_auth { admin $2a$14$QN7CZ4aQ7Hpy9EKTImI/eetKvZPk6T.pP/31EvQmKJ8/E/IoTfFbS } reverse_proxy jupyter:8004 } # /----------/
+ в Роутере, Антивирусе, Брандмауэре прописать как ранее показывалось.
Автоматизация процессов
Теперь давайте немного поговорим о том, как можно автоматизировать некоторые процессы в MLflow.
Остановимся на области в красном квадрате на схеме.
Хранение слепка данных: На этапе логирования и сохранения моделей важно иметь возможность восстановить эксперименты и провести повторное тестирование. Рекомендуем сохранять md5 или hash строк и/или таблицы — это займёт немного места и в случае восстановления эксперимента поможет отслеживать изменения: были ли изменения – да или нет.
Фичи и модели: При длительной работе над проектом создаётся огромное количество фичей и разнообразных подходов используемых моделей. И всегда остаётся вероятность, что «не сыгравшая» фича, «сыграет» при новой модели или в комбинации с другой фичей.
Для отбора оптимальных фичей/подходов/моделей рекомендуем использовать Optuna, а MLflow упростит процесс регистрации и логирования огромного числа экспериментов.
Аналитический отчёт: Формируйте аналитические отчёты для каждой модели в формате .md. Это позволит ответить на многие вопросы о модели без необходимости глубокого погружения в неё.
Интеграция с GitLab: отслеживайте в MLflow, какая сборка проекта была использована.
Надеемся, что статья сможет стать полезной отправной точкой для ваших экспериментов с MLflow. Далее расскажем о теории и практике отбора признаков через Optuna и свяжем с MLflow, AutoML.