BERT 質問応答埋め込み Python* デモ

この README では、Squad 調整された BERT モデルを使用してコンテキストと質問の埋め込みベクトルを計算し、質問に適切なコンテキストを見つける質問応答埋め込みデモ・アプリケーションについて説明します。bert_question_answering_demo との主な違いは、このデモでは、コンテキストの埋め込みを事前計算することで推論を高速化する方法を示していることです。

どのように動作するか

起動時に、デモ・アプリケーションはコマンドライン・パラメーターを受け取り、モデルを OpenVINO™ ランタイムプラグインにロードします。また、ユーザーが指定した URL からデータを取得して、 “コンテキスト” のリストにテキストを入力します。ユーザーの質問に答えるための実際の推論の前に、埋め込みベクトルがリストからコンテキストごとに (推論によって) 事前に計算されます。これは、最初の (“埋め込みのみ”) BERT モデルを使用して行われます。

その後、ユーザーが質問を入力すると、“埋め込み” ネットワークを使用して、指定された質問の埋め込みベクトルが計算されます。質問の埋め込みベクトルとコンテキストの埋め込みベクトルの間の L2 距離を使用して、質問に対する最終的な答えをさらに探す最良の (最も近い) コンテキストが候補として選択されます。この時点で、コンテキストがユーザーに表示されます。

通常、質問はコンテキストよりもはるかに短いため、その埋め込みの計算は非常に高速です。また、コンテキストと質問の間の L2 距離の計算も、実際の推論と比較して、ほとんどありません。これにより、質問応答中に、各コンテキストを質問と連結して、大量の入力の (コンテキストごと) 推論を行う必要がある従来のアプローチと比較して、質問にのみ必要となる実際の推論が大幅に節約されます (コンテキストは事前に計算されます)。

2 番目の (従来の SQuAD 調整済み) Bert モデルも提供されている場合は、最初のステップで見つかった最適なコンテキストで正確な答えをさらに検索するために使用され、その結果もユーザーに表示されます。

モデル API

このデモでは、Python* モデル API のモデルラッパー、アダプター、パイプラインを利用します。

統一された結果表現を備えたラッパーの汎用インターフェイスは、1 つのデモで複数の異なる質問応答モデルトポロジーのサポートを提供します。

実行の準備

デモでサポートされるモデルリストは、<omz_dir>/demos/bert_question_answering_embedding_demo/python/models.lst ファイルにあります。このファイルは、モデル・ダウンローダーおよびコンバーターのパラメーターとして使用され、モデルをダウンロードし、必要に応じて OpenVINO IR 形式 (*.xml + *.bin) に変換できます。

モデル・ダウンローダーの使用例:

omz_downloader --list models.lst

モデル・コンバーターの使用例:

omz_converter --list models.lst

サポートされるモデル

  • bert-large-uncased-whole-word-masking-squad-0001

  • bert-large-uncased-whole-word-masking-squad-emb-0001

  • bert-large-uncased-whole-word-masking-squad-int8-0001

  • bert-small-uncased-whole-word-masking-squad-0001

  • bert-small-uncased-whole-word-masking-squad-0002

  • bert-small-uncased-whole-word-masking-squad-emb-int8-0001

  • bert-small-uncased-whole-word-masking-squad-int8-0002

注: 各種デバイス向けのモデル推論サポートの詳細については、インテルの事前トレーニング・モデルのデバイスサポートパブリックの事前トレーニング・モデルのデバイスサポートの表を参照してください。

実行

-h オプションを指定してアプリケーションを実行すると、使用方法が表示されます。

usage: bert_question_answering_embedding_demo.py [-h] -i INPUT
                                                 [--questions QUESTION [QUESTION ...]]
                                                 [--best_n BEST_N] -v VOCAB
                                                 -m_emb MODEL_EMB
                                                 [--input_names_emb INPUT_NAMES_EMB]
                                                 [-m_qa MODEL_QA]
                                                 [--input_names_qa INPUT_NAMES_QA]
                                                 [--output_names_qa OUTPUT_NAMES_QA]
                                                 [-a MAX_ANSWER_TOKEN_NUM]
                                                 [-d DEVICE] [-c]

Options:
  -h, --help            Show this help message and exit.
  -i INPUT, --input INPUT
                        Required. Urls to a wiki pages with context
  --questions QUESTION [QUESTION ...]
                        Optional. Prepared questions
  --best_n BEST_N       Optional. Number of best (closest) contexts selected
  -v VOCAB, --vocab VOCAB
                        Required. Path to vocabulary file with tokens
  -m_emb MODEL_EMB, --model_emb MODEL_EMB
                        Required. Path to an .xml file with a trained model to
                        build embeddings
  --input_names_emb INPUT_NAMES_EMB
                        Optional. Names for inputs in MODEL_EMB network. For
                        example 'input_ids,attention_mask,token_type_ids','pos
                        ition_ids'
  -m_qa MODEL_QA, --model_qa MODEL_QA
                        Optional. Path to an .xml file with a trained model to
                        give exact answer
  --input_names_qa INPUT_NAMES_QA
                        Optional. Names for inputs in MODEL_QA network. For
                        example 'input_ids,attention_mask,token_type_ids','pos
                        ition_ids'
  --output_names_qa OUTPUT_NAMES_QA
                        Optional. Names for outputs in MODEL_QA network. For
                        example 'output_s,output_e'
  --model_squad_ver MODEL_SQUAD_VER
                        Optional. SQUAD version used for model fine tuning
  -a MAX_ANSWER_TOKEN_NUM, --max_answer_token_num MAX_ANSWER_TOKEN_NUM
                        Optional. Maximum number of tokens in exact answer
  -d DEVICE, --device DEVICE
                        Optional. Specify the target device to infer on; CPU
                        is acceptable. The demo will look for a suitable plugin
                        for device specified. Default value is CPU
  -c, --colors          Optional. Nice coloring of the questions/answers.
                        Might not work on some terminals (like Windows* cmd
                        console)
  -nireq NUM_INFER_REQUESTS, --num_infer_requests NUM_INFER_REQUESTS
                        Optional. Number of infer requests.
  -nstreams NUM_STREAMS, --num_streams NUM_STREAMS
                        Optional. Number of streams to use for inference on
                        the CPU or/and GPU in throughput mode (for HETERO and
                        MULTI device cases use format
                        <device1>:<nstreams1>,<device2>:<nstreams2> or just
                        <nstreams>).
  -nthreads NUM_THREADS, --num_threads NUM_THREADS
                        Optional. Number of threads to use for inference on
                        CPU (including HETERO cases).

デモのコマンドライン例

次のコマンドを使用してデモを試すことができます。

    python3 bert_question_answering_embedding_demo.py
            --vocab=<models_dir>/models/intel/bert-small-uncased-whole-word-masking-squad-0002/vocab.txt
            --model_emb=<path_to_model>/bert-large-uncased-whole-word-masking-squad-emb-0001.xml
            --input_names_emb="input_ids,attention_mask,token_type_ids,position_ids"
            --model_qa=<path_to_model>/bert-small-uncased-whole-word-masking-squad-0002.xml
            --input_names_qa="input_ids,attention_mask,token_type_ids,position_ids"
            --output_names_qa="output_s,output_e"
            --input="https://en.wikipedia.org/wiki/Bert_(Sesame_Street)"
            --input="https://en.wikipedia.org/wiki/Speed_of_light"
            -c

デモでは、バートのキャラクターと光の速度に関するウィキペディアの記事を使用して、“光の速度とは”、“光の速度の測定方法”、“バートとは誰ですか”、“バートは何歳ですか” などの質問に答えます。

デモの入力

アプリケーションは、指定された URL にある HTML ページからテキストを読み取り、コンソールからの質問に答えます。モデルとそのパラメーター (入力と出力) も重要なデモ引数です。モデルの入力順序は重要であるため、デモスクリプトはコマンドラインで指定された入力が実際のネットワーク入力と一致するかチェックすることに注意してください。埋め込みモデルはデモによって再形成され、長いコンテキストと短い質問の埋め込みベクトルを推測します。元のモデルがモデル・オプティマイザーで reshape オプションを使用して変換されていることを確認してください。一般的な 再形成の概要と制限事項を参照してください。

デモの出力

アプリケーションは、回答を含むコンテキストを同じコンソールに出力します。
アプリケーションのレポート

  • レイテンシー (すべてのステージ): 入力データの処理に必要な合計処理時間 (語彙のロード、トークンとしてのコンテキストの処理から結果の表示まで)。

  • コンテキスト埋め込みレイテンシー (ステージ 1): すべてのコンテキストの埋め込みを計算するのに必要な合計処理時間。

長文テキストを含む文書の分類

元の “コンテキスト” (URL の段落テキスト) 単独で、または質問と一緒がモデルの入力 (通常、Bert-Large の場合は 384 トークン、または Bert-Base の場合は 128 トークン) に適合しない場合、デモでは段落を重複するセグメントに分割します。長い段落テキストの場合、別個のコンテキストの場合と同様に、ネットワークが複数回呼び出されます。