Что такое FastAPI
Что проверяют
Умеете ли вы завернуть модель в сервис и понимаете ли асинхронную модель под капотом. Для инженера данных вопрос не про декораторы, а про то, переживёт ли ваш сервис параллельные запросы к тяжёлому инференсу.
Как отвечать
FastAPI это ASGI-фреймворк поверх Starlette, который берёт на себя маршрутизацию, зависимости и фоновые задачи, а валидацию и сериализацию делает через Pydantic по аннотациям типов. Из тех же аннотаций собирается схема OpenAPI и интерактивная документация, поэтому контракт не расходится с кодом.
class PredictIn(BaseModel):
text: str
top_k: int = 5
@app.post("/predict", response_model=PredictOut)
def predict(req: PredictIn) -> PredictOut:
return PredictOut(labels=model.predict(req.text, req.top_k))Самое важное для ML-сервиса это выбор между обычным и асинхронным обработчиком. Объявленный через def выполняется в пуле потоков и цикл событий не держит. Объявленный через async def работает прямо в цикле, поэтому синхронный инференс внутри него останавливает обслуживание всех запросов процесса.
Модель загружают один раз на старте приложения, в обработчике событий жизненного цикла, а не при первом запросе. Долгие задачи отдают в очередь и возвращают идентификатор. Масштабируются процессами, потому что глобальная блокировка интерпретатора не даёт одному процессу занять все ядра, и каждая копия процесса несёт свою копию модели в памяти.
Где спотыкаются
Пишут async def и зовут внутри синхронную библиотеку: блокирующий HTTP-клиент, драйвер базы, вычисление на процессоре. Под нагрузкой сервис отвечает по таймауту, хотя по профилю он почти не занят.
Делают поле обязательного типа со значением None по умолчанию. Схема и проверки типов начинают расходиться с реальностью, а потребитель API видит поле обязательным. Необязательность выражается объединением с None.
Отдают наружу объекты, которые не умеют сериализоваться: сущность ORM, массив с числами библиотеки вычислений. Отсюда ошибки сериализации в рантайме и утечка внутренних полей, если не задан тип ответа.