spaCyパイプラインでカスタムコンポーネントをベンチマークする最良の方法は何ですか?

tw0000

最近、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]

編集
0

コメントを追加

0

関連記事

分類Dev

tornadofxでカスタマイズされたUIコンポーネントを作成するためのベストプラクティスは何ですか?

分類Dev

ネイティブのAndroidコンポーネントを使用してAndroidのレベルセレクターとなる2Dマップを作成するための最良のアプローチは何ですか?

分類Dev

カスタムクラスコンポーネントのスタイルでテーマを使用する方法

分類Dev

ラズベリーパイにドットネットコアをインストールする最良の方法は何ですか?

分類Dev

反応コンポーネント全体でカスタムAPIクライアントを使用するための慣用的な方法は何ですか?

分類Dev

入力プロパティに基づいてコンポーネントにクラスを追加する最良の方法は何ですか?

分類Dev

部分インデックスタプルのリストを使用してマルチインデックスデータフレームをスライスする最良の方法は何ですか?

分類Dev

Webコンポーネントでカスタムイベントをキャッチする方法は?

分類Dev

UMLコンポーネントをC ++にマップする最良の方法は何ですか?

分類Dev

Xamarinでアイコンベースのカスタムツールバーを実装するための最良の方法は何ですか?

分類Dev

レイキャスターと交差するコンポーネント情報を抽出するための最良の方法は何ですか?

分類Dev

コマンドラインから実行するときに、スクリプトでbash関数をパラメーターとして作成するための最良の方法は何ですか?

分類Dev

カスタムバインディングハンドラーにデータを渡すための最良のアプローチは何ですか

分類Dev

エポックタイムスタンプをラウンドトリップする最良の方法は何ですか?

分類Dev

私のウェブサイトでベンチマークとエラーを記録するための最良の方法は何ですか?

分類Dev

Angular2コンポーネント内のコンポーネントサイズ変更イベントをリッスンする最良の方法は何ですか?

分類Dev

カウントダウンタイマーを作るための最良の方法は何ですか?

分類Dev

Vueコンポーネントでスタイルを使用するためのベストプラクティスは何ですか?

分類Dev

カスタムポップアップインタースティシャル広告を作成するための最良の方法は何ですか?

分類Dev

複数のロジックブランチをサポートするイテレータを作成するための最良の方法は何ですか?

分類Dev

Angularコンポーネントでカスタムパイプをチェーンする

分類Dev

JSFカスタムコンポーネントのラッパーのタイプを指定するにはどうすればよいですか?

分類Dev

マルチラングコンテンツ用のデータベースをセットアップする最も実用的な方法は何ですか?

分類Dev

emberコンポーネント内にネストされた入力のクラスを変更する最良の方法は何ですか?

分類Dev

Delphiで2つのテキストファイルを1つのTMemoコンポーネントにロードする最良の方法は何ですか?

分類Dev

Blazeを使用してMeteorのカスタムコンポーネントでイベントをキャプチャする関数を渡す方法

分類Dev

クライアントに何もインストールせずにレポートを表示するための最良の方法は何ですか

分類Dev

コンポーネントスコープのシングルトンを実装するための最良の方法は何ですか?

分類Dev

LitElement:小さなWebコンポーネント内で多くのカスタムスタイルルールといくつかの動的ルールを作成する場合のベストプラクティス(またはベストパフォーマンス)?

Related 関連記事

  1. 1

    tornadofxでカスタマイズされたUIコンポーネントを作成するためのベストプラクティスは何ですか?

  2. 2

    ネイティブのAndroidコンポーネントを使用してAndroidのレベルセレクターとなる2Dマップを作成するための最良のアプローチは何ですか?

  3. 3

    カスタムクラスコンポーネントのスタイルでテーマを使用する方法

  4. 4

    ラズベリーパイにドットネットコアをインストールする最良の方法は何ですか?

  5. 5

    反応コンポーネント全体でカスタムAPIクライアントを使用するための慣用的な方法は何ですか?

  6. 6

    入力プロパティに基づいてコンポーネントにクラスを追加する最良の方法は何ですか?

  7. 7

    部分インデックスタプルのリストを使用してマルチインデックスデータフレームをスライスする最良の方法は何ですか?

  8. 8

    Webコンポーネントでカスタムイベントをキャッチする方法は?

  9. 9

    UMLコンポーネントをC ++にマップする最良の方法は何ですか?

  10. 10

    Xamarinでアイコンベースのカスタムツールバーを実装するための最良の方法は何ですか?

  11. 11

    レイキャスターと交差するコンポーネント情報を抽出するための最良の方法は何ですか?

  12. 12

    コマンドラインから実行するときに、スクリプトでbash関数をパラメーターとして作成するための最良の方法は何ですか?

  13. 13

    カスタムバインディングハンドラーにデータを渡すための最良のアプローチは何ですか

  14. 14

    エポックタイムスタンプをラウンドトリップする最良の方法は何ですか?

  15. 15

    私のウェブサイトでベンチマークとエラーを記録するための最良の方法は何ですか?

  16. 16

    Angular2コンポーネント内のコンポーネントサイズ変更イベントをリッスンする最良の方法は何ですか?

  17. 17

    カウントダウンタイマーを作るための最良の方法は何ですか?

  18. 18

    Vueコンポーネントでスタイルを使用するためのベストプラクティスは何ですか?

  19. 19

    カスタムポップアップインタースティシャル広告を作成するための最良の方法は何ですか?

  20. 20

    複数のロジックブランチをサポートするイテレータを作成するための最良の方法は何ですか?

  21. 21

    Angularコンポーネントでカスタムパイプをチェーンする

  22. 22

    JSFカスタムコンポーネントのラッパーのタイプを指定するにはどうすればよいですか?

  23. 23

    マルチラングコンテンツ用のデータベースをセットアップする最も実用的な方法は何ですか?

  24. 24

    emberコンポーネント内にネストされた入力のクラスを変更する最良の方法は何ですか?

  25. 25

    Delphiで2つのテキストファイルを1つのTMemoコンポーネントにロードする最良の方法は何ですか?

  26. 26

    Blazeを使用してMeteorのカスタムコンポーネントでイベントをキャプチャする関数を渡す方法

  27. 27

    クライアントに何もインストールせずにレポートを表示するための最良の方法は何ですか

  28. 28

    コンポーネントスコープのシングルトンを実装するための最良の方法は何ですか?

  29. 29

    LitElement:小さなWebコンポーネント内で多くのカスタムスタイルルールといくつかの動的ルールを作成する場合のベストプラクティス(またはベストパフォーマンス)?

ホットタグ

アーカイブ