2016-11-15 1 views
0

言語処理用にカスタムパイプラインを使ってSpacy.ioを使用しようとしていますが、カスタム関数をパイプラインに追加するとそのプロセスは1つのスレッドでのみ実行されるようです。デフォルトのパイプラインプロセスでは、指定されたすべてのスレッドが使用されます。カスタムパイプラインを使った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でマルチスレッドをサポートしますか?

答えて

1

This postを使用すると、マルチスレッドの実装方法をよりよく理解できます。マルチスレッドは、文書hereに記載されています。

要するに、タグャーは現在GILをリリースしていないので、tagger.pipe()メソッドはタグャーを1つずつ適用するジェネレータに過ぎません。 1つのプロセスにつき1つのスレッドを持つほとんどのワークロードでは、特にメモリをあまり使用しないため、タガーは非常に高速でなければなりません。複数処理バッチジョブのレシピhereが表示されます。

効率的なマルチスレッドを可能にするために、タグャーの周りにGILもリリースすることができました。これについて作業したい場合は、トラッカーやspaCy Gitterで話すことができます。

+0

私が気づいていなかったのは、マルチスレッドを使用していないが、私の質問はカスタム定義のパイプライン関数でマルチスレッドをサポートするためにできることです。私のscore_vocab_pipe関数では、ドキュメント内のすべてのトークンに対して、あらかじめ定義されたレクメムに対して類似関数を実行するので、マルチスレッドでのメリットが重要になります。 –

+0

Cythonで関数を実装し、GILを作品の主要部分の周りにリリースすることができれば、 'prange()'ループを使うことができます。ブログ投稿は私がこれをどうやって行ったかを説明しています マルチスレッド機能を使用したら、ミニバッチを累積して作業してください。 –

関連する問題