TensorFlowLiteモデルメーカーを使用したBERTの質問への回答

TensorFlow.orgで表示 GoogleColabで実行 GitHubでソースを表示ノートブックをダウンロードする

TensorFlow Lite Model Makerライブラリは、デバイス上のMLアプリケーションにこのモデルをデプロイするときに、TensorFlowモデルを特定の入力データに適合および変換するプロセスを簡素化します。

このノートブックは、Model Makerライブラリを利用して、質問回答タスクで一般的に使用される質問回答モデルの適応と変換を説明するエンドツーエンドの例を示しています。

BERT質問回答タスクの概要

このライブラリでサポートされているタスクは、抽出的な質問回答タスクです。つまり、パッセージと質問が与えられた場合、回答はパッセージのスパンです。下の画像は、質問の回答の例を示しています。

答えはパッセージのスパンです(画像クレジット: SQuADブログ

質問回答タスクのモデルに関しては、入力はすでに前処理されたパッセージと質問のペアである必要があり、出力はパッセージ内の各トークンの開始ロジットと終了ロジットである必要があります。入力のサイズは、パッセージと質問の長さに応じて設定および調整できます。

エンドツーエンドの概要

次のコードスニペットは、数行のコード内でモデルを取得する方法を示しています。プロセス全体には、(1)モデルの選択、(2)データの読み込み、(3)モデルの再トレーニング、(4)評価、(5)TensorFlowLite形式へのエクスポートの5つのステップが含まれます。

# Chooses a model specification that represents the model.
spec = model_spec.get('mobilebert_qa')

# Gets the training data and validation data.
train_data = DataLoader.from_squad(train_data_path, spec, is_training=True)
validation_data = DataLoader.from_squad(validation_data_path, spec, is_training=False)

# Fine-tunes the model.
model = question_answer.create(train_data, model_spec=spec)

# Gets the evaluation result.
metric = model.evaluate(validation_data)

# Exports the model to the TensorFlow Lite format with metadata in the export directory.
model.export(export_dir)

次のセクションでは、コードについて詳しく説明します。

前提条件

この例を実行するには、 GitHubリポジトリのModelMakerパッケージを含む必要なパッケージをインストールします。

pip install -q tflite-model-maker

必要なパッケージをインポートします。

import numpy as np
import os

import tensorflow as tf
assert tf.__version__.startswith('2')

from tflite_model_maker import model_spec
from tflite_model_maker import question_answer
from tflite_model_maker.config import ExportFormat
from tflite_model_maker.question_answer import DataLoader
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/numba/core/errors.py:154: UserWarning: Insufficiently recent colorama version found. Numba requires colorama >= 0.3.9
  warnings.warn(msg)

「エンドツーエンドの概要」は、単純なエンドツーエンドの例を示しています。次のセクションでは、例を段階的に説明して、詳細を示します。

質問回答のモデルを表すmodel_specを選択します

model_specオブジェクトは、質問回答の特定のモデルを表します。モデルメーカーは現在、MobileBERTおよびBERT-Baseモデルをサポートしています。

サポートされているモデルmodel_specの名前モデルの説明
MobileBERT 'mobilebert_qa' BERT-Baseより4.3倍小さく、5.5倍高速でありながら、デバイス上のシナリオに適した競争力のある結果を達成します。
MobileBERT-SQuAD 'mobilebert_qa_squad' MobileBERTモデルと同じモデルアーキテクチャであり、初期モデルはすでにSQuAD1.1で再トレーニングされています
BERT-Base 'bert_qa' NLPタスクで広く使用されている標準のBERTモデル。

このチュートリアルでは、例としてMobileBERT-SQuADを使用します。モデルはすでにSQuAD1.1で再トレーニングされているため、質問回答タスクのカバレッジが速くなる可能性があります。

spec = model_spec.get('mobilebert_qa_squad')

オンデバイスMLアプリに固有の入力データを読み込み、データを前処理します

TriviaQAは、 65万を超える質問-回答-証拠のトリプルを含む読解データセットです。このチュートリアルでは、このデータセットのサブセットを使用して、ModelMakerライブラリの使用方法を学習します。

データをロードするには、 --sample_size=8000と一連のwebデータを--sample_size=8000コンバーターPythonスクリプトを実行し、TriviaQAデータセットをSQuAD1.1形式に変換します。次の方法で変換コードを少し変更します。

  • コンテキストドキュメントで回答が見つからなかったサンプルをスキップします。
  • 大文字または小文字を使用せずに、コンテキストで元の回答を取得します。

すでに変換されたデータセットのアーカイブバージョンをダウンロードします。

train_data_path = tf.keras.utils.get_file(
    fname='triviaqa-web-train-8000.json',
    origin='https://storage.googleapis.com/download.tensorflow.org/models/tflite/dataset/triviaqa-web-train-8000.json')
validation_data_path = tf.keras.utils.get_file(
    fname='triviaqa-verified-web-dev.json',
    origin='https://storage.googleapis.com/download.tensorflow.org/models/tflite/dataset/triviaqa-verified-web-dev.json')
Downloading data from https://storage.googleapis.com/download.tensorflow.org/models/tflite/dataset/triviaqa-web-train-8000.json
32571392/32570663 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/download.tensorflow.org/models/tflite/dataset/triviaqa-verified-web-dev.json
1171456/1167744 [==============================] - 0s 0us/step

独自のデータセットを使用してMobileBERTモデルをトレーニングすることもできます。このノートブックをColabで実行している場合は、左側のサイドバーを使用してデータをアップロードします。

ファイルをアップロードする

データをクラウドにアップロードしたくない場合は、 ガイドに従ってライブラリをオフラインで実行することもできます。

DataLoader.from_squadメソッドを使用して、特定のmodel_specに従ってSQuAD形式のデータをロードして前処理します。 SQuAD2.0またはSQuAD1.1形式のいずれかを使用できます。パラメータversion_2_with_negativeTrue設定すると、フォーマットがSQuAD2.0であることを意味します。それ以外の場合、形式はSQuAD1.1です。デフォルトでは、 version_2_with_negativeFalseです。

train_data = DataLoader.from_squad(train_data_path, spec, is_training=True)
validation_data = DataLoader.from_squad(validation_data_path, spec, is_training=False)
WARNING:tensorflow:AutoGraph could not transform <bound method BertQAModelSpec.select_data_from_record of <tensorflow_examples.lite.model_maker.core.task.model_spec.text_spec.BertQAModelSpec object at 0x7fa805d96490>> and will run it as-is.
Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output.
Cause: '<' not supported between instances of 'str' and 'Literal'
To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
WARNING:tensorflow:AutoGraph could not transform <bound method BertQAModelSpec.select_data_from_record of <tensorflow_examples.lite.model_maker.core.task.model_spec.text_spec.BertQAModelSpec object at 0x7fa805d96490>> and will run it as-is.
Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output.
Cause: '<' not supported between instances of 'str' and 'Literal'
To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
WARNING: AutoGraph could not transform <bound method BertQAModelSpec.select_data_from_record of <tensorflow_examples.lite.model_maker.core.task.model_spec.text_spec.BertQAModelSpec object at 0x7fa805d96490>> and will run it as-is.
Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output.
Cause: '<' not supported between instances of 'str' and 'Literal'
To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert

TensorFlowモデルをカスタマイズする

ロードされたデータに基づいてカスタムの質問回答モデルを作成します。 create機能は、次のステップで構成されています。

  1. model_specに従って、質問回答のモデルを作成します。
  2. 質問回答モデルをトレーニングします。デフォルトのエポックとデフォルトのバッチサイズは、 model_specオブジェクトの2つの変数default_training_epochsdefault_batch_sizeに従って設定されます。
model = question_answer.create(train_data, model_spec=spec)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
Epoch 1/2
1067/1067 [==============================] - 417s 346ms/step - loss: 1.1342 - start_positions_loss: 1.1323 - end_positions_loss: 1.1362
Epoch 2/2
1067/1067 [==============================] - 372s 349ms/step - loss: 0.7927 - start_positions_loss: 0.7924 - end_positions_loss: 0.7929

詳細なモデル構造をご覧ください。

model.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_word_ids (InputLayer)     [(None, 384)]        0                                            
__________________________________________________________________________________________________
input_mask (InputLayer)         [(None, 384)]        0                                            
__________________________________________________________________________________________________
input_type_ids (InputLayer)     [(None, 384)]        0                                            
__________________________________________________________________________________________________
hub_keras_layer_v1v2 (HubKerasL {'start_logits': (No 24582914    input_word_ids[0][0]             
                                                                 input_mask[0][0]                 
                                                                 input_type_ids[0][0]             
__________________________________________________________________________________________________
start_positions (Lambda)        (None, None)         0           hub_keras_layer_v1v2[0][1]       
__________________________________________________________________________________________________
end_positions (Lambda)          (None, None)         0           hub_keras_layer_v1v2[0][0]       
==================================================================================================
Total params: 24,582,914
Trainable params: 24,582,914
Non-trainable params: 0
__________________________________________________________________________________________________

カスタマイズされたモデルを評価する

検証データでモデルを評価し、 f1スコアやexact matchなどのメトリックの辞書を取得します。メトリックはSQuAD1.1とSQuAD2.0で異なることに注意してください。

model.evaluate(validation_data)
INFO:tensorflow:Made predictions for 200 records.
INFO:tensorflow:Made predictions for 200 records.
INFO:tensorflow:Made predictions for 400 records.
INFO:tensorflow:Made predictions for 400 records.
INFO:tensorflow:Made predictions for 600 records.
INFO:tensorflow:Made predictions for 600 records.
INFO:tensorflow:Made predictions for 800 records.
INFO:tensorflow:Made predictions for 800 records.
INFO:tensorflow:Made predictions for 1000 records.
INFO:tensorflow:Made predictions for 1000 records.
INFO:tensorflow:Made predictions for 1200 records.
INFO:tensorflow:Made predictions for 1200 records.
{'exact_match': 0.5918367346938775, 'final_f1': 0.6600156079747915}

TensorFlowLiteモデルにエクスポート

トレーニング済みモデルをメタデータを含むTensorFlowLiteモデル形式に変換して、後でデバイス上のMLアプリケーションで使用できるようにします。語彙ファイルはメタデータに埋め込まれています。デフォルトのTFLiteファイル名はmodel.tfliteです。

多くのオンデバイスMLアプリケーションでは、モデルサイズが重要な要素です。したがって、モデルを小さくし、実行速度を上げる可能性があるように、クオンタイズを適用することをお勧めします。デフォルトのトレーニング後の量子化手法は、BERTおよびMobileBERTモデルのダイナミックレンジ量子化です。

model.export(export_dir='.')
INFO:tensorflow:Assets written to: /tmp/tmpomd8npav/saved_model/assets
INFO:tensorflow:Assets written to: /tmp/tmpomd8npav/saved_model/assets
INFO:tensorflow:Vocab file is inside the TFLite model with metadata.
INFO:tensorflow:Vocab file is inside the TFLite model with metadata.
INFO:tensorflow:Saved vocabulary in /tmp/tmpgyvj87ob/vocab.txt.
INFO:tensorflow:Saved vocabulary in /tmp/tmpgyvj87ob/vocab.txt.
INFO:tensorflow:Finished populating metadata and associated file to the model:
INFO:tensorflow:Finished populating metadata and associated file to the model:
INFO:tensorflow:./model.tflite
INFO:tensorflow:./model.tflite
INFO:tensorflow:The associated file that has been been packed to the model is:
INFO:tensorflow:The associated file that has been been packed to the model is:
INFO:tensorflow:['vocab.txt']
INFO:tensorflow:['vocab.txt']
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite

Colabの左側のサイドバーからダウンロードすることで、 TensorFlowLiteタスクライブラリのBertQuestionAnswererAPIを使用して、 bert_qaリファレンスアプリのTensorFlowLiteモデルファイルを使用できます

許可されるエクスポート形式は、次の1つまたはリストのいずれかです。

デフォルトでは、メタデータを使用してTensorFlowLiteモデルをエクスポートするだけです。異なるファイルを選択的にエクスポートすることもできます。たとえば、次のように語彙ファイルのみをエクスポートします。

model.export(export_dir='.', export_format=ExportFormat.VOCAB)
INFO:tensorflow:Saved vocabulary in ./vocab.txt.
INFO:tensorflow:Saved vocabulary in ./vocab.txt.

また、 evaluate_tfliteメソッドを使用してtfliteモデルを評価することもできます。このステップには長い時間がかかると予想されます。

model.evaluate_tflite('model.tflite', validation_data)
INFO:tensorflow:Made predictions for 100 records.
INFO:tensorflow:Made predictions for 100 records.
INFO:tensorflow:Made predictions for 200 records.
INFO:tensorflow:Made predictions for 200 records.
INFO:tensorflow:Made predictions for 300 records.
INFO:tensorflow:Made predictions for 300 records.
INFO:tensorflow:Made predictions for 400 records.
INFO:tensorflow:Made predictions for 400 records.
INFO:tensorflow:Made predictions for 500 records.
INFO:tensorflow:Made predictions for 500 records.
INFO:tensorflow:Made predictions for 600 records.
INFO:tensorflow:Made predictions for 600 records.
INFO:tensorflow:Made predictions for 700 records.
INFO:tensorflow:Made predictions for 700 records.
INFO:tensorflow:Made predictions for 800 records.
INFO:tensorflow:Made predictions for 800 records.
INFO:tensorflow:Made predictions for 900 records.
INFO:tensorflow:Made predictions for 900 records.
INFO:tensorflow:Made predictions for 1000 records.
INFO:tensorflow:Made predictions for 1000 records.
INFO:tensorflow:Made predictions for 1100 records.
INFO:tensorflow:Made predictions for 1100 records.
INFO:tensorflow:Made predictions for 1200 records.
INFO:tensorflow:Made predictions for 1200 records.
{'exact_match': 0.5884353741496599, 'final_f1': 0.6606958800836351}

高度な使用法

create関数は、 model_specパラメーターがモデル仕様を定義するこのライブラリの重要な部分です。 BertQASpecクラスは現在サポートされています。 MobileBERTモデルとBERT-Baseモデルの2つのモデルがあります。 create機能は、次のステップで構成されています。

  1. model_specに従って、質問回答のモデルを作成します。
  2. 質問回答モデルをトレーニングします。

このセクションでは、モデルの調整、トレーニングハイパーパラメータの調整など、いくつかの高度なトピックについて説明します。

モデルを調整する

BertQASpecクラスのパラメーターseq_lenquery_lenなどのモデルインフラストラクチャを調整できます。

モデルの調整可能なパラメーター:

  • seq_len :モデルにフィードする通路の長さ。
  • query_len :モデルに入力する質問の長さ。
  • doc_stride :ドキュメントのチャンクを取得するためにスライディングウィンドウアプローチを実行するときのストライド。
  • initializer_range :すべての重み行列を初期化するためのtruncated_normal_initializerの標準偏差。
  • trainable :ブール値。事前にトレーニングされたレイヤーがトレーニング可能かどうか。

トレーニングパイプラインの調整可能なパラメーター:

  • model_dir :モデルチェックポイントファイルの場所。設定されていない場合、一時ディレクトリが使用されます。
  • dropout_rate :ドロップアウトのレート。
  • learning_rate :Adamの初期学習率。
  • predict_batch_size :予測のバッチサイズ。
  • tpu :接続するTPUアドレス。 tpuを使用する場合にのみ使用されます。

たとえば、より長いシーケンス長でモデルをトレーニングできます。モデルを変更する場合は、最初に新しいmodel_spec作成する必要があります。

new_spec = model_spec.get('mobilebert_qa')
new_spec.seq_len = 512

残りの手順は同じです。モデル仕様が異なれば前処理ステップも異なる可能性があるcreate 、データdataloaderとパーツの両方を再実行する必要があることに注意してください。

トレーニングハイパーパラメータを調整する

epochsbatch_sizeなどのトレーニングハイパーパラメータを調整して、モデルのパフォーマンスに影響を与えることもできます。例えば、

  • epochs :エポックが多いほどパフォーマンスが向上する可能性がありますが、過剰適合につながる可能性があります。
  • batch_size :1つのトレーニングステップで使用するサンプルの数。

たとえば、次のように、より多くのエポックとより大きなバッチサイズでトレーニングできます。

model = question_answer.create(train_data, model_spec=spec, epochs=5, batch_size=64)

モデルアーキテクチャを変更する

model_spec変更することで、データトレインの基本モデルを変更できます。たとえば、BERT-Baseモデルに変更するには、次のコマンドを実行します。

spec = model_spec.get('bert_qa')

残りの手順は同じです。

TensorFlowLiteモデルでトレーニング後の量子化をカスタマイズする

トレーニング後の量子化は、モデルの精度を少し低下させながら、CPUとハードウェアアクセラレータの推論速度を向上させながら、モデルのサイズと推論の待ち時間を短縮できる変換手法です。したがって、モデルを最適化するために広く使用されています。

モデルメーカーライブラリは、モデルをエクスポートするときに、デフォルトのトレーニング後の量子化手法を適用します。トレーニング後の量子化をカスタマイズする場合、Model Makerは、 QuantizationConfigを使用した複数のトレーニング後の量子化オプションもサポートしています。たとえば、float16量子化を取り上げましょう。まず、量子化構成を定義します。

config = QuantizationConfig.for_float16()

次に、そのような構成でTensorFlowLiteモデルをエクスポートします。

model.export(export_dir='.', tflite_filename='model_fp16.tflite', quantization_config=config)

続きを読む

BERTの質問と回答の例を読んで、技術的な詳細を学ぶことができます。詳細については、以下を参照してください。