Настройка трекинга ML-моделей с DVC, SageMaker, MLflow - гайд 2026 | AiManual
AiManual Logo Ai / Manual.
21 Апр 2026 Гайд

Сквозной трекинг ML-моделей: DVC, SageMaker и MLflow для аудита, который не стыдно показать регулятору

Пошаговая инструкция по настройке сквозного аудита ML-моделей. Интеграция DVC 3.2, MLflow 2.4 и SageMaker. Воспроизводимость экспериментов для регулируемых инду

Когда регуляторы стучатся в дверь: зачем вам сквозной трекинг

Ты обучил модель. Она работает. Точность 94%. Все счастливы. Через полгода надо переобучить — данные изменились. Ты запускаешь скрипт заново. И получаешь 87%.

Почему? Какая версия данных использовалась? Какие гиперпараметры? Какой seed у рандомайзера? Ты не помнишь. Команда не помнит. Git хранит только код. Модель и данные весят гигабайты. Ты в аду.

А теперь представь, что ты в банке или фарме. К тебе приходит аудитор и спрашивает: "На каком основании ваша модель отказала клиенту в кредите? Покажите всю цепочку: от сырых данных до предсказания." Если не покажешь — штраф, репутация, суды.

Проблема не в том, чтобы обучить модель. Проблема в том, чтобы доказать через полгода или год, КАК именно ты ее обучил. Это lineage (линия жизни) модели. Без нее ты просто играешь в лотерею с регуляторами.

Решение — связать три инструмента в одну цепь:

  • DVC (Data Version Control) 3.2 — версионирует данные и модели как Git версионирует код. Хранит ссылки на S3/GCS. Дешево и точно.
  • MLflow 2.4 — трекер экспериментов. Ловит метрики, параметры, артефакты. Умеет регистрировать модели как версионные сущности.
  • Amazon SageMaker — платформа для обучения и деплоя. Дороговата, но масштабируется на лету и интегрируется со всем экосистемой AWS.

Вместе они дают сквозную прослеживаемость: сырые данные (DVC) → обучение с параметрами (MLflow + SageMaker) → зарегистрированная модель (MLflow) → деплой (SageMaker) → предсказания.

Сборка конвейера: от хаоса к порядку

Перед тем как лезть в код, пойми логику. Каждый инструмент играет свою роль.

Инструмент Задача Что хранит
DVC Версионирование больших файлов Ссылки на датасеты, модели, конфиги в S3
MLflow Трекинг экспериментов Параметры, метрики, кодовые снапшоты, артефакты
SageMaker Оркестрация обучения и деплоя Job-ы, эндпоинты, лог-группы в CloudWatch

Связующее звено — MLflow Projects. Это формат упаковки кода, который SageMaker умеет запускать как тренировочную job-у. DVC обеспечивает, чтобы код тянул правильную версию данных.

1 Настраиваем DVC: хватит копировать датасеты вручную

Установи DVC с S3-поддержкой. На 2026 год стабильная ветка — 3.2.

pip install 'dvc[s3]==3.2.0'
# Инициализируем в существующем git-репозитории
dvc init
dvc remote add -d myremote s3://your-bucket/dvc-store

Теперь добавь данные. Допустим, у тебя папка data/raw. Не заливай ее в Git!

dvc add data/raw
git add data/raw.dvc .gitignore
git commit -m "Track raw data with DVC"
dvc push

Вот и магия. В репозитории появился маленький файл data/raw.dvc — это указатель на реальные данные в S3. Сам S3-бакет — твое хранилище DVC. Команда dvc pull скачает правильную версию.

Важно: настрой политики S3-бакета. Включи versioning на самом бакете для дополнительной защиты от удаления. И используй IAM-роли, а не статические ключи (особенно в SageMaker).

Хочешь версионировать не только данные, но и предобученные модели? Без проблем. Например, скачал ты Llama 3.2 11B Vision — положи ее в папку models/pretrained и сделай dvc add. Теперь модель — часть твоего конвейера.

2 Упаковываем код в MLflow Project: сделай его переносимым

MLflow Project — это, по сути, контракт. Файл MLproject описывает, как запускать твой код, какие зависимости нужны. Создай его в корне.

# MLproject
name: fraud-detection
python_env: python_env.yaml
entry_points:
  main:
    parameters:
      data_url: {type: string, default: "data/raw"}
      learning_rate: {type: float, default: 0.001}
      batch_size: {type: int, default: 32}
    command: "python train.py --data_url {data_url} --lr {learning_rate} --batch_size {batch_size}"

Файл python_env.yaml — это аналог requirements.txt, но который MLflow понимает лучше.

А теперь самое важное: твой скрипт обучения (train.py) должен использовать API MLflow для логирования. Вот как это выглядит в 2026 году (MLflow 2.4):

import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
import dvc.api

def train(data_url, lr, batch_size):
    # Автоматически стартуем run. Все параметры будут залогированы.
    with mlflow.start_run() as run:
        # Логируем параметры
        mlflow.log_param("learning_rate", lr)
        mlflow.log_param("batch_size", batch_size)
        
        # Используем DVC, чтобы получить путь к актуальным данным
        data_path = dvc.api.get_url(data_url)
        # Загружаем данные. DVC может вернуть S3-путь или локальный.
        X, y = load_data(data_path)
        
        # Обучаем модель
        model = RandomForestClassifier(n_estimators=100)
        model.fit(X, y)
        
        # Оценка
        accuracy = model.score(X_test, y_test)
        mlflow.log_metric("accuracy", accuracy)
        
        # Сохраняем модель как артефакт MLflow
        mlflow.sklearn.log_model(model, "model")
        
        # Также можно сохранить датасет для аудита
        X_test.to_csv("test_data.csv")
        mlflow.log_artifact("test_data.csv")
        
        print(f"Run ID: {run.info.run_id}")
        return run.info.run_id

Обрати внимание на dvc.api.get_url. Это ключ. Когда SageMaker будет запускать этот проект, DVC потянет правильную версию данных из S3, потому что в твоем репозитории лежит актуальный .dvc файл.

3 Запускаем обучение на SageMaker: масштаб с трекингом

Локально все работает. Теперь перенесем это в облако. SageMaker умеет запускать MLflow Projects напрямую через свой MLflowEstimator (это стало стандартом в 2025 году).

Сначала убедись, что твой код запушен в Git (например, в CodeCommit или GitHub). SageMaker будет клонировать репозиторий.

Создай скрипт для запуска training job:

import boto3
from sagemaker.mlflow import MLflowEstimator
from sagemaker import get_execution_role

# Роль SageMaker должна иметь доступ к S3 (где DVC хранит данные) и к твоему Git-репо
role = get_execution_role()

mlflow_estimator = MLflowEstimator(
    entry_point="main",  # Имя entry_point из MLproject
    git_repo="https://github.com/your-org/fraud-detection.git",
    git_branch="main",
    source_dir=".",
    instance_type="ml.m5.xlarge",
    instance_count=1,
    role=role,
    # Параметры, которые передадутся в entry_point
    hyperparameters={
        "data_url": "data/raw",  # DVC сам разберется
        "learning_rate": 0.01,
        "batch_size": 64
    },
    # Куда слать метрики MLflow? Укажи Tracking Server.
    mlflow_tracking_uri="http://your-mlflow-server:5000",
    # Или используй managed MLflow от SageMaker (новинка 2025)
    # mlflow_tracking_uri=
    # f"https://{boto3.Session().region_name}.studio.sagemaker.aws/mlflow/",
    experiment_name="fraud-detection-prod",
    disable_profiler=True
)

mlflow_estimator.fit()

Что происходит? SageMaker поднимает инстанс, клонирует твой Git, устанавливает зависимости из python_env.yaml, запускает команду из MLproject. В процессе скрипт логирует все в MLflow Tracking Server. Ты видишь метрики в реальном времени.

Управляемый MLflow от AWS — хороший вариант, если не хочешь сам поднимать сервер. Но свой сервер дает больше контроля. Выбор за тобой.

💡
Если твои модели — большие LLM, и ты хочешь тонкую настройку, смотри гайд про масштабирование тонкой настройки LLM на SageMaker. Там те же принципы, но специфика для трансформеров.

4 Регистрируем модель и деплоим: финальная точка

После обучения в MLflow лежит артефакт "model". Надо зарегистрировать его в Model Registry. Это можно сделать прямо из кода обучения или отдельно через MLflow API.

Допустим, accuracy оказалась выше порога. Регистрируем:

# Внутри или после обучения
model_uri = f"runs:/{run.info.run_id}/model"
model_details = mlflow.register_model(model_uri, "FraudDetectionModel")

# Переводим модель в стадию "Production"
client = mlflow.tracking.MlflowClient()
client.transition_model_version_stage(
    name="FraudDetectionModel",
    version=model_details.version,
    stage="Production"
)

Теперь модель версионирована в MLflow. SageMaker умеет деплоить модели из MLflow Registry. Используй MLflowModel:

from sagemaker.mlflow import MLflowModel
from sagemaker import ModelPackage

# Укажи URI зарегистрированной модели
model_uri = "models:/FraudDetectionModel/Production"
mlflow_model = MLflowModel(
    model_uri=model_uri,
    execution_role=role,
    sagemaker_session=sagemaker.Session(),
    name="fraud-detection-mlflow",
)

# Деплой на реальный эндпоинт
predictor = mlflow_model.deploy(
    initial_instance_count=1,
    instance_type="ml.m5.large"
)

Все. Модель развернута. Каждое предсказание логируется в CloudWatch. Но главное — ты можешь проследить цепочку: эндпоинт → версия модели в MLflow → run_id эксперимента → гиперпараметры и код → версия данных в DVC.

Ошибки, которые сломают твой аудит (и как их избежать)

В теории все гладко. На практике я видел, как команды стреляли себе в ногу десятками способов. Вот топ-5.

1. Хранение секретов в коде. DVC-файлы и MLproject лежат в Git. Если ты впишешь AWS ключи в dvc remote конфиг — они утекут. Всегда используй IAM-роли для SageMaker и переменные окружения для локальной разработки. Для управления секретами в облаке AWS есть Secrets Manager.

2. Отсутствие фиксации состояния окружения. Ты использовал python_env.yaml? Молодец. Но что насчет версии CUDA, системных библиотек? В SageMaker это решается выбором правильного Docker-контейнера. Убедись, что используешь официальные контейнеры Deep Learning или свои, зафиксированные по хешу.

3. "А мы данные вручную почистили". Кощунство. Любая трансформация данных должна быть заскриптована и версионирована через DVC. Создай пайплайн DVC: data/rawdata/processed. Иначе воспроизвести preprocessing будет невозможно.

4. Игнорирование seed'ов. Нейросети и случайные леса используют рандом. Если не зафиксировать seed — два запуска дадут разные результаты. Всегда логируй random_seed как параметр в MLflow. И устанавливай его в коде (np.random.seed(42), torch.manual_seed(42)).

5. Ручное продвижение моделей. Кто-то должен кликнуть "Promote to Production" в UI MLflow? Это точка отказа. Автоматизируй это. Напиши простой скрипт, который проверяет метрики на валидационном наборе и, если они проходят порог, автоматически регистрирует новую версию и переводит ее в Production. Или используй SageMaker Model Monitor для автоматического отката.

Что дальше? Эволюция трекинга

Связка DVC + MLflow + SageMaker — это фундамент. На нем можно строить дальше.

  • Feature Store. Если фичей много и они используются разными моделями, присмотрись к SageMaker Feature Store. Он интегрируется с MLflow через специальные плагины.
  • Автоматическое документирование. Из всех залогированных артефактов можно генерировать отчеты для аудиторов автоматически. Посмотри на MLflow Evaluate (партнерская ссылка на документацию) — она умеет считать fairness metrics, что критично для регулируемых индустрий.
  • Полный цикл кастомизации. Ты работаешь с большими языковыми моделями? Тогда тебе пригодится гайд по полному циклу кастомизации моделей на SageMaker, от претрейна до DPO. Там тот же стек, но сложнее.

Главное — начать. Возьми свой текущий проект. Добавь DVC к данным. Оберни обучение в MLflow Project. Запусти один раз на SageMaker. Это займет день. Но сэкономит тебе недели отладки и, возможно, миллионы штрафов.

А если хочется поэкспериментировать в изоляции, прежде чем нести все в облако, построй себе ML-песочницу на k8s. Принципы те же.

Подписаться на канал