Как сделать предсказание моделью?
Жмёшь
model.predict(sample)
и радуешься жизни :)
Но это если самому локально поиграться. А если хочется предсказать не «для себя», а встроить модель в приложение и сделать её частью бизнес-логики? Пусть для простоты наше приложение — API.
Первый вариант, который приходит в голову, — написать что-то такое:
@router.post('/predict/')
async def predict(user_request):
# some business logic before predict (p1)
predict = model.predict(sample)
# some business logic after predict (p2)
return result
Но будет плохо, если придёт много пользователей одновременно. Мы начнём предсказывать для одного, а все остальные встанут в очередь, которая будет расти. Причём если в (p1) делается io-операция «авторизоваться» или «скачать картинку», то она не будет выполняться для нового пользователя, пока мы не предскажем для старого (если это однопоточный event-loop). Хотя могли бы и не ждать :) Поэтому плохо мешать асинхронную логику для «типичных» io-операций и тяжёлое предсказание моделью.
А ещё наша модель сейчас может предсказывать семплы по одному, но ведь батчами было бы эффективнее! Их можно копить, например, через очередь. Мы кладём в неё семплы, и если накопился батч нужного размера / подождали батч дольше определённого времени — вызываем модель.
Сказать про эту концепцию — легко, а вот написать это всё эффективно — задача со звёздочкой
😉 Хорошо, что существуют инференс-сервера (например, Nvidia Triton или TorchServe), в которых толпа умных инженеров всё сделала за нас:)
Мы можем поднять такой инференс-сервер с моделью и обращаться к ней по HTTP/gRPC примерно таким образом:
@router.post('/predict/')
async def predict(user_request):
# some business logic before predict (p1)
predict = await inference_server_client.predict(sample)
# some business logic after predict (p2)
return result
Сейчас в нашем приложении операция предсказания стала типичной «лёгкой» io-операцией, которая ещё и не блокирует основной поток! Теперь пока первый пользователь ждёт предикт, второй может его не ждать и авторизоваться
😏 Плюс у нас появился батчинг! И возможность независимо масштабировать само приложение и сервинг.
Итак, мы рассмотрели одну проблему и вариант её решения, если вы хотите сделать продукт с DL-составляющей. Но на деле их тысяча и одна :)
Чтобы показать, как их решать, мы создали курс Деплой DL-сервисов, на котором вы научитесь быстро и поддерживаемо учить модели, создавать веб-сервисы и мониторить ваши решения.
Уже завтра, 9 ноября, в 12:00 МСК пройдёт вводная лекция. Вы ещё успеваете присоединиться! Переходите
по ссылке и записывайтесь на курс
🎓