Какой у вас опыт в области MLOps?

Ответ

Мой опыт охватывает полный цикл — от тренировочного ноутбука до работающего в продакшене сервиса. Я настраивал пайплайны с использованием MLflow для трекинга экспериментов и DVC для версионирования данных и моделей.

Для деплоя чаще всего использовал FastAPI-сервисы, упакованные в Docker-контейнеры и оркестрируемые через Kubernetes. Вот пример минимального сервиса для инференса:

# app.py
from fastapi import FastAPI
import joblib
import numpy as np

app = FastAPI()
model = joblib.load('model.pkl')

@app.post('/predict')
async def predict(features: list):
    prediction = model.predict(np.array(features).reshape(1, -1))
    return {'prediction': int(prediction[0])}
# Dockerfile
FROM python:3.9-slim
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py model.pkl .
CMD ['uvicorn', 'app:app', '--host', '0.0.0.0', '--port', '8000']

Также работал с мониторингом дрейфа данных через Evidently AI и настройкой CI/CD (GitHub Actions/GitLab CI) для автоматического переобучения моделей при изменении данных.

Ответ 18+ 🔞

А, ну вот, смотри, история как у всех нормальных людей — начинал с ноута, который грелся как утюг и вентилятор орал как сумасшедший, а закончил продакшеном, где всё тихо и страшно, потому что если что-то сломается, то тебе звонят в три ночи. Весь этот путь, ёпта, от идеи до работающей системы.

Так, по порядку. Сначала эксперименты. Без нормального трекинга — это просто пиздец, чувак. Запустил сто моделей, а потом нихуя не помнишь, какая из них и на каких данных училась. Поэтому MLflow — это святое. Всё аккуратненько записывается: метрики, параметры, даже артефакты (типа весов модели или графиков). Без этого — терпения ноль, ебать, сразу превращаешься в того самого распиздая, который ищет нужный файл по названиям вроде model_final_final_2_real_v3.pkl.

Дальше — данные. С ними та же беда. Ты обучил модель на одних данных, а потом пришли новые — и всё, модель нихуя не работает. Поэтому DVC — это как система контроля версий, но для гигабайтов всякого дерьма: датасетов, препроцессированных фич, самих моделей. Связал с гитом — и теперь всегда можно откатиться к тому состоянию данных, на котором модель летала. Удивление пиздец, когда понимаешь, насколько это удобно.

Ну а потом начинается самое интересное — продакшен. Тут уже не до скриптов в Jupyter. Нужен сервис, который будет принимать запросы и отдавать предсказания. FastAPI — отличная штука, легковесная и быстрая. Написал эндпоинт, обернул свою модель — и готово. Пример, кстати, классический, я его наизусть знаю.

# app.py
from fastapi import FastAPI
import joblib
import numpy as np

app = FastAPI()
model = joblib.load('model.pkl')

@app.post('/predict')
async def predict(features: list):
    prediction = model.predict(np.array(features).reshape(1, -1))
    return {'prediction': int(prediction[0])}

Дальше — упаковка. Чтобы этот сервис можно было запустить где угодно, а не только на твоём ноуте с кучей установленных либ, нужен Docker. Пишешь простенький Dockerfile, который говорит: «Возьми такой-то образ питона, установи вот эти библиотеки, скопируй мой код и модель, и запусти сервер». И всё, контейнер готов.

# Dockerfile
FROM python:3.9-slim
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py model.pkl .
CMD ['uvicorn', 'app:app', '--host', '0.0.0.0', '--port', '8000']

А когда сервисов становится овердохуища, или они должны масштабироваться под нагрузку, на сцену выходит Kubernetes. Это уже, конечно, отдельная песня — поды, деплойменты, сервисы, ингрессы... Но без этого в современном мире никуда. Оркестрирует всю эту банду контейнеров, следит, чтобы они были живы, распределяет нагрузку. Красота, хоть и сложно сначала.

Но и это не всё. Модель в продакшене — это как ребёнок, за которым нужно постоянно следить. Данные могут «уплыть» (это называется дрейф данных). Сегодня модель предсказывает цену квартиры по Москве, а завтра ей подсунули данные из деревни Гадюкино — и она несёт хуйню. Для этого использовал Evidently AI — инструмент для мониторинга. Он показывает, когда распределение признаков изменилось и модель пора переобучать.

И, наконец, вишенка на торте — автоматизация. Чтобы не бегать каждый раз с руками, когда данные обновились, настраивал CI/CD (в том же GitHub Actions или GitLab CI). Написал пайплайн, который сам запускает переобучение, если в данных появились значительные изменения, прогоняет тесты, и если всё ок — сам же и деплоит новую версию модели в продакшен. Выглядит как магия, но на самом деле — просто хорошо настроенная автоматизация. Главное, чтобы этот пайплайн сам не сломал ничего, а то будет вам хиросима и нигерсраки.