TensorFlow Text 연산자를 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에서 변환 프로세스 및 해석을 보여줍니다. TensorFlow Lite를 사용할 때 모델의 출력은 tf.RaggedTensor 객체가 될 수 없습니다. 그러나 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 Text 연산자가 있는 TensorFlow 모델을 TensorFlow Lite로 변환할 때 아래 예와 같이 allow_custom_ops 속성을 사용하는 사용자 지정 연산자가 있음을 TFLiteConverter 에 표시해야 합니다. 그런 다음 평소와 같이 모델 변환을 실행할 수 있습니다. 모델 변환의 기본에 대한 자세한 가이드는 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']