BERT の質問応答 Python* デモ¶
この README では、推論に Squad-tuned BERT モデルを使用する質問応答デモ・アプリケーションについて説明します。
どのように動作するか¶
起動時に、デモ・アプリケーションはコマンドライン・パラメーターを受け取り、モデルを OpenVINO™ ランタイムプラグインにロードします。また、ユーザーが指定した URL からデータを取得して、 “コンテキスト” テキストを設定します。このテキストは、提供する質問に対する回答を検索するために使用されます。
モデル API¶
このデモでは、Python* モデル API のモデルラッパー、アダプター、パイプラインを利用します。
統一された結果表現を備えたラッパーの汎用インターフェイスは、1 つのデモで複数の異なる質問応答モデルトポロジーのサポートを提供します。
実行の準備¶
デモでサポートされるモデルリストは、<omz_dir>/demos/bert_question_answering_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-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-int8-0002
これらの “小さな” バリアントは、いわゆる “蒸留” モデルであり、BERT Large を起源としていますが、小さなバリアントは大幅に高速です。Open Model Zoo の蒸留されたモデルではなく、公式の MLPerf* BERT ONNX モデルを使用する場合、int8 モデルを変換するコマンドラインは次のとおりです。
python3 mo.py
-m <path_to_model>/bert_large_v1_1_fake_quant.onnx
--input "input_ids,attention_mask,token_type_ids"
--input_shape "[1,384],[1,384],[1,384]"
--keep_shape_ops
注: 各種デバイス向けのモデル推論サポートの詳細については、インテルの事前トレーニング・モデルのデバイスサポートとパブリックの事前トレーニング・モデルのデバイスサポートの表を参照してください。
実行¶
-h
オプションを指定してアプリケーションを実行すると、使用方法が表示されます。
usage: bert_question_answering_demo.py [-h] -v VOCAB -m MODEL -i INPUT
[--adapter {openvino,ovms}]
[--questions QUESTION [QUESTION ...]]
[--input_names INPUT_NAMES]
[--output_names OUTPUT_NAMES]
[--model_squad_ver MODEL_SQUAD_VER]
[-q MAX_QUESTION_TOKEN_NUM]
[-a MAX_ANSWER_TOKEN_NUM] [-d DEVICE]
[-r] [-c]
Options:
-h, --help Show this help message and exit.
-v VOCAB, --vocab VOCAB
Required. Path to the vocabulary file with tokens
-m MODEL, --model MODEL
Required. Path to an .xml file with a trained model or
address of model inference service if using OVMS adapter.
-i INPUT, --input INPUT
Required. URL to a page with context
--adapter {openvino,ovms}
Optional. Specify the model adapter. Default is
openvino.
--questions QUESTION [QUESTION ...]
Optional. Prepared questions
--input_names INPUT_NAMES
Optional. Inputs names for the network. Default values
are "input_ids,attention_mask,token_type_ids"
--output_names OUTPUT_NAMES
Optional. Outputs names for the network. Default
values are "output_s,output_e"
--model_squad_ver MODEL_SQUAD_VER
Optional. SQUAD version used for model fine tuning
-q MAX_QUESTION_TOKEN_NUM, --max_question_token_num MAX_QUESTION_TOKEN_NUM
Optional. Maximum number of tokens in question
-a MAX_ANSWER_TOKEN_NUM, --max_answer_token_num MAX_ANSWER_TOKEN_NUM
Optional. Maximum number of tokens in answer
-d DEVICE, --device DEVICE
Optional. Target device to perform inference
on.Default value is CPU
-r, --reshape Optional. Auto reshape sequence length to the input
context + max question len (to improve the speed)
-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_demo.py
--vocab=<models_dir>/models/intel/bert-small-uncased-whole-word-masking-squad-0001/vocab.txt
--model=<path_to_model>/bert-small-uncased-whole-word-masking-squad-0001.xml
--input_names="input_ids,attention_mask,token_type_ids"
--output_names="output_s,output_e"
--input="https://en.wikipedia.org/wiki/Bert_(Sesame_Street)"
-c
デモでは、バートのキャラクターに関する Wiki ページを使用して、 “バートは誰ですか”、“バートは何歳ですか” などの質問に答えます。
OpenVINO モデルサーバーの実行¶
OpenVINO モデルサーバーで提供されるモデルを使用してデモを実行することもできます。OVMS を使用したデモの実行については、OVMSAdapter
を参照してください。
コマンド例:
python3 bert_question_answering_demo.py
--vocab=<models_dir>/models/intel/bert-small-uncased-whole-word-masking-squad-0001/vocab.txt
--model=localhost:9000/models/bert
--input_names="input_ids,attention_mask,token_type_ids"
--output_names="output_s,output_e"
--input="https://en.wikipedia.org/wiki/Bert_(Sesame_Street)"
--adapter ovms
-c
デモの入力¶
アプリケーションは、指定された URL にある HTML ページからテキストを読み取り、コンソールからの質問に答えます。モデルとそのパラメーター (入力と出力) も重要なデモ引数です。モデルの入力順序は重要であるため、デモスクリプトはコマンドラインで指定された入力が実際のネットワーク入力と一致するかチェックすることに注意してください。再形成オプション (-r
) が指定されている場合、スクリプトは、結果の値がネットワークが作成した元のシーケンス長より小さい場合、コンテキストの長さと質問の長さ (両方ともトークン) を加えた長さにネットワークを再形成しようとします。これは、パフォーマンス (速度) とメモリー使用量を節約するオプションです。一部のネットワークは再形成不可能であるため (内部レイヤーの制限により)、再形成が失敗する可能性があり、再形成なしでデモを実行する必要があります。一般的な 再形成の概要と制限事項を参照してください。
デモの出力¶
アプリケーションは、回答を同じコンソールに出力します。
アプリケーションのレポート
レイテンシー: 入力データの処理に必要な合計処理時間 (語彙のロード、トークンとしてのコンテキストの処理から結果の表示まで)。
長文テキストを含む文書の分類¶
元の “コンテキスト” (URL からのテキスト) と質問がモデル入力 (通常、Bert-Large の場合は 384 トークン、Bert-Base の場合は 128 トークン) に適合しない場合、デモではコンテキストが重複するセグメントに分割されることに注意してください。したがって、長いテキストではネットワークは複数回呼び出されます。次に、結果が確率に従って並べ替えられます。