การแปลงตัวดำเนินการข้อความ TensorFlow เป็น TensorFlow Lite

ดูบน TensorFlow.org ทำงานใน Google Colab ดูบน GitHub ดาวน์โหลดโน๊ตบุ๊ค

ภาพรวม

โมเดลการเรียนรู้ของเครื่องมักถูกปรับใช้โดยใช้ TensorFlow Lite กับอุปกรณ์เคลื่อนที่ อุปกรณ์ฝังตัว และอุปกรณ์ IoT เพื่อปรับปรุงความเป็นส่วนตัวของข้อมูลและลดเวลาในการตอบสนอง โมเดลเหล่านี้มักต้องการการสนับสนุนสำหรับการดำเนินการประมวลผลข้อความ TensorFlow Text เวอร์ชัน 2.7 ขึ้นไปให้ประสิทธิภาพที่ดีขึ้น ลดขนาดไบนารี และการดำเนินการที่ปรับให้เหมาะสมโดยเฉพาะสำหรับใช้ในสภาพแวดล้อมเหล่านี้

ตัวดำเนินการข้อความ

สามารถใช้คลาส TensorFlow Text ต่อไปนี้จากภายในโมเดล TensorFlow Lite

  • FastWordpieceTokenizer
  • WhitespaceTokenizer

ตัวอย่างโมเดล

pip install -U tensorflow-text
from absl import app
import numpy as np
import tensorflow as tf
import tensorflow_text as tf_text

from tensorflow.lite.python import interpreter

ตัวอย่างโค้ดต่อไปนี้แสดงกระบวนการแปลงและการตีความใน Python โดยใช้โมเดลการทดสอบอย่างง่าย โปรดทราบว่าเอาต์พุตของโมเดลไม่สามารถเป็นอ็อบเจ็กต์ tf.RaggedTensor เมื่อคุณใช้ TensorFlow Lite อย่างไรก็ตาม คุณสามารถส่งคืนส่วนประกอบของอ็อบเจ็กต์ tf.RaggedTensor หรือแปลงโดยใช้ฟังก์ชัน to_tensor ดู คู่มือ RaggedTensor สำหรับรายละเอียดเพิ่มเติม

class TokenizerModel(tf.keras.Model):

  def __init__(self, **kwargs):
    super().__init__(**kwargs)
    self.tokenizer = tf_text.WhitespaceTokenizer()

  @tf.function(input_signature=[
      tf.TensorSpec(shape=[None], dtype=tf.string, name='input')
  ])
  def call(self, input_tensor):
    return { 'tokens': self.tokenizer.tokenize(input_tensor).flat_values }
# Test input data.
input_data = np.array(['Some minds are better kept apart'])

# Define a Keras model.
model = TokenizerModel()

# Perform TensorFlow Text inference.
tf_result = model(tf.constant(input_data))
print('TensorFlow result = ', tf_result['tokens'])
TensorFlow result =  tf.Tensor([b'Some' b'minds' b'are' b'better' b'kept' b'apart'], shape=(6,), dtype=string)

แปลงโมเดล TensorFlow เป็น TensorFlow Lite

เมื่อแปลงโมเดล TensorFlow ด้วยโอเปอเรเตอร์ TensorFlow Text เป็น TensorFlow Lite คุณต้องระบุให้ TFLiteConverter มีโอเปอเรเตอร์ที่กำหนดเองโดยใช้แอตทริบิวต์ allow_custom_ops ดังตัวอย่างด้านล่าง จากนั้นคุณสามารถเรียกใช้การแปลงแบบจำลองได้ตามปกติ ตรวจสอบเอกสารประกอบของ ตัวแปลง TensorFlow Lite สำหรับคำแนะนำโดยละเอียดเกี่ยวกับพื้นฐานของการแปลงแบบจำลอง

# Convert to TensorFlow Lite.
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS]
converter.allow_custom_ops = True
tflite_model = converter.convert()
2022-02-01 12:09:02.062677: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmpiiuhjdn6/assets
2022-02-01 12:09:03.705144: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded
2022-02-01 12:09:03.705185: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
2022-02-01 12:09:03.921830: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:1902] The following operation(s) need TFLite custom op implementation(s):
Custom ops: TFText>WhitespaceTokenizeWithOffsetsV2
Details:
    tf.TFText>WhitespaceTokenizeWithOffsetsV2(tensor<?x!tf_type.string>, tensor<!tf_type.string>) -> (tensor<?x!tf_type.string>, tensor<?xi64>, tensor<?xi32>, tensor<?xi32>) : {device = ""}
See instructions: https://www.tensorflow.org/lite/guide/ops_custom

การอนุมาน

เพื่อให้ล่าม TensorFlow Lite สามารถอ่านโมเดลของคุณที่มีตัวดำเนินการ TensorFlow Text ได้อย่างถูกต้อง คุณต้องกำหนดค่าให้ใช้ตัวดำเนินการที่กำหนดเองเหล่านี้ และจัดเตรียมวิธีการลงทะเบียนสำหรับตัวดำเนินการเหล่านี้ ใช้ tf_text.tflite_registrar.SELECT_TFTEXT_OPS เพื่อจัดเตรียมชุดฟังก์ชันการลงทะเบียนเต็มรูปแบบสำหรับโอเปอเรเตอร์ TensorFlow Text ที่รองรับ InterpreterWithCustomOps

โปรดทราบว่าในขณะที่ตัวอย่างด้านล่างแสดงการอนุมานใน Python ขั้นตอนจะคล้ายกันในภาษาอื่นที่มีการแปล API เล็กน้อย และความจำเป็นในการสร้าง tflite_registrar ลงในไบนารีของคุณ ดู การอนุมาน TensorFlow Lite สำหรับรายละเอียดเพิ่มเติม

# Perform TensorFlow Lite inference.
interp = interpreter.InterpreterWithCustomOps(
    model_content=tflite_model,
    custom_op_registerers=tf_text.tflite_registrar.SELECT_TFTEXT_OPS)
interp.get_signature_list()
{'serving_default': {'inputs': ['input'], 'outputs': ['tokens']} }

ถัดไป ล่าม TensorFlow Lite จะถูกเรียกใช้พร้อมกับอินพุต ซึ่งให้ผลลัพธ์ที่ตรงกับผลลัพธ์ของ TensorFlow จากด้านบน

tokenize = interp.get_signature_runner('serving_default')
output = tokenize(input=input_data)
print('TensorFlow Lite result = ', output['tokens'])
TensorFlow Lite result =  [b'Some' b'minds' b'are' b'better' b'kept' b'apart']