Вот фиктивный пример, предполагающий, что у меня есть приложение ML, которое работает под Flask, и я могу использовать gunicorn для одновременного управления несколькими рабочими процессами.
Если у меня 2 рабочих, то есть два процесса (pid 1 и pid 2), на которых одновременно выполняется следующий скрипт flask. По конкретному запросу он может go обработать любой процесс. Моя проблема связана с загрузкой модели. Поскольку у меня огромная модель, загрузка может занять пару минут. Скажем, pid 1 получил первый запрос на задание, и загрузка модели занимает 2 минуты, а затем завершает sh прогноз, и в следующий раз пользователь не будет ожидать, что задержка при загрузке модели больше не тратится, поскольку «инициализация» уже выполнена. Однако, если следующий запрос задания назначен для pid 2, загрузка модели (снова) займет еще 2 минуты, поскольку модель не является общим экземпляром между двумя процессами. Для большинства других проблем совместного использования ресурсов между процессами мы можем использовать базу данных; но я не вижу сам экземпляр модели, которым можно делиться таким образом.
Есть ли способ решить эту проблему?
import pandas as pd
from flask import Flask, jsonify, request
import pickle
# load model
model = pickle.load(open('model.pkl','rb'))
# app
app = Flask(__name__)
# routes
@app.route('/', methods=['POST'])
def predict():
# get data
data = request.get_json(force=True)
# convert data into dataframe
data.update((x, [y]) for x, y in data.items())
data_df = pd.DataFrame.from_dict(data)
# predictions
result = model.predict(data_df)
# send back to browser
output = {'results': int(result[0])}
# return data
return jsonify(results=output)
if __name__ == '__main__':
app.run(port = 5000, debug=True)