我正在使用 Flask-restx 和 Spacy NER 模型。
我有一個 api,它必須接收文本和 ID 號,預測標簽并使用 spacy nlp 模型回傳相同的標簽。此 nlp 模型特定于特定的 Id 編號。
示例:對于Id '1',將加載nlp模型'a'并用于預測;對于 Id '2',將使用 nlp 模型 'b',等等。
我想知道是否有可能我可以為已預加載特定 nlp 模型的特定 Id 保持打開執行緒,并且在發送請求時,根據 ID 號,打開的特定執行緒可以處理資料并回傳一個價值快。
示例:api 收到一個請求,為 id '5' 創建了一個新的 nlp 模型 'x' 并且將被使用,因此打開一個新執行緒,并加載了模型 'x' 和所有具有 id 的請求數字“5”僅由該執行緒處理。
目的是存在一個預加載的模型,因此當發送請求時,可以在幾秒鐘內處理它并回傳值。加載 spacy 模型大約需要 30 秒,這不能在每次發送請求時完成,因為會有超時。
這可以完成還是有其他方法可以完成?
uj5u.com熱心網友回復:
我建議你只依賴 Flask 執行緒模型并將 NLP 模型包裝成實作模型延遲加載的物件(僅在需要時)和一個單獨的工廠函式來創建和快取這些物件。添加 threading.Lock 以確保一次只有一個 Flask 執行緒在 NLP 決議器中。
示例代碼:
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://www.uj5u.com/houduan/382695.html
