Ответ на вопрос с собеседования 💼
У изначального решения большой минус: картинки предсказываются синхронно по одной. Думаю, всем известно, что предсказать 64 картинки по одной выйдет гораздо дольше, чем предсказать один батч из 64 картинок. Но как организовать батчинг, когда картинки приходят к нам с клиента по одной?
Добавим немного асинхронщины. Введем промежуточную очередь! (рис.3). Также введем два параметра:
1) batch_size — размер батча, с которым хотим предсказывать;
2) interval — допустимое время "простоя".
Раньше мы сразу отправляли картинку в нейросеть. А сейчас позволим себе немного подождать, пока накопится батч.
После того, как картинка пришла в API, она сразу сбрасывается в очередь (это быстро!). Каждые interval ms мы "выгребаем" N картинок из очереди. N = min(len(queue), batch_size). (рис. 4)
Можно поступать умнее: если в очереди >= batch_size картинок, то после предикта будем сразу брать новую пачку.
Теперь должно стать понятнее, откуда берутся параметры у TorchServe.
Но в реальных задачах лучше не заниматься написанием собственного батчинга, а использовать готовые inference-сервера. Например, TorchServe или Triton от Nvidia.
Паттерн с введением промежуточной очереди, в которую можно что-то по-быстрому скинуть и которую мы разгребаем в удобном для нас темпе, появился конечно же не из мира DL 🙂Это очень популярный паттерн для highload-задач. Он позволяет бороться со всплесками и легко скейлиться под изменчивую нагрузку. Прочесть про него можно здесь.
У изначального решения большой минус: картинки предсказываются синхронно по одной. Думаю, всем известно, что предсказать 64 картинки по одной выйдет гораздо дольше, чем предсказать один батч из 64 картинок. Но как организовать батчинг, когда картинки приходят к нам с клиента по одной?
Добавим немного асинхронщины. Введем промежуточную очередь! (рис.3). Также введем два параметра:
1) batch_size — размер батча, с которым хотим предсказывать;
2) interval — допустимое время "простоя".
Раньше мы сразу отправляли картинку в нейросеть. А сейчас позволим себе немного подождать, пока накопится батч.
После того, как картинка пришла в API, она сразу сбрасывается в очередь (это быстро!). Каждые interval ms мы "выгребаем" N картинок из очереди. N = min(len(queue), batch_size). (рис. 4)
Можно поступать умнее: если в очереди >= batch_size картинок, то после предикта будем сразу брать новую пачку.
Теперь должно стать понятнее, откуда берутся параметры у TorchServe.
Но в реальных задачах лучше не заниматься написанием собственного батчинга, а использовать готовые inference-сервера. Например, TorchServe или Triton от Nvidia.
Паттерн с введением промежуточной очереди, в которую можно что-то по-быстрому скинуть и которую мы разгребаем в удобном для нас темпе, появился конечно же не из мира DL 🙂Это очень популярный паттерн для highload-задач. Он позволяет бороться со всплесками и легко скейлиться под изменчивую нагрузку. Прочесть про него можно здесь.