@Idobrodushniy

UWSGI workers + Tensorflow — как настроить инициализацию модели для каждого воркера?

Столкнулся с проблемой в работе с Flask и Tensorflow в REST API сервисе.
Дано:
Допустим имеется вебсервис, написанный с помощью Flask, который сервится на UWSGI. Также сервис использует керас модель на основе Tensorflow backend.
В сервисе есть глобальная переменная(инициализированная модель), которая должна инициализироваться при запуске воркера.
Проблематика: Проблема в том, что инициализация модели должна происходить при старте каждого сервиса. К примеру, в файле wsgi.py после импорта приложения, мы инициализируем модель вот таким способом:
from web.app import application
from keras_backend import KerasModel

application.keras_model = KerasModel(model_path='models/keras-weights.hdf5')

В таком подходе, инициализация модели происходит единожды при старте самого первого воркера. И соответственно хранится только там.
На конфиге ювзги с одним потоком и одним процессом все работает. Если сделать значение опции workers(они же processes) больше 1 или добавить опцию master=true/py-autoreload=true - то только в одном процессе будет храниться модель, когда запрос будет исполняться любым другим воркером uwsgi, то будет выстреливать harakiri по таймауту.
Вопрос: Как сделать так, чтобы инициализация модели происходила при спавне каждого воркера UWSGI отдельно?(Текущий ини файл с конфигом для одного воркера и одного потока, на котором все работает, прикрепляю ниже.)
[uwsgi]
socket = 0.0.0.0:8000
protocol = http
chdir = /opt/project
module = wsgi:application
threads =  1
workers = 1
listen = 128
harakiri = 60
single-interpreter = true
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
@Idobrodushniy Автор вопроса
Нашел ответ на вопрос.
Если кто-то в дальнейшем столкнется с такой проблемой, то можно решить это с помощью опции lazy-apps=true.
В таком случае приложение инициализируется в каждом воркере.
На данный момент ини файл имеет вид:
[uwsgi]
socket = 0.0.0.0:8000
protocol = http
chdir = /opt/project
module = wsgi:application
cheaper = 2
processes = 16
listen = 128
harakiri = 60
master = true
reaper = true
enable-threads = true
single-interpreter = true
py-autoreload = 1
lazy-apps = true
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы