Как автоматизировать переобучение и развертывание моделей с помощью GitHub Actions и MLflow: пошаговое руководство
Введение
Два года назад компания среднего размера в сфере финтеха развернула модель обнаружения мошенничества. Она работала безупречно три месяца, а затем количество ложных срабатываний резко возросло. Команда потратила две недели на ручное переобучение, тестирование и повторное развертывание. К тому времени ущерб уже был нанесен: разгневанные пользователи, потерянные транзакции, подмоченная репутация.
Эта история повторяется во многих отраслях. Разрыв между разработкой модели и реальностью продакшена увеличивается с каждым дрейфом данных, каждой новой функцией, каждым изменением бизнес-правил. Решение — не в увеличении ручного контроля, а в автоматизации. А именно, в CI/CD-пайплайне для машинного обучения, который переобучает модели на свежих данных и развертывает их без участия человека.
В этом руководстве вы узнаете, как создать именно такой пайплайн, используя GitHub Actions (бесплатный тариф) и MLflow (открытый исходный код). В результате вы получите готовый к продакшену пайплайн, который автоматически переобучает вашу модель по расписанию или триггеру, регистрирует все эксперименты и развертывает лучшую версию в стейджинг-среду. Никаких дорогих инструментов не требуется.
Если вы хотите углубиться в тему — изучить хранилища признаков, A/B-тестирование, Kubeflow, мониторинг дрейфа данных и оптимизацию затрат — ознакомьтесь с полным курсом Production ML (MLOps) на asibiont.com, который охватывает все: от обслуживания моделей до настройки гиперпараметров в продакшене.
Зачем автоматизировать переобучение и развертывание моделей?
Ручное переобучение и развертывание создают несколько проблем:
| Проблема | Последствие |
|---|---|
| Устаревшие модели | Точность падает, прогнозы становятся ненадежными |
| Человеческая ошибка | Развертывание не той версии, неправильная конфигурация среды |
| Медленная итерация | Дни или недели на внесение исправлений |
| Отсутствие воспроизводимости | Сложно отлаживать или аудировать историю модели |
Автоматизация с помощью CI/CD для машинного обучения решает все эти проблемы. Пайплайн машинного обучения на GitHub Actions может:
- Переобучать по расписанию cron (ежедневно, еженедельно) или по запросу (например, при поступлении новых данных)
- Регистрировать каждый запуск в MLflow для полной отслеживаемости
- Автоматически развертывать лучшую модель на стейджинг-сервере
- Откатываться к предыдущей версии в случае неудачной валидации
Это и есть автоматизация MLOps в своей основе: сокращение ручной работы при обеспечении актуальности моделей в продакшене.
Предварительные требования
Прежде чем перейти к коду, убедитесь, что у вас есть:
- Репозиторий GitHub с вашим кодом машинного обучения (Python, scikit-learn или TensorFlow)
- Сервер отслеживания MLflow (может быть локальным или на облачной виртуальной машине)
- Стейджинг-сервер (например, небольшой экземпляр AWS EC2 или хост Docker)
- Базовое знакомство с YAML и Python
Если вы новичок в MLflow, представляйте его как трекер экспериментов + реестр моделей, который также обрабатывает развертывание. GitHub Actions — ваш оркестратор.
Шаг 1: Настройка отслеживания и реестра моделей MLflow
Сначала настройте MLflow для регистрации экспериментов и хранения моделей. В вашем скрипте обучения (train.py) добавьте:
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
mlflow.set_tracking_uri("http://your-mlflow-server:5000")
mlflow.set_experiment("fraud-detection")
with mlflow.start_run():
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
predictions = model.predict(X_test)
acc = accuracy_score(y_test, predictions)
mlflow.log_param("n_estimators", 100)
mlflow.log_metric("accuracy", acc)
mlflow.sklearn.log_model(model, "model")
# Регистрация модели (создает новую версию)
mlflow.register_model(
f"runs:/{mlflow.active_run().info.run_id}/model",
"fraud-detection-model"
)
Это регистрирует каждую обученную модель в реестре моделей MLflow. Каждая версия получает уникальный идентификатор, метрики и параметры.
Шаг 2: Создание рабочего процесса GitHub Actions для переобучения
Теперь автоматизируем переобучение. Создайте .github/workflows/retrain.yml в вашем репозитории:
name: Retrain and Deploy ML Model
on:
schedule:
- cron: '0 6 * * 1' # Каждый понедельник в 6:00 UTC
workflow_dispatch: # Разрешить ручной запуск
jobs:
retrain:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install mlflow
- name: Retrain model
env:
MLFLOW_TRACKING_URI: ${{ secrets.MLFLOW_TRACKING_URI }}
run: |
python train.py
- name: Get best model version
id: best_model
run: |
BEST_VERSION=$(mlflow models list --model "fraud-detection-model" --latest 1 --format json | jq -r '.[0].version')
echo "best_version=$BEST_VERSION" >> $GITHUB_OUTPUT
- name: Deploy to staging
env:
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
run: |
# Пример: развертывание через SSH на стейджинг-сервер
mlflow deployments create --flavor python_function \
--model-uri "models:/fraud-detection-model/${{ steps.best_model.outputs.best_version }}" \
--target $DEPLOY_HOST
Ключевые моменты:
- Рабочий процесс запускается по расписанию cron (
schedule) и может быть запущен вручную (workflow_dispatch) - Секреты, такие как
MLFLOW_TRACKING_URIиDEPLOY_HOST, хранятся в GitHub Secrets - Команда
mlflow deployments createразвертывает последнюю зарегистрированную модель на удаленном сервере — это часть автоматизации переобучения модели
Шаг 3: Валидация перед развертыванием
Развертывание плохой модели хуже, чем отсутствие развертывания. Добавьте шаг валидации перед развертыванием:
- name: Validate model
run: |
python validate.py # Скрипт, который запускается на отложенной выборке
if [ $? -ne 0 ]; then
echo "Validation failed. Skipping deployment."
exit 1
fi
Ваш validate.py может проверять:
- Точность выше порога (например, 0.85)
- Отсутствие дрейфа данных (например, с помощью Evidently или Great Expectations)
- Время инференса менее 100 мс
Если валидация не пройдена, пайплайн останавливается — развертывания не происходит. Это ключевая практика автоматизации MLOps.
Шаг 4: Автоматизация проверки свежести данных
Переобучение модели бесполезно, если вы переобучаете на устаревших данных. Встройте проверку свежести данных в ваш пайплайн. Например, используйте скрипт Python, который проверяет временную метку последних данных для обучения:
import pandas as pd
from datetime import datetime, timedelta
data = pd.read_parquet("s3://your-bucket/training_data.parquet")
latest_timestamp = data["event_date"].max()
if latest_timestamp < datetime.now() - timedelta(days=7):
print("Data is stale. Skipping retraining.")
exit(1)
else:
print("Data is fresh. Proceeding with retraining.")
Добавьте это как шаг перед train.py. Это гарантирует, что ваша автоматизация переобучения модели запускается только тогда, когда это имеет смысл.
Шаг 5: Мониторинг и откат
Даже с валидацией в продакшене могут возникнуть проблемы. Настройте шаг мониторинга, который проверяет производительность модели после развертывания. Вы можете использовать реестр моделей MLflow для отката:
# Откат к предыдущей версии
mlflow deployments update --model-uri "models:/fraud-detection-model/3" --target $DEPLOY_HOST
Это можно запустить вручную или через вебхук, если ваша система мониторинга (например, Prometheus + Grafana) обнаружит ухудшение.
Производственные соображения
Этот пайплайн отлично работает для небольших и средних проектов. Для более крупных масштабов рассмотрите:
- Параллельное обучение: Используйте матричные стратегии в GitHub Actions для одновременного обучения нескольких моделей
- Поддержка GPU: GitHub Actions не предоставляет GPU бесплатно. Используйте собственные раннеры или отдельный CI-сервис для рабочих нагрузок на GPU
- Очистка реестра моделей: Автоматизируйте удаление старых версий (MLflow поддерживает стадии жизненного цикла: Staging, Production, Archived)
- Безопасность: Используйте токены OIDC GitHub Actions для аутентификации в облачных провайдерах вместо долгоживущих секретов
Если вы строите полную производственную инфраструктуру машинного обучения — включая хранилища признаков, пайплайны Kubeflow, A/B-тестирование и оптимизацию затрат — курс Production ML (MLOps) на asibiont.com охватывает все это в деталях.
Реальный пример: Обнаружение мошенничества в масштабе
Одна реальная компания электронной коммерции внедрила именно этот пайплайн. До автоматизации переобучение модели занимало у двух инженеров три дня. После:
- Переобучение запускается каждый понедельник в 6 утра автоматически
- Качество модели проверяется на отложенной выборке
- Лучшая модель развертывается в стейджинг, затем продвигается в продакшен после 24-часового теневого теста
- Откат происходит менее чем за 5 минут
Они сократили время развертывания с дней до минут, а количество ложных срабатываний снизилось на 40%, потому что модели всегда были свежими.
Заключение
Автоматизация переобучения и развертывания моделей с помощью GitHub Actions и MLflow — это не просто приятное дополнение, а необходимость для любой ML-команды, которая хочет, чтобы модели оставались точными и реагировали на изменения. Созданный нами пайплайн бесплатен, имеет открытый исходный код и готов к продакшену с минимальными накладными расходами.
Начните с малого: настройте переобучение по еженедельному расписанию, добавьте валидацию, затем расширьте до проверки свежести данных и отката. Каждый шаг сокращает ручную работу и повышает надежность.
Для глубокого погружения — включая Kubeflow, A/B-тестирование, мониторинг дрейфа данных и настройку гиперпараметров в масштабе — изучите курс Production ML (MLOps) на asibiont.com. Он разработан, чтобы провести вас от прототипа до производственной ML-инфраструктуры.
Ваши модели заслуживают быть такими же автоматизированными, как ваш код.
Готовы строить? Форкните пример репозитория, добавьте URL вашего сервера MLflow и запустите первое автоматическое переобучение. Будущее MLOps здесь — и оно бесплатно.
Комментарии