¡El Día de la Comunidad de ML es el 9 de noviembre! Únase a nosotros para recibir actualizaciones de TensorFlow, JAX, y más Más información

Respuesta a la pregunta BERT con TensorFlow Lite Model Maker

Ver en TensorFlow.org Ejecutar en Google Colab Ver fuente en GitHub Descargar cuaderno

La biblioteca fabricante TensorFlow Lite modelo simplifica el proceso de adaptación y la conversión de un modelo de datos de entrada TensorFlow particulares al implementar este modelo para aplicaciones de LD en el dispositivo.

Este cuaderno muestra un ejemplo de un extremo a otro que utiliza la biblioteca Model Maker para ilustrar la adaptación y conversión de un modelo de preguntas y respuestas de uso común para la tarea de preguntas y respuestas.

Introducción a la tarea de respuesta a preguntas de BERT

La tarea admitida en esta biblioteca es la tarea de respuesta de pregunta extractiva, lo que significa que, dado un pasaje y una pregunta, la respuesta es el intervalo del pasaje. La siguiente imagen muestra un ejemplo de respuesta a una pregunta.

Las respuestas son vanos en el paso (Crédito de la imagen: el blog SquaD )

En cuanto al modelo de tarea de preguntas y respuestas, las entradas deben ser el par de pasajes y preguntas que ya están preprocesados, las salidas deben ser los logits de inicio y los logits finales para cada ficha en el pasaje. El tamaño de la entrada se puede establecer y ajustar de acuerdo con la longitud del pasaje y la pregunta.

Descripción general de un extremo a otro

El siguiente fragmento de código demuestra cómo obtener el modelo en unas pocas líneas de código. El proceso general incluye 5 pasos: (1) elegir un modelo, (2) cargar datos, (3) volver a entrenar el modelo, (4) evaluar y (5) exportarlo al formato 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)

Las siguientes secciones explican el código con más detalle.

Prerrequisitos

Para ejecutar este ejemplo, instalar los paquetes necesarios, incluyendo el paquete de fabricante Modelo de la cesión temporal de GitHub .

pip install -q tflite-model-maker

Importe los paquetes necesarios.

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:168: UserWarning: Insufficiently recent colorama version found. Numba requires colorama >= 0.3.9
  warnings.warn(msg)

La "Descripción general de un extremo a otro" muestra un ejemplo simple de un extremo a otro. Las siguientes secciones recorren el ejemplo paso a paso para mostrar más detalles.

Elija una especificación_de_modelo que represente un modelo para la respuesta a la pregunta

Cada model_spec objeto representa un modelo específico para la pregunta respuesta. El Model Maker actualmente es compatible con los modelos MobileBERT y BERT-Base.

Modelo admitido Nombre de model_spec descripcion del modelo
MobileBERT 'mobilebert_qa' 4,3 veces más pequeño y 5,5 veces más rápido que BERT-Base al tiempo que logra resultados competitivos, adecuados para el escenario en el dispositivo.
MobileBERT-SQuAD 'mobilebert_qa_squad' Modelo de arquitectura del mismo como modelo MobileBERT y el modelo inicial ya está re-entrenado en SQuAD1.1 .
Base BERT 'bert_qa' Modelo BERT estándar que se usa ampliamente en tareas de PNL.

En este tutorial, MobileBERT-Squad se utiliza como un ejemplo. Dado que el modelo ya está re-entrenado en SQuAD1.1 , podría cobertura más rápido para la tarea responda a la pregunta.

spec = model_spec.get('mobilebert_qa_squad')

Cargar datos de entrada específicos para una aplicación de aprendizaje automático en el dispositivo y preprocesar los datos

El TriviaQA es un conjunto de datos de comprensión de lectura que contiene más de 650K de preguntas y respuestas en la evidencia triples. En este tutorial, usará un subconjunto de este conjunto de datos para aprender a usar la biblioteca Model Maker.

Para cargar los datos, convertir el conjunto de datos TriviaQA a la SQuAD1.1 formato mediante la ejecución del script en Python convertidor con --sample_size=8000 y un conjunto de web de datos. Modifique un poco el código de conversión de la siguiente manera:

  • Omitir las muestras que no pudieron encontrar ninguna respuesta en el documento de contexto;
  • Obtener la respuesta original en el contexto sin mayúsculas ni minúsculas.

Descargue la versión archivada del conjunto de datos ya convertido.

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

También puede entrenar el modelo MobileBERT con su propio conjunto de datos. Si está ejecutando este cuaderno en Colab, cargue sus datos usando la barra lateral izquierda.

Subir archivo

Si usted prefiere no cargar los datos en la nube, también puede ejecutar la biblioteca fuera de línea, siguiendo la guía .

Utilice la DataLoader.from_squad método para la carga y preprocesar los formato SquaD datos de acuerdo con una específica model_spec . Puede utilizar los formatos SQuAD2.0 o SQuAD1.1. Configuración de parámetros version_2_with_negative como True medios formatos es SQuAD2.0. De lo contrario, el formato es SQuAD1.1. Por defecto, version_2_with_negative es 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)

Personaliza el modelo de TensorFlow

Cree un modelo de respuesta a preguntas personalizado basado en los datos cargados. El create función comprende las siguientes etapas:

  1. Crea el modelo para la respuesta a la pregunta de acuerdo model_spec .
  2. Entrene el modelo de preguntas y respuestas. Las épocas por defecto y el tamaño de lote predeterminado se establecen de acuerdo a dos variables default_training_epochs y default_batch_size en la model_spec objeto.
model = question_answer.create(train_data, model_spec=spec)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
Epoch 1/2
1067/1067 [==============================] - 437s 355ms/step - loss: 1.1362 - start_positions_loss: 1.1342 - end_positions_loss: 1.1383
Epoch 2/2
1067/1067 [==============================] - 379s 356ms/step - loss: 0.7966 - start_positions_loss: 0.7960 - end_positions_loss: 0.7972

Eche un vistazo a la estructura detallada del modelo.

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
__________________________________________________________________________________________________

Evaluar el modelo personalizado

Evaluar el modelo de los datos de validación y obtener un diccionario de métricas incluyendo f1 puntuación y exact match etc. Nota que las métricas son diferentes para SQuAD1.1 y 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.6667049503784198}

Exportar al modelo de TensorFlow Lite

Convertir el modelo entrenado a formato modelo TensorFlow Lite con metadatos para que pueda utilizar más tarde en una aplicación ML en el dispositivo. El archivo de vocabulario está incrustado en metadatos. El nombre de archivo por defecto es TFLite model.tflite .

En muchas aplicaciones de aprendizaje automático en el dispositivo, el tamaño del modelo es un factor importante. Por lo tanto, se recomienda que aplique cuantificar el modelo para hacerlo más pequeño y potencialmente ejecutar más rápido. La técnica de cuantificación posterior al entrenamiento predeterminada es la cuantificación de rango dinámico para los modelos BERT y MobileBERT.

model.export(export_dir='.')
2021-10-07 12:41:10.132862: 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/tmpzybtllbn/saved_model/assets
INFO:tensorflow:Assets written to: /tmp/tmpzybtllbn/saved_model/assets
2021-10-07 12:41:44.160789: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-10-07 12:41:44.160834: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-10-07 12:41:44.160841: 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/tmpy1s7ymqv/vocab.txt.
INFO:tensorflow:Saved vocabulary in /tmp/tmpy1s7ymqv/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

Puede utilizar el archivo de modelo TensorFlow Lite en el bert_qa aplicación de referencia utilizando la API BertQuestionAnswerer en TensorFlow Biblioteca de tareas Lite descargándolo de la barra lateral izquierda de Colab.

Los formatos de exportación permitidos pueden ser uno o una lista de los siguientes:

De forma predeterminada, solo exporta el modelo de TensorFlow Lite con metadatos. También puede exportar diferentes archivos de forma selectiva. Por ejemplo, exportar solo el archivo de vocabulario de la siguiente manera:

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

También se puede evaluar el modelo tflite con el evaluate_tflite método. Se espera que este paso lleve mucho tiempo.

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

Uso avanzado

El create función es la parte crítica de esta biblioteca en la que el model_spec parámetro define la especificación del modelo. El BertQASpec clase es compatible actualmente. Hay 2 modelos: modelo MobileBERT, modelo BERT-Base. El create función comprende las siguientes etapas:

  1. Crea el modelo para la respuesta a la pregunta de acuerdo model_spec .
  2. Entrene el modelo de preguntas y respuestas.

Esta sección describe varios temas avanzados, incluido el ajuste del modelo, el ajuste de los hiperparámetros de entrenamiento, etc.

Ajustar el modelo

Se puede ajustar la infraestructura de modelo como parámetros seq_len y query_len en el BertQASpec clase.

Parámetros ajustables para modelo:

  • seq_len : longitud del paso a la alimentación en el modelo.
  • query_len : Longitud de la cuestión de la alimentación en el modelo.
  • doc_stride : La zancada cuando se hace un enfoque de ventana deslizante para tomar trozos de los documentos.
  • initializer_range : El DESVEST de la truncated_normal_initializer para inicializar todas las matrices de peso.
  • trainable : Boolean, si la capa de pre-entrenado es entrenable.

Parámetros ajustables para la canalización de entrenamiento:

  • model_dir : La ubicación de los archivos de modelo de punto de control. Si no se establece, se utilizará el directorio temporal.
  • dropout_rate : La tasa de deserción.
  • learning_rate : La tasa de aprendizaje inicial de Adán.
  • predict_batch_size : Tamaño del lote para la predicción.
  • tpu : la dirección de TPU para conectarse a. Solo se usa si se usa tpu.

Por ejemplo, puede entrenar el modelo con una secuencia de mayor longitud. Si cambia el modelo, debe construir primero un nuevo model_spec .

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

Los pasos restantes son los mismos. Tenga en cuenta que debe volver a ejecutar tanto el dataloader y create piezas tan diferentes especificaciones de modelo pueden tener diferentes pasos de preprocesamiento.

Ajustar los hiperparámetros de entrenamiento

También puede sintonizar los hiperparámetros formación como epochs y batch_size para impactar el rendimiento del modelo. Por ejemplo,

  • epochs : más épocas podrían lograr un mejor rendimiento, pero pueden dar lugar a un ajuste por exceso.
  • batch_size : número de muestras a utilizar en un solo paso de formación.

Por ejemplo, puede entrenar con más épocas y con un tamaño de lote más grande como:

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

Cambiar la arquitectura del modelo

Se puede cambiar el modelo de base de datos en sus trenes cambiando el model_spec . Por ejemplo, para cambiar al modelo BERT-Base, ejecute:

spec = model_spec.get('bert_qa')

Los pasos restantes son los mismos.

Personalice la cuantificación posterior al entrenamiento en el modelo TensorFlow Lite

Después de la formación de cuantificación es una técnica de conversión que puede reducir el tamaño del modelo y la latencia de la inferencia, además de mejorar la velocidad de la CPU y el acelerador de hardware inferencia, con un poco de degradación en la precisión del modelo. Por lo tanto, se usa ampliamente para optimizar el modelo.

La biblioteca Model Maker aplica una técnica de cuantificación posterior al entrenamiento predeterminada al exportar el modelo. Si desea personalizar la cuantificación posterior al entrenamiento, Modelo Maker soporta múltiples opciones después de la formación de cuantificación utilizando QuantizationConfig también. Tomemos como ejemplo la cuantificación de float16. Primero, defina la configuración de cuantificación.

config = QuantizationConfig.for_float16()

Luego exportamos el modelo de TensorFlow Lite con dicha configuración.

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

Lee mas

Usted puede leer nuestra BERT Preguntas y Respuestas ejemplo para aprender detalles técnicos. Para obtener más información, consulte: