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 上讨论。
我正在尝试将 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 上讨论。