Spacy.io 使用自定义管道的多线程

Spacy.io multithreading with custom pipelines

我正在尝试将 Spacy.io 与自定义管道一起用于语言处理,但似乎当我向管道添加自定义函数时,进程 运行 仅在一个线程上。默认管道进程使用指定的所有线程。

我是这样定义管道的:

nlp = spacy.load(language, create_pipeline=custom_pipeline)

这是custom_pipeline函数:

def custom_pipeline(nlp):
    return (nlp.tagger, score_vocab_pipe)

这就是我 运行 管道的方式:

nlp.pipe(texts, batch_size=1000, n_threads=8)

自定义管道函数是否有任何必要条件来支持 spacy 的多线程?

This post might give you a better understanding of how the multi-threading is implemented. The multi-threading is described in the docs here.

简而言之:标记器当前不释放 GIL,因此 tagger.pipe() 方法只是一个逐个应用标记器的生成器。对于每个进程一个线程的大多数工作负载,标记器应该非常快,特别是因为它不使用太多内存。您可以查看多处理批处理作业的配方 here

我们也可以围绕标记器释放 GIL,以允许高效的多线程。如果你想解决这个问题,我们可以在 tracker 或 spaCy Gitter 上讨论。