Я работаю над проектом, включающим запуск приложения Flask -restful поверх Gunicorn, в котором загружается модель FastAI и используется для прогнозирования при получении входящего запроса. Модель FastAI экспортируется в файл, который предварительно загружается при запуске приложения. Я хочу ускорить работу приложения, когда оно получает много запросов, используя многопроцессорную обработку Gunicorn, то есть настройку его рабочих -w
, но я обнаружил, что увеличение количества рабочих, похоже, только снижает скорость, с которой оно может отвечать.
Модель FastAI загружается из экспортированного файла один раз, когда приложение предварительно загружено, поэтому она должна быть разделена между всеми воркерами:
model = fastai.vision.load_learner(PATH, FILENAME)
Запросы к приложению затем выполняются из другого скрипт с использованием ThreadPoolExecutor
:
with concurrent.futures.ThreadPoolExecutor(max_workers = 8) as pool:
#[request-to-app for x in list-of-length-100+]
Когда приложение запускается с Gunicorn как:
gunicorn -w 8 --preload -b 127.0.0.1:5000 app:app
, я обнаружил, что изменение количества рабочих в команде gunicorn на 2 увеличивает скорость немного по сравнению с 1, но установка на 4 или что-то большее значительно снижает скорость. Есть ли что-то в моделях учащихся FastAI, что могло бы помешать одновременному совместному использованию этих данных каждым из воркеров, или что в противном случае могло бы привести к его замедлению, как это?