使用带线程的fasttext模型(gensim)



是否可以使用多线程访问fasttext模型(gensim(
目前,我试图加载一个模型一次(由于大小和加载时间的原因(,所以它会在内存中连续数千次访问其相似性函数。我想并行地完成这项工作,并且我当前的方法使用一个包装器类来加载模型,然后将其传递给工作者。但它似乎没有返回任何结果。

包装器类。启动一次。

from gensim.models.fasttext import load_facebook_model
class FastTextLocalModel:
def __init__(self):
self.model_name = "cc.de.300.bin"
self.model_path = path.join("data", "models", self.model_name)
self.fast_text = None
def load_model(self):
self.fast_text = load_facebook_model(self.model_path)
def similarity(self, word1: str = None, word2: str = None):
return self.fast_text.wv.similarity(word1, word2)

Processor类使用了上面的FastTextLocalModel方法:

fast_text_instance = FastTextLocalModel()
fast_text_instance.load_model()
with concurrent.futures.ThreadPoolExecutor(max_workers=multiprocessing.cpu_count()) as executor:
docs = corpus.get_documents()  # docs is iterable
processor = ProcessorClass(model=fast_text_instance)
executor.map(processor.process, docs)

使用max_workers=1似乎有效
我不得不提一下,我对python多线程没有任何专业知识。

在前面的回答中可能有一些有用的想法,可能需要对FastText&gensim:的最新版本

https://stackoverflow.com/a/43067907/130288

(钥匙是…

  • 即使在不同进程中进行冗余加载,如果关键内存消耗阵列是mmapped的,因此在操作系统级别自动共享,也可能不使用冗余内存;和

  • 你必须做一些额外的技巧来防止通常在加载后和赋范向量的相似操作之前重新计算,这会破坏共享

。。但FastText代码中的混乱可能会使这些操作变得更加困难。(

最新更新