Как автоматизировать переобучение и развертывание моделей с помощью GitHub Actions и MLflow: пошаговое руководство

Как автоматизировать переобучение и развертывание моделей с помощью 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 здесь — и оно бесплатно.

← Все статьи

Комментарии