← Маршрут ML-инженерии

Урок · 2 мин чтения · упражнения и самопроверка

API предсказаний

После урока: объяснить fastapi и выполнить упражнение «Запустить API и проверить правильные и неверные запросы», обосновав выбранный подход..

Перед началом

Примеры выполняются локально: скачайте лабораторию и установите зависимости по README. Онлайн-редактор алгоритмических задач не содержит ML-библиотеки.

Контракт предсказания

Сервис получает JSON с features: ровно 13 конечных чисел в порядке, сохранённом при обучении. Он возвращает класс, вероятности и идентификатор версии артефакта. Схема должна совпадать с обучением; согласованность порядка столь же важна, как число колонок.

FastAPI использует Pydantic-модель для проверки запроса. Неверная длина, неизвестное поле и NaN/Infinity отклоняются. Код ответа 422 сообщает о нарушении контракта. Отсутствующая или повреждённая модель должна мешать готовности сервиса, а не приводить к правдоподобному ответу из локальной заглушки.

Жизненный цикл

Артефакт загружается один раз при старте в lifespan. На каждом запросе вызывается только predict_proba сохранённого Pipeline. Обучение внутри обработчика увеличило бы задержку и сделало результат зависимым от запросов. Ресурсоёмкий inference в лаборатории выполняется обычным синхронным обработчиком; async сам по себе не ускоряет CPU-вычисления.

Запустите uvicorn по README. /health возвращает готовность и имена признаков; /docs показывает контракт. Команда python -m ml_lab.client отправляет реальную строку набора данных. Это проверка всей цепочки: клиент → JSON → валидация → обработка → модель → ответ.

Ошибки и версии

Логируйте статус, время обработки и версию модели. Не требуется сохранять все исходные признаки в журнал: это может включать ненужные данные. При обновлении модели контролируйте совместимость схемы и сохраните предыдущий артефакт для отката. Успешный HTTP-ответ подтверждает работу интерфейса, а не правильность предсказания.

В коде ниже проверяется только входная модель без запущенного сервера. Полный HTTP-путь и отрицательные сценарии находятся в лабораторных тестах. Не отправляйте запросы этого проекта в редактор алгоритмических задач: сервис запускается локально на вашем компьютере.

Пошаговый пример

python
from pydantic import BaseModel, ConfigDict, Field, ValidationError
class Input(BaseModel):
    model_config = ConfigDict(extra="forbid", allow_inf_nan=False)
    features: list[float] = Field(min_length=13, max_length=13)
try:
    Input(features=[1, 2])
except ValidationError:
    print("rejected")

Ожидаемый вывод

text
rejected

Слишком короткий массив отклоняется до обращения к модели.

Сделайте самостоятельно

Запустите сервис и выполните валидный запрос, затем запрос с двумя признаками. Укажите ожидаемые статусы и проверьте model_version.

Ответ и критерии проверки

Валидный запрос должен дать 200, массив из двух значений — 422. Версия в успешном ответе должна совпасть с /health и оставаться одинаковой до смены артефакта.

Проверьте понимание

1. Нужно ли выполнять fit при каждом /predict?
2. Что делать, если артефакт отсутствует?

Редакция SubTree · Проверка примеров: 26.10.2026

Исполняемые примеры проверены автоматическим запуском; источники сверены при подготовке.