TensorFlow Lite Model Maker를 사용한 BERT 질문 답변

TensorFlow.org에서보기 Google Colab에서 실행 GitHub에서 소스보기 노트북 다운로드

TensorFlow Lite Model Maker 라이브러리 는 기기 내 ML 애플리케이션 용으로이 모델을 배포 할 때 TensorFlow 모델을 특정 입력 데이터로 조정하고 변환하는 프로세스를 단순화합니다.

이 노트북은 Model Maker 라이브러리를 활용하여 질문 답변 작업에 일반적으로 사용되는 질문 답변 모델의 적응 및 변환을 설명하는 종단 간 예제를 보여줍니다.

BERT 질문 답변 작업 소개

이 라이브러리에서 지원하는 작업은 추출 질문 답변 작업입니다. 즉, 구절과 질문이 주어지면 답은 구절의 범위입니다. 아래 이미지는 질문 답변의 예를 보여줍니다.

답변은 구절의 범위입니다 (이미지 크레딧 : SQuAD 블로그 )

질문 답변 과제 모델의 경우 입력은 이미 전처리 된 구절과 질문 쌍이어야하며 출력은 구절의 각 토큰에 대한 시작 로짓과 끝 로짓이어야합니다. 문장의 길이와 질문에 따라 입력 크기를 설정하고 조정할 수 있습니다.

종단 간 개요

다음 코드 스 니펫은 몇 줄의 코드로 모델을 가져 오는 방법을 보여줍니다. 전체 프로세스에는 (1) 모델 선택, (2) 데이터로드, (3) 모델 재교육, (4) 평가, (5) TensorFlow Lite 형식으로 내보내기의 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 리포지토리 의 Model Maker 패키지를 포함하여 필요한 패키지를 설치합니다.

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)

"End-to-End 개요"는 간단한 end-to-end 예제를 보여줍니다. 다음 섹션에서는 자세한 내용을 보여주기 위해 예제를 단계별로 안내합니다.

질문 답변의 모델을 나타내는 model_spec을 선택하십시오.

model_spec 객체는 질문 답변에 대한 특정 모델을 나타냅니다. Model Maker는 현재 MobileBERT 및 BERT-Base 모델을 지원합니다.

지원 모델 model_spec의 이름 모델 설명
MobileBERT 'mobilebert_qa' BERT-Base보다 4.3 배 더 작고 5.5 배 더 빠르면서도 온 디바이스 시나리오에 적합한 경쟁력있는 결과를 달성합니다.
MobileBERT-SQuAD 'mobilebert_qa_squad' MobileBERT 모델과 동일한 모델 아키텍처 및 초기 모델은 이미 SQuAD1.1에서학습되었습니다 .
BERT 기반 'bert_qa' NLP 작업에서 널리 사용되는 표준 BERT 모델.

이 자습서에서는 MobileBERT-SQuAD를 예로 사용합니다. 모델이 이미 SQuAD1.1 에서 재 학습되었으므로 질문 답변 작업을 더 빨리 처리 할 수 ​​있습니다.

spec = model_spec.get('mobilebert_qa_squad')

온 디바이스 ML 앱과 관련된 입력 데이터로드 및 데이터 사전 처리

TriviaQA650K 이상의 질문-답변-증거 트리플을 포함하는 독해 데이터 세트입니다. 이 자습서에서는이 데이터 세트의 하위 집합을 사용하여 Model Maker 라이브러리를 사용하는 방법을 알아 봅니다.

데이터를로드하려면 --sample_size=8000web 데이터 세트를 사용하여 변환기 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. 질문 답변 모델을 훈련시킵니다. 기본 epochs 및 기본 배치 크기는 model_spec 객체의 두 변수 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}

TensorFlow Lite 모델로 내보내기

나중에 온 디바이스 ML 애플리케이션에서 사용할 수 있도록 학습 된 모델을 메타 데이터 가 포함 된 TensorFlow Lite 모델 형식으로 변환합니다. vocab 파일은 메타 데이터에 포함됩니다. 기본 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

당신은에서 TensorFlow 라이트 모델 파일을 사용할 수 있습니다 bert_qa의 사용 참조 응용 프로그램 BertQuestionAnswerer API를TensorFlow 라이트 태스크 라이브러리를 Colab의 왼쪽 사이드 바에서 다운로드.

허용되는 내보내기 형식은 다음 중 하나 또는 목록 일 수 있습니다.

기본적으로 메타 데이터와 함께 TensorFlow Lite 모델 만 내 보냅니다. 다른 파일을 선택적으로 내보낼 수도 있습니다. 예를 들어 다음과 같이 vocab 파일 만 내 보냅니다.

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 모델의 두 가지 모델이 있습니다. create 기능은 다음 단계로 구성됩니다.

  1. model_spec 에 따라 질문 답변 모델을 생성합니다.
  2. 질문 답변 모델을 훈련시킵니다.

이 섹션에서는 모델 조정, 훈련 하이퍼 파라미터 조정 등을 포함한 몇 가지 고급 주제를 설명합니다.

모델 조정

BertQASpec 클래스의 매개 변수 seq_lenquery_len 과 같은 모델 인프라를 조정할 수 있습니다.

모델에 대한 조정 가능한 매개 변수 :

  • seq_len : 모델에 공급할 통로의 길이.
  • query_len : 모델에 제공 할 질문의 길이입니다.
  • doc_stride : 문서 청크를 가져 오기 위해 슬라이딩 윈도우 방식을 수행 할 때의 보폭입니다.
  • initializer_range : 모든 가중치 행렬을 초기화하기위한 truncated_normal_initializer의 표준 편차.
  • trainable : 사전 훈련 된 레이어가 훈련 가능한지 여부를 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

나머지 단계는 동일합니다. 모델 사양에 따라 사전 처리 단계가 다를 수 있으므로 데이터 dataloader 모두 다시 실행하고 부품을 create 합니다.

훈련 초 매개 변수 조정

모델 성능에 영향을 미치도록 epochsbatch_size 와 같은 훈련 하이퍼 파라미터를 조정할 수도 있습니다. 예를 들어

  • epochs : 더 많은 epoch는 더 나은 성능을 얻을 수 있지만 과적 합으로 이어질 수 있습니다.
  • batch_size : 한 학습 단계에서 사용할 샘플 수.

예를 들어 다음과 같이 더 많은 에포크와 더 큰 배치 크기로 훈련 할 수 있습니다.

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

모델 아키텍처 변경

model_spec 을 변경하여 데이터 model_spec 의 기본 모델을 변경할 수 있습니다. 예를 들어 BERT-Base 모델로 변경하려면 다음을 실행하십시오.

spec = model_spec.get('bert_qa')

나머지 단계는 동일합니다.

TensorFlow Lite 모델에서 학습 후 양자화 사용자 지정

훈련 후 양자화 는 모델 크기와 추론 지연 시간을 줄이는 동시에 모델 정확도를 약간 저하시키면서 CPU 및 하드웨어 가속기 추론 속도를 개선 할 수있는 변환 기술입니다. 따라서 모델을 최적화하는 데 널리 사용됩니다.

Model Maker 라이브러리는 모델을 내보낼 때 기본 학습 후 양자화 기술을 적용합니다. 학습 후 양자화를 사용자 지정하려는 경우 Model Maker는 QuantizationConfig 를 사용하여 여러 학습 후 양자화 옵션을 지원합니다. float16 양자화를 인스턴스로 보겠습니다. 먼저 양자화 구성을 정의합니다.

config = QuantizationConfig.for_float16()

그런 다음 이러한 구성으로 TensorFlow Lite 모델을 내 보냅니다.

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

더 읽어보기

BERT 질문 및 답변 예제를 읽고 기술적 세부 사항을 배울 수 있습니다. 자세한 내용은 다음을 참조하십시오.