最近、spaCyパイプラインの一部のコンポーネントをリファクタリングしました。その結果、パイプラインの実行速度は、リファクタリング前の7倍遅くなりました。spaCyパイプラインのどのコンポーネントが速度低下の原因であるかがわかりません。また、テキストが各コンポーネントを通過するのにかかる時間を透明にする方法がわかりません。どのコンポーネントが速度低下の原因であるかがわかっていれば、問題のあるコードを特定する方がはるかに簡単です。
各Docオブジェクトにカスタム拡張機能を追加し、各パイプラインコンポーネントに処理にかかる時間を追加させることを考えましたが、それは問題があるようです。
これを行うためのspaCyが推奨する方法はありますか、または他の誰かがこの問題を巧妙な方法で解決しましたか?
これは良い質問であり、拡張属性のアイデアは実際には非常に賢いです!唯一の欠点は、既存のすべてのコンポーネントにデバッグコードを追加する必要があることです(サードパーティのコードの場合は、これもうまく機能しません)。しかし、問題のあるコードがコードベースの一部であることがわかっている場合、これは問題にはならないはずです。
もう1つのオプションは、タイムスタンプやその他必要なものをログに記録して返す関数で各パイプラインコンポーネントをラップすることですpipe(doc)
。次にnlp.pipeline
、これらのラップされたコンポーネントで上書きできます。
def wrap_pipe(name, pipe):
def wrapped(doc):
print(f"Started '{name}'", datetime.datetime.now())
return pipe(doc)
return wrapped
def debug_wrap_pipeline(nlp):
nlp.pipeline = [(name, wrap_pipe(name, pipe)) for name, pipe in nlp.pipeline]
return nlp
debug_nlp = debug_wrap_pipeline(nlp)
ただし、ここでの欠点は、同じ条件下で.pipe
実行およびデバッグできるように、各コンポーネントのメソッド(使用可能な場合)もラップする必要があることですnlp.pipe
。ベンチマークを行う場合は、これをより大規模に実行し、テキストのストリームをnlp.pipe
。で処理したいことがよくあります。
これを回避するには、パイプライン内の既存の各コンポーネントの前に「デバッグコンポーネント」を追加することで、もう少し冗長なオプションを選択できます。基本的に、次のようなものです。
def make_debug_component(name):
def debug_component(doc):
print(f"Before '{name}'", datetime.datetime.now())
return doc
return debug_component
def debug_wrap_pipeline(nlp):
pipeline = list(nlp.pipeline) # we don't want to modify this while we're looping over it
for name, pipe in pipeline:
debug_component = make_debug_component(name)
nlp.add_pipe(debug_component, before=name, name=f"debug_{name}")
return nlp
免責事項:私はそれらのアイデアを一緒にハッキングしただけで、まだ広範囲にテストしていません。しかし、彼らはうまくいったようでした。あなたがこれを探求することになった場合、私は何が最もうまくいったかを聞いて非常に興味があります。また、spaCyがそのまま出荷できる機能である可能性があり、パイプラインコンポーネントに対して提案されている静的分析とうまく組み合わせることができます。
また、完全を期すために追加します。このようなテキスト処理パイプラインをデバッグするときは、常に1回処理する単一のコーパスを使用して大規模なベンチマークを行います(単一の例を1000回ループするなどではありません)。キャッシュ効果(spaCy内だけでなくCPU内でも)、メモリ割り当ての違いなどがあり、これらすべてが影響を及ぼし、小規模テストの信頼性を低下させる可能性があります。もちろん、このような劇的な違いが発生しているシナリオでは、単一のテキストを処理するだけでも、コードをさらにデバッグするために必要な十分な手がかりとすべてを得ることができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加