Google I/O'da TensorFlow'a katılın, 11-12 Mayıs Şimdi kaydolun

TensorFlow Lite Model Maker ile BERT Soru Yanıtı

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

TensorFlow Lite Modeli Üretici kütüphanesi uyarlama ve cihaz üzerinde ML uygulamaları için, bu model dağıtırken, özellikle veri girmek için TensorFlow modeli dönüştürme işlemini basitleştirir.

Bu not defteri, soru yanıt görevi için yaygın olarak kullanılan bir soru yanıt modelinin uyarlanmasını ve dönüştürülmesini göstermek için Model Oluşturucu kitaplığını kullanan uçtan uca bir örnek gösterir.

BERT Soru Cevap Görevine Giriş

Bu kitaplıkta desteklenen görev, bir pasaj ve bir soru verildiğinde, cevap pasajdaki yayılma anlamına gelen çıkarımsal soru cevap görevidir. Aşağıdaki resim soru cevabı için bir örnek göstermektedir.

Cevaplar (: Görüntü kredi pasajda açıklıklı olan Squad blog )

Soru cevap görevi modeline gelince, girdiler, önceden işlenmiş olan pasaj ve soru çifti olmalı, çıktılar, pasajdaki her bir belirteç için başlangıç ​​logitleri ve bitiş logitleri olmalıdır. Girdi boyutu, pasajın ve sorunun uzunluğuna göre ayarlanabilir ve ayarlanabilir.

Uçtan Uca Genel Bakış

Aşağıdaki kod parçacığı, modelin birkaç kod satırında nasıl alınacağını gösterir. Genel süreç 5 adımı içerir: (1) bir model seçin, (2) verileri yükleyin, (3) modeli yeniden eğitin, (4) değerlendirin ve (5) onu TensorFlow Lite formatına aktarın.

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

Aşağıdaki bölümler kodu daha ayrıntılı olarak açıklamaktadır.

Önkoşullar

Bu örneği çalıştırmak için, gelen Modeli Üretici paketine dahil gerekli paketleri yükleme GitHub repo .

pip install -q tflite-model-maker

Gerekli paketleri içe aktarın.

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)

"Uçtan Uca Genel Bakış", basit bir uçtan uca örnek gösterir. Aşağıdaki bölümler, daha fazla ayrıntı göstermek için örnekte adım adım ilerlemektedir.

Soru yanıtı için bir modeli temsil eden bir model_spec seçin

Her model_spec nesne soru cevap için belirli bir modeli temsil etmektedir. Model Oluşturucu şu anda MobileBERT ve BERT-Base modellerini desteklemektedir.

Desteklenen Model model_spec adı Model Açıklaması
MobilBERT 'mobilebert_qa' BERT-Base'den 4,3 kat daha küçük ve 5,5 kat daha hızlı, rekabetçi sonuçlar elde ederken, cihaz senaryosu için uygun.
MobileBERT-TAKIMI 'mobilebert_qa_squad' MobileBERT modeline ve başlangıç modeli olarak aynı model mimari zaten yeniden eğitildiği SQuAD1.1 .
BERT-Baz 'bert_qa' NLP görevlerinde yaygın olarak kullanılan standart BERT modeli.

Bu eğitimde, MobileBERT-ekip bir örnek olarak kullanılmıştır. Model zaten üzerine yeniden eğitildiği yana SQuAD1.1 , bu kapsama hızlı soru cevap görev için olabilir.

spec = model_spec.get('mobilebert_qa_squad')

Bir Cihaz ML Uygulamasına Özel Girdi Verilerini Yükleyin ve Verileri Önceden İşleyin

TriviaQA 650K soru-cevap-kanıt üçlüsü üzerinde içeren bir okuduğunu anlama veri kümesi olduğunu. Bu öğreticide, Model Maker kitaplığının nasıl kullanılacağını öğrenmek için bu veri kümesinin bir alt kümesini kullanacaksınız.

Verilerini yüklemek için şu adrese TriviaQA veri kümesi dönüştürmek SQuAD1.1 çalıştırarak formatında dönüştürücü Python komut ile --sample_size=8000 ve bir dizi web verilerinin. Dönüşüm kodunu şu şekilde biraz değiştirin:

  • Bağlam belgesinde cevap bulamayan örneklerin atlanması;
  • Orijinal cevabı büyük veya küçük harf olmadan bağlamda alma.

Halihazırda dönüştürülmüş veri kümesinin arşivlenmiş sürümünü indirin.

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

MobileBERT modelini kendi veri kümenizle de eğitebilirsiniz. Bu not defterini Colab üzerinde çalıştırıyorsanız, sol kenar çubuğunu kullanarak verilerinizi yükleyin.

Dosya yükleme

Eğer buluta veri yüklemek istemiyorsanız, ayrıca takip ederek kütüphane çevrimdışı çalışabilir kılavuzu .

Kullanım DataLoader.from_squad yüke yöntem ve önişlem SquaD biçimi belirli göre verileri model_spec . SQuAD2.0 veya SQuAD1.1 formatlarını kullanabilirsiniz. Parametreyi ayarlama version_2_with_negative olarak True araçlarla biçimleri SQuAD2.0 olduğunu. Aksi takdirde, biçim SQuAD1.1'dir. Varsayılan olarak, version_2_with_negative olduğunu 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)

TensorFlow Modelini Özelleştirin

Yüklenen verilere dayalı olarak özel bir soru yanıt modeli oluşturun. create fonksiyonu aşağıdaki aşamaları içermektedir:

  1. Göre soru cevap modelini oluşturur model_spec .
  2. Soru cevap modelini eğitin. Varsayılan dönemini ve varsayılan parti boyutu iki değişken göre ayarlanır default_training_epochs ve default_batch_size içinde model_spec nesne.
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

Ayrıntılı model yapısına bir göz atın.

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
__________________________________________________________________________________________________

Özelleştirilmiş Modeli Değerlendirin

Doğrulama verilerine modelini değerlendirmek ve dahil metriklerinin bir dicti olsun f1 puanı ve exact match ölçümlerini SQuAD1.1 ve SQuAD2.0 için farklı olduğunu vs. Not.

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}

TensorFlow Lite Modeline Aktar

İle TensorFlow Lite modeli biçimine eğitilmiş modeli dönüştürme meta veri daha sonra bir cihaz üzerinde ML uygulamasında kullanabilmesi. Kelime dosyası meta verilere gömülüdür. Varsayılan TFLite dosya adı model.tflite .

Birçok cihaz üstü ML uygulamasında model boyutu önemli bir faktördür. Bu nedenle, modeli daha küçük ve potansiyel olarak daha hızlı çalıştırmak için kuantize etmeniz önerilir. Varsayılan eğitim sonrası niceleme tekniği, BERT ve MobileBERT modelleri için dinamik aralık nicelemedir.

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

İçeri TensorFlow Lite modeli dosyasını kullanabilirsiniz bert_qa kullanarak referans app BertQuestionAnswerer API içinde TensorFlow Lite Görev Kütüphanesi CoLab sol kenar çubuğundan indirerek.

İzin verilen dışa aktarma biçimleri aşağıdakilerden biri veya bir listesi olabilir:

Varsayılan olarak, yalnızca TensorFlow Lite modelini meta verilerle dışa aktarır. Ayrıca farklı dosyaları seçerek dışa aktarabilirsiniz. Örneğin, yalnızca vocab dosyasını aşağıdaki gibi dışa aktarma:

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

Ayrıca ile tflite modeli değerlendirebilir evaluate_tflite yöntemiyle. Bu adımın uzun sürmesi bekleniyor.

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}

Gelişmiş Kullanım

create fonksiyonu olan bu kitaplığın kritik bir parçasıdır model_spec parametre modeli özelliklerini tanımlar. BertQASpec sınıfı şu anda desteklenmektedir. 2 model vardır: MobileBERT modeli, BERT-Base modeli. create fonksiyonu aşağıdaki aşamaları içermektedir:

  1. Göre soru cevap modelini oluşturur model_spec .
  2. Soru cevap modelini eğitin.

Bu bölüm, modelin ayarlanması, eğitim hiperparametrelerinin ayarlanması vb. dahil olmak üzere birkaç gelişmiş konuyu açıklamaktadır.

Modeli ayarlayın

Sen parametreleri gibi modeli altyapısını ayarlayabilirsiniz seq_len ve query_len içinde BertQASpec sınıfında.

Model için ayarlanabilir parametreler:

  • seq_len : modele beslemesine geçit uzunluğu.
  • query_len : modele beslemesine soru uzunluğu.
  • doc_stride : adım belgelerin parçalarını almak için sürgülü pencere yaklaşım yaparken.
  • initializer_range : truncated_normal_initializer STDEV'leri tüm ağırlık matrisleri başlatılıyor için.
  • trainable : Önceden eğitimli tabaka eğitilebilir olan Boole, ister.

Eğitim hattı için ayarlanabilir parametreler:

  • model_dir : Model kontrol noktası dosyalarının konumu. Ayarlanmazsa, geçici dizin kullanılacaktır.
  • dropout_rate : bırakma oranı.
  • learning_rate : Adam için ilk öğrenme hızını.
  • predict_batch_size : tahmin için Toplu boyutu.
  • tpu : TPU adresi bağlanmak için. Sadece tpu kullanılıyorsa kullanılır.

Örneğin, modeli daha uzun bir dizi uzunluğuyla eğitebilirsiniz. Eğer modeli değiştirirseniz, önce yeni bir inşa etmek zorunda model_spec .

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

Kalan adımlar aynıdır. Hem yeniden gerektiğini Not dataloader ve create farklı modeli özellikleri farklı ön işlemler olabileceğinden parçaları.

Eğitim hiper parametrelerini ayarlayın

Ayrıca ayar gibi eğitim hyperparameters olabilir epochs ve batch_size modeli performansını etkileyecek. Örneğin,

  • epochs : Daha fazla dönemini daha iyi performans elde edebiliriz, ancak aşırı uyuma sebep olabilmektedir.
  • batch_size : Numunelerin numaralı eğitim adımda kullanmak.

Örneğin, daha fazla dönemle ve aşağıdaki gibi daha büyük bir parti boyutuyla antrenman yapabilirsiniz:

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

Model Mimarisini Değiştirin

Baz değiştirerek üzerinde veri trenler modellemek değiştirebilir model_spec . Örneğin, BERT-Base modeline geçmek için şunu çalıştırın:

spec = model_spec.get('bert_qa')

Kalan adımlar aynıdır.

TensorFlow Lite modelinde eğitim sonrası nicelemeyi özelleştirin

Sonrası eğitim niceleme Ayrıca, CPU ve donanım hızlandırıcı çıkarım hızı arttırırken model doğruluğunun küçük bir bozulma ile, model boyutu ve çıkarım gecikmeyi azaltmak bir dönüşüm bir tekniktir. Bu nedenle, modeli optimize etmek için yaygın olarak kullanılır.

Model Maker kitaplığı, modeli dışa aktarırken varsayılan bir eğitim sonrası niceleme tekniği uygular. Eğer eğitim sonrası nicemlemesini özelleştirmek istiyorsanız, Model Maker kullanarak birden eğitim sonrası nicemleme seçeneklerini desteklemektedir QuantizationConfig sıra. Örnek olarak float16 nicelemeyi alalım. İlk olarak, niceleme yapılandırmasını tanımlayın.

config = QuantizationConfig.for_float16()

Ardından TensorFlow Lite modelini bu konfigürasyonla dışa aktarıyoruz.

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

Daha fazla oku

Bizim okuyabilir Bert Soru ve Cevap teknik ayrıntılarını öğrenmek için örnek. Daha fazla bilgi için lütfen şu adrese bakın: