我使用的是酒瓶-restx和Spacy NER模型。
我有一个api,它必须接收文本和Id编号,预测标签并使用spacy nlp模型返回相同的标签。此nlp模型特定于特定的Id号。
例如:对于Id '1',nlp模型'a‘将被加载并用于预测;对于Id '2',nlp模型'b’将被使用等等。
我想知道是否有可能使特定id保持打开线程,这些id预先加载了特定的nlp模型,并且在发送请求时,根据id号,打开的特定线程可以快速处理数据并返回值。
示例: api收到了一个请求,即为id '5‘创建了一个新的nlp模型'x’,并将使用它,因此将使用加载的模型'x‘打开一个新的线程,所有具有id号'5’的请求都仅由该线程处理。
其目的是存在一个预加载模型,因此当发送请求时,可以在几秒钟内处理该请求并返回值。加载spacy模型大约需要30秒,这不能在每次发送请求时完成,因为会有超时。
这是可以做到的,还是有其他方法可以做到呢?
发布于 2021-12-09 07:49:30
我建议您只依赖Flask线程模型,并将NLP模型封装到实现模型延迟加载(仅在需要时)的对象中,并使用单独的工厂函数来创建和缓存这些对象。添加一个threading.Lock,以确保一次只在NLP解析器中只有一个Flask线程。
示例代码:
from threading import Lock
MODELS = {}
class NlpModel():
_model = None
_lock = Lock()
def __init__(self, model_id):
self._id = model_id
@property
def model(self):
if self._model is None:
self._model = slow_load_model_with_something(self._id)
return self._model
def parse(self, data):
with self._lock:
# only one thread will be in here at a time
return self.model.do_your_thing(data)
def get_model(model_id):
model = MODELS.get(model_id, None)
if not model:
model = NlpModel(model_id)
MODELS[model_id] = model
return model
# Example Flask route
@app.route('/parse/<model_id>')
def parse_model(model_id):
model = get_model(model_id)
model.parse(data_from_somewhere)https://stackoverflow.com/questions/70285612
复制相似问题