Google I/O est terminé ! Suivez les sessions TensorFlow Afficher les sessions

Réponse à la question BERT avec le créateur de modèles TensorFlow Lite

Voir sur TensorFlow.org Exécuter dans Google Colab Voir la source sur GitHub Télécharger le cahier

La bibliothèque Maker Lite Model tensorflow simplifie le processus d'adaptation et la conversion d' un modèle tensorflow aux données d'entrée particulières lors du déploiement de ce modèle pour les applications sur périphérique ML.

Ce bloc-notes montre un exemple de bout en bout qui utilise la bibliothèque Model Maker pour illustrer l'adaptation et la conversion d'un modèle de question-réponse couramment utilisé pour la tâche de question-réponse.

Introduction à BERT Question Réponse Tâche

La tâche prise en charge dans cette bibliothèque est la tâche de réponse aux questions d'extraction, ce qui signifie qu'étant donné un passage et une question, la réponse est la durée du passage. L'image ci-dessous montre un exemple de réponse à une question.

Les réponses sont portées dans le passage (crédit image: Blog SQUAD )

En ce qui concerne le modèle de tâche de réponse aux questions, les entrées doivent être la paire de passage et de question qui sont déjà prétraitées, les sorties doivent être les logits de début et de fin pour chaque jeton du passage. La taille de l'entrée peut être définie et ajustée en fonction de la longueur du passage et de la question.

Présentation de bout en bout

L'extrait de code suivant montre comment obtenir le modèle en quelques lignes de code. Le processus global comprend 5 étapes : (1) choisir un modèle, (2) charger les données, (3) recycler le modèle, (4) évaluer et (5) l'exporter au format TensorFlow Lite.

# 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)

Les sections suivantes expliquent le code plus en détail.

Conditions préalables

Pour exécuter cet exemple, installer les paquets nécessaires, y compris le paquet Maker modèle du repo GitHub .

pip install -q tflite-model-maker

Importez les packages requis.

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/pkg_resources/__init__.py:119: PkgResourcesDeprecationWarning: 0.18ubuntu0.18.04.1 is an invalid version and will not be supported in a future release
  PkgResourcesDeprecationWarning,
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/numba/core/errors.py:168: UserWarning: Insufficiently recent colorama version found. Numba requires colorama >= 0.3.9
  warnings.warn(msg)

La « Aperçu de bout en bout » montre un exemple simple de bout en bout. Les sections suivantes parcourent l'exemple étape par étape pour montrer plus de détails.

Choisissez un model_spec qui représente un modèle pour la réponse à la question

Chaque model_spec objet représente un modèle spécifique pour répondre à la question. Le Model Maker prend actuellement en charge les modèles MobileBERT et BERT-Base.

Modèle pris en charge Nom de model_spec Description du modèle
MobileBERT 'mobilebert_qa' 4,3 fois plus petit et 5,5 fois plus rapide que BERT-Base tout en obtenant des résultats compétitifs, adaptés au scénario sur appareil.
MobileBERT-SQuAD 'mobilebert_qa_squad' Architecture Même modèle que le modèle MobileBERT et le modèle initial est déjà rafraîchies SQuAD1.1 .
BERT-Base 'bert_qa' Modèle BERT standard largement utilisé dans les tâches NLP.

Dans ce tutoriel, MobileBERT-SQUAD est utilisé comme un exemple. Étant donné que le modèle est déjà rafraîchies SQuAD1.1 , il pourrait la couverture plus rapide pour tâche de questions et réponses.

spec = model_spec.get('mobilebert_qa_squad')

Charger les données d'entrée spécifiques à une application ML sur l'appareil et prétraiter les données

Le TriviaQA est un ensemble de données de compréhension de lecture contenant plus de 650K triplets-preuves de questions-réponses. Dans ce didacticiel, vous utiliserez un sous-ensemble de cet ensemble de données pour apprendre à utiliser la bibliothèque Model Maker.

Pour charger les données, convertir l'ensemble de données TriviaQA au SQuAD1.1 format en exécutant le convertisseur script Python avec --sample_size=8000 et un ensemble de web données. Modifiez un peu le code de conversion en :

  • Ignorer les exemples qui n'ont trouvé aucune réponse dans le document contextuel ;
  • Obtenir la réponse originale dans le contexte sans majuscule ni minuscule.

Téléchargez la version archivée de l'ensemble de données déjà converti.

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
32579584/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
1179648/1167744 [==============================] - 0s 0us/step

Vous pouvez également entraîner le modèle MobileBERT avec votre propre ensemble de données. Si vous exécutez ce bloc-notes sur Colab, importez vos données à l'aide de la barre latérale gauche.

Téléverser un fichier

Si vous préférez ne pas télécharger vos données vers le cloud, vous pouvez également exécuter la bibliothèque en ligne en suivant le Guide .

Utilisez la DataLoader.from_squad méthode pour prétraiter la charge et les formats sQuad données selon l'une spécifique model_spec . Vous pouvez utiliser les formats SQuAD2.0 ou SQuAD1.1. Le réglage du paramètre version_2_with_negative comme True moyen des formats est SQuAD2.0. Sinon, le format est SQuAD1.1. Par défaut, version_2_with_negative est False .

train_data = DataLoader.from_squad(train_data_path, spec, is_training=True)
validation_data = DataLoader.from_squad(validation_data_path, spec, is_training=False)

Personnaliser le modèle TensorFlow

Créez un modèle de question-réponse personnalisé basé sur les données chargées. La create la fonction comprend les étapes suivantes:

  1. Crée le modèle de réponse question selon model_spec .
  2. Entraînez le modèle question-réponse. Les époques par défaut et la taille du lot par défaut sont définies en fonction de deux variables default_training_epochs et default_batch_size dans le model_spec objet.
model = question_answer.create(train_data, model_spec=spec)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
Epoch 1/2
1067/1067 [==============================] - 423s 350ms/step - loss: 1.1349 - start_positions_loss: 1.1323 - end_positions_loss: 1.1374
Epoch 2/2
1067/1067 [==============================] - 373s 350ms/step - loss: 0.7937 - start_positions_loss: 0.7928 - end_positions_loss: 0.7946

Jetez un œil à la structure détaillée du modèle.

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 {'end_logits': (None 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
__________________________________________________________________________________________________

Évaluer le modèle personnalisé

Évaluer le modèle sur les données de validation et d' obtenir un dict de mesures , y compris f1 score et exact match etc. Notez que les paramètres sont différents pour SQuAD1.1 et 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.6650690579262007}

Exporter vers le modèle TensorFlow Lite

Convertir le modèle formé à tensorflow format modèle Lite avec des métadonnées afin que vous pouvez ensuite utiliser dans une application ML sur l'appareil. Le fichier vocab est intégré dans les métadonnées. Le nom de fichier par défaut TFLite est model.tflite .

Dans de nombreuses applications ML sur l'appareil, la taille du modèle est un facteur important. Par conséquent, il est recommandé d'appliquer la quantification du modèle pour le rendre plus petit et potentiellement plus rapide. La technique de quantification post-entraînement par défaut est la quantification à plage dynamique pour les modèles BERT et MobileBERT.

model.export(export_dir='.')
2021-11-02 12:02:44.147451: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmpn2lze71h/saved_model/assets
INFO:tensorflow:Assets written to: /tmp/tmpn2lze71h/saved_model/assets
2021-11-02 12:03:15.381028: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-02 12:03:15.381073: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-11-02 12:03:15.381080: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
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/tmpz6v1li70/vocab.txt.
INFO:tensorflow:Saved vocabulary in /tmp/tmpz6v1li70/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

Vous pouvez utiliser le fichier modèle Lite tensorflow dans la bert_qa application de référence en utilisant l' API BertQuestionAnswerer dans tensorflow Lite bibliothèque de tâches en le téléchargeant à partir de la barre latérale de gauche sur Colab.

Les formats d'exportation autorisés peuvent être un ou une liste des suivants :

Par défaut, il exporte simplement le modèle TensorFlow Lite avec les métadonnées. Vous pouvez également exporter de manière sélective différents fichiers. Par exemple, exportez uniquement le fichier vocab comme suit :

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

Vous pouvez également évaluer le modèle tflite avec la evaluate_tflite méthode. Cette étape devrait prendre beaucoup de temps.

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.6645399573971004}

Utilisation avancée

La create fonction est la partie essentielle de cette bibliothèque dans laquelle le model_spec paramètre définit la spécification du modèle. La BertQASpec classe est actuellement pris en charge. Il existe 2 modèles : le modèle MobileBERT, le modèle BERT-Base. La create la fonction comprend les étapes suivantes:

  1. Crée le modèle de réponse question selon model_spec .
  2. Entraînez le modèle question-réponse.

Cette section décrit plusieurs sujets avancés, notamment l'ajustement du modèle, le réglage des hyperparamètres d'entraînement, etc.

Ajuster le modèle

Vous pouvez régler l'infrastructure de modèle comme paramètres seq_len et query_len dans la BertQASpec classe.

Paramètres réglables pour le modèle :

  • seq_len : longueur du passage d'alimentation dans le modèle.
  • query_len : Longueur de la question à l' alimentation dans le modèle.
  • doc_stride : La foulée lorsque vous faites une approche de fenêtre coulissante pour prendre des morceaux des documents.
  • initializer_range : Le stdev du truncated_normal_initializer pour initialiser toutes les matrices de poids.
  • trainable : booléen, si la couche de pré-formé est capable d'être formée.

Paramètres réglables pour le pipeline d'entraînement :

  • model_dir : L'emplacement des fichiers de point de contrôle du modèle. S'il n'est pas défini, le répertoire temporaire sera utilisé.
  • dropout_rate : Le taux de décrochage scolaire.
  • learning_rate : Le taux d'apprentissage initial pour Adam.
  • predict_batch_size : La taille des lots pour la prédiction.
  • tpu : Adresse TPU pour se connecter. Utilisé uniquement si vous utilisez tpu.

Par exemple, vous pouvez entraîner le modèle avec une longueur de séquence plus longue. Si vous changez le modèle, vous devez d' abord construire une nouvelle model_spec .

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

Les étapes restantes sont les mêmes. Notez que vous devez exécuter à nouveau à la fois la dataloader et create des pièces aussi différentes spécifications du modèle peuvent avoir différentes étapes de pré - traitement.

Ajuster les hyperparamètres d'entraînement

Vous pouvez également régler les hyperparamètres de formation comme epochs et batch_size d'influer sur la performance du modèle. Par exemple,

  • epochs : plus pourraient obtenir de meilleures époques performance, mais peut conduire à surapprentissage.
  • batch_size : nombre d'échantillons à utiliser dans une étape de formation.

Par exemple, vous pouvez vous entraîner avec plus d'époques et avec une plus grande taille de lot comme :

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

Modifier l'architecture du modèle

Vous pouvez modifier le modèle de base de vos trains de données par modification de la model_spec . Par exemple, pour passer au modèle BERT-Base, exécutez :

spec = model_spec.get('bert_qa')

Les étapes restantes sont les mêmes.

Personnaliser la quantification post-entraînement sur le modèle TensorFlow Lite

Quantification post-formation est une technique de conversion qui permet de réduire la taille du modèle et de la latence d'inférence, tout en améliorant la vitesse d'inférence du processeur et accélérateur matériel, avec une légère dégradation de la précision du modèle. Ainsi, il est largement utilisé pour optimiser le modèle.

La bibliothèque Model Maker applique une technique de quantification post-formation par défaut lors de l'exportation du modèle. Si vous souhaitez personnaliser la quantification post-formation, modèle Maker prend en charge plusieurs options de quantification post-formation en utilisant QuantizationConfig ainsi. Prenons comme exemple la quantification float16. Tout d'abord, définissez la configuration de quantification.

config = QuantizationConfig.for_float16()

Ensuite, nous exportons le modèle TensorFlow Lite avec une telle configuration.

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

Lire la suite

Vous pouvez lire notre BERT Questions et réponses exemple pour apprendre des détails techniques. Pour plus d'informations, veuillez vous référer à: