روز جامعه ML 9 نوامبر است! برای به روز رسانی از TensorFlow، JAX به ما بپیوندید، و بیشتر بیشتر بدانید

پاسخ سوال BERT با TensorFlow Lite Model Maker

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub دانلود دفترچه یادداشت

کتابخانه TensorFlow بازگشت به محتوا | مدل ساز ساده فرآیند تطبیق و تبدیل یک مدل TensorFlow به داده های ورودی خاص زمانی که استقرار این مدل برای برنامه های کاربردی بر روی دستگاه ML.

این نوت بوک یک مثال سرتاسری را نشان می دهد که از کتابخانه Model Maker برای نشان دادن سازگاری و تبدیل یک مدل پاسخ س questionال متداول برای کار پاسخ پرسش استفاده می کند.

معرفی وظیفه پاسخ به پرسش BERT

وظیفه پشتیبانی شده در این کتابخانه وظیفه پاسخگویی به پرسش استخراج است ، به این معنی که یک قسمت و یک س givenال داده شده است ، پاسخ دهانه قسمت است. تصویر زیر نمونه ای از پاسخ س questionال را نشان می دهد.

پاسخ دهانه در گذشت هستند (تصویر های اعتباری: وبلاگ تیم ملی )

در مورد مدل وظیفه پاسخ به سوال ، ورودی ها باید جفت گذر و س thatال باشند که از قبل پردازش شده اند ، خروجی ها باید logits شروع و logits پایان برای هر رمز در گذر باشد. اندازه ورودی را می توان با توجه به طول گذر و سوال تنظیم و تنظیم کرد.

مرور کلی به انتها

قطعه کد زیر نحوه دریافت مدل را در چند خط کد نشان می دهد. فرایند کلی شامل 5 مرحله است: (1) انتخاب یک مدل ، (2) بارگذاری داده ها ، (3) آموزش مجدد مدل ، (4) ارزیابی ، و (5) صادر کردن آن به فرمت 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)

بخشهای بعدی کد را با جزئیات بیشتری توضیح می دهد.

پیش نیازها

برای اجرای این مثال، نصب بسته های مورد نیاز، از جمله بسته ساز مدل از مخزن گیتهاب .

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

"مرور سر به سر" یک مثال ساده از انتها را نشان می دهد. بخشهای زیر مثال را گام به گام برای نشان دادن جزئیات بیشتر توضیح می دهند.

یک model_spec انتخاب کنید که یک مدل را برای پاسخ به سال نشان دهد

هر model_spec شیء نشان دهنده یک مدل خاص برای پاسخ سوال. Model Maker در حال حاضر از مدلهای MobileBERT و BERT-Base پشتیبانی می کند.

مدل پشتیبانی شده نام model_spec توضیحات مدل
MobileBERT 'mobilebert_qa' 4.3 برابر کوچکتر و 5.5 برابر سریعتر از BERT-Base در حین دستیابی به نتایج رقابتی ، مناسب برای سناریوهای روی دستگاه.
MobileBERT-SQuAD 'mobilebert_qa_squad' معماری مدل همان مدل MobileBERT و الگوی اولیه است در حال حاضر در باز آموزی SQuAD1.1 .
BERT-Base 'bert_qa' مدل استاندارد BERT که به طور گسترده در کارهای NLP استفاده می شود.

در این آموزش، MobileBERT-تیم ملی به عنوان نمونه استفاده می شود. از آنجا که مدل در حال حاضر در باز آموزی SQuAD1.1 ، آن می تواند پوشش سریع تر برای کار جواب سوال.

spec = model_spec.get('mobilebert_qa_squad')

بارگذاری داده های ورودی خاص به یک برنامه ML روی دستگاه و پردازش داده ها

TriviaQA یک مجموعه داده درک مطلب خواندن حاوی بیش از 650K سه برابر پرسش و پاسخ-شواهد است. در این آموزش ، شما از زیر مجموعه ای از این مجموعه داده برای یادگیری نحوه استفاده از کتابخانه Model Maker استفاده خواهید کرد.

برای بارگذاری داده ها، تبدیل مجموعه داده TriviaQA به SQuAD1.1 فرمت های در حال اجرا تبدیل اسکریپت پایتون با --sample_size=8000 و مجموعه ای از web داده ها. کد تبدیل را کمی تغییر دهید:

  • رد کردن نمونه هایی که هیچ پاسخی در سند زمینه پیدا نکردند.
  • دریافت پاسخ اصلی در زمینه بدون بزرگ یا کوچک.

نسخه بایگانی شده مجموعه داده از قبل تبدیل شده را بارگیری کنید.

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 را با مجموعه داده خود آموزش دهید. اگر این نوت بوک را در Colab اجرا می کنید ، داده های خود را با استفاده از نوار کناری سمت چپ بارگذاری کنید.

آپلود فایل

اگر ترجیح می دهید را آپلود کنید اطلاعات خود را به ابر، شما همچنین می توانید آنلاین کتابخانه با پیروی از اجرا راهنمای .

استفاده از DataLoader.from_squad روش برای بارگذاری و پردازش فرمت تیم ملی داده با توجه به خاص model_spec . می توانید از فرمت های SQuAD2.0 یا SQuAD1.1 استفاده کنید. تنظیم پارامتر version_2_with_negative به عنوان True یعنی فرمت SQuAD2.0 است. در غیر این صورت ، فرمت SQuAD1.1 است. به طور پیش فرض، version_2_with_negative است 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 را سفارشی کنید

یک مدل پاسخ س customال سفارشی بر اساس داده های بارگذاری شده ایجاد کنید. create تابع شامل مراحل زیر است:

  1. ایجاد مدل برای پاسخ سوال با توجه به model_spec .
  2. مدل پاسخ به سوال را آموزش دهید. دوره های پیش فرض و اندازه پیش فرض دسته ای با توجه به دو متغیر تنظیم default_training_epochs و default_batch_size در model_spec شی.
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

به ساختار مدل دقیق نگاه کنید.

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

صادرات به مدل Lite TensorFlow

تبدیل مدل آموزش دیده را به فرمت مدل TensorFlow Lite با ابرداده به طوری که شما بعدا می توانید در یک برنامه ML روی دستگاه استفاده کنید. فایل vocab در فراداده جاسازی شده است. نام فایل پیش فرض TFLite است model.tflite .

در بسیاری از برنامه های کاربردی ML روی دستگاه ، اندازه مدل یک عامل مهم است. بنابراین ، توصیه می شود از مدل کمی استفاده کنید تا کوچکتر شده و به طور بالقوه سریعتر اجرا شود. تکنیک پیش فرض کوانتزاسیون پس از آموزش ، کوانتیزاسیون محدوده پویا برای مدل های BERT و 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

شما می توانید فایل مدل 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.

شما همچنین می توانید مدل tflite با ارزیابی evaluate_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.6699443413729128}

استفاده پیشرفته

create تابع بخش مهمی از این کتابخانه که در آن است model_spec پارامتر مشخصات مدل تعریف می کند. BertQASpec کلاس در حال حاضر پشتیبانی. 2 مدل وجود دارد: مدل MobileBERT ، مدل BERT-Base. create تابع شامل مراحل زیر است:

  1. ایجاد مدل برای پاسخ سوال با توجه به model_spec .
  2. مدل پاسخ به سوال را آموزش دهید.

این بخش چندین موضوع پیشرفته از جمله تنظیم مدل ، تنظیم پارامترهای آموزشی و غیره را شرح می دهد.

مدل را تنظیم کنید

شما می توانید زیرساخت مدل مانند پارامترهای تنظیم seq_len و query_len در BertQASpec کلاس.

پارامترهای قابل تنظیم برای مدل:

  • seq_len : طول از عبور به خوراک به مدل.
  • query_len : طول از سوال به خوراک به مدل.
  • doc_stride : گام های به هنگام انجام یک رویکرد پنجره به تکه های از اسناد و مدارک.
  • initializer_range ها: STDEV از truncated_normal_initializer برای مقدار دهی اولیه تمام ماتریس وزن.
  • trainable : بولی، چه لایه های از پیش آموزش دیده تربیت شدنی است.

پارامترهای قابل تنظیم برای خط لوله آموزش:

  • model_dir : محل فایل های مدل پاسگاه. اگر تنظیم نشده باشد ، از فهرست موقت استفاده می شود.
  • dropout_rate : نرخ برای ترک تحصیل.
  • learning_rate : میزان یادگیری اولیه برای آدم.
  • predict_batch_size : اندازه دسته ای برای پیش بینی.
  • tpu : آدرس TPU برای اتصال به. فقط در صورت استفاده از tpu استفاده می شود.

به عنوان مثال ، می توانید مدل را با طول دنباله طولانی تر آموزش دهید. اگر شما از مدل تغییر دهید، شما باید اول یک جدید ساخت model_spec .

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

مراحل باقی مانده یکسان است. توجه داشته باشید که شما باید هر دو دوباره dataloader و create قطعات به عنوان مشخصات مدل های مختلف ممکن است مراحل قبل از پردازش مختلف داشته باشد.

تنظیم فوق پارامترهای آموزش

شما همچنین می توانید لحن hyperparameters آموزشی مانند epochs و batch_size به تاثیر عملکرد مدل. برای مثال،

  • epochs : دوره بیشتر می تواند عملکرد بهتری به دست، اما ممکن است به Over-fitting خواهد منجر شود.
  • batch_size : تعداد نمونه برای استفاده در یک مرحله آموزش است.

به عنوان مثال ، می توانید با دوره های بیشتر و با اندازه دسته بزرگتر تمرین کنید:

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

تغییر معماری مدل

شما می توانید تغییر مدل پایه قطار اطلاعات خود را در با تغییر model_spec . به عنوان مثال ، برای تغییر به مدل BERT-Base ، دستور زیر را اجرا کنید:

spec = model_spec.get('bert_qa')

مراحل باقی مانده یکسان است.

بر اساس مدل TensorFlow Lite ، کمی سازی پس از آموزش را سفارشی کنید

تدریج پس از آموزش یک تکنیک تبدیل است که می توانید اندازه مدل و تاخیر استنتاج را کاهش دهد، در حالی که همچنین به بهبود سرعت پردازنده و شتاب دهنده سخت افزار استنباط، با تخریب کمی در دقت مدل است. بنابراین ، به طور گسترده ای برای بهینه سازی مدل استفاده می شود.

کتابخانه Model Maker هنگام صادر کردن مدل ، از تکنیک پیش فرض کمی سازی پس از آموزش استفاده می کند. اگر شما می خواهید برای سفارشی کردن تدریج پس از آموزش، مدل ساز از گزینه های متعدد پس از آموزش تدریج با استفاده از QuantizationConfig است. بیایید کوانتیزاسیون float16 را به عنوان نمونه در نظر بگیریم. ابتدا پیکربندی quantization را تعریف کنید.

config = QuantizationConfig.for_float16()

سپس مدل TensorFlow Lite را با چنین پیکربندی صادر می کنیم.

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

بیشتر بخوانید

شما می توانید به عنوان خوانده شده BERT سوال و جواب به عنوان مثال به یادگیری جزئیات فنی. جهت کسب اطلاعات بیشتر به آدرس زیر مراجعه فرمایید: