TFLite オーサリングツール

TensorFlow.org で表示 Google Colab で実行 GitHubでソースを表示 ノートブックをダウンロード

TensorFlow Lite Authoring API を使用すると、TensorFlow Lite と互換性がある tf.function モデルを管理できます。

設定

import tensorflow as tf

TensorFlow と TensorFlow Lite との互換性の問題

デバイスで TF モデルを使用する場合は、そのモデルを TFLite モデルに変換し、TFLite インタープリタから TFLite モデルを使用する必要があります。TFLite ビルトイン op セットによって TensorFlow op がサポートされていないと、変換中に互換性エラーが発生する可能性があります。

このような問題は厄介です。モデルのオーサリング時のように早い段階で検出するには、どうすれば良いでしょうか。

次のコードは、converter.convert() 呼び出し時に失敗します。

@tf.function(input_signature=[
    tf.TensorSpec(shape=[None], dtype=tf.float32)
])
def f(x):
  return tf.cosh(x)

# Evaluate the tf.function
result = f(tf.constant([0.0]))
print (f"result = {result}")
# Convert the tf.function
converter = tf.lite.TFLiteConverter.from_concrete_functions(
    [f.get_concrete_function()], f)
try:
  fb_model = converter.convert()
except Exception as e:
  print(f"Got an exception: {e}")

シンプルなターゲット認識オーサリングの使用方法

モデルオーサリング時の TensorFlow Lite の互換性の問題を検出するために、Authoring API が導入されました。

必要な手順は、@tf.lite.experimental.authoring.compatible デコレータを追加し、tf.function モデルをラップして、TFLite の互換性を確認することだけです。

この後、モデルを評価するときに、互換性が自動的にチェックされます。

@tf.lite.experimental.authoring.compatible
@tf.function(input_signature=[
    tf.TensorSpec(shape=[None], dtype=tf.float32)
])
def f(x):
  return tf.cosh(x)

# Evaluate the tf.function
result = f(tf.constant([0.0]))
print (f"result = {result}")

TensorFlow Lite の互換性の問題が検出された場合、COMPATIBILITY WARNING または COMPATIBILITY ERROR と、問題がある処理の正確な場所が表示されます。この例では、tf.function モデルの tf.Cosh 処理の場所が表示されています。

<function_name>.get_compatibility_log() メソッドを使用して、互換性ログを確認することもできます。

compatibility_log = '\n'.join(f.get_compatibility_log())
print (f"compatibility_log = {compatibility_log}")

非互換性の場合に例外を発生させる

@tf.lite.experimental.authoring.compatible デコレータのオプションを指定できます。raise_exception オプションを使用すると、デコレートされたモデルを評価するときに、例外が発生します。

@tf.lite.experimental.authoring.compatible(raise_exception=True)
@tf.function(input_signature=[
    tf.TensorSpec(shape=[None], dtype=tf.float32)
])
def f(x):
  return tf.cosh(x)

# Evaluate the tf.function
try:
  result = f(tf.constant([0.0]))
  print (f"result = {result}")
except Exception as e:
  print(f"Got an exception: {e}")

"Select TF ops" の使用を指定する

Select TF ops の使用をすでに認識している場合は、converter_target_spec を設定して、これを Authoring API に命令できます。これは、tf.lite.TFLiteConverter API で使用する tf.lite.TargetSpec オブジェクトと同じです。

target_spec = tf.lite.TargetSpec()
target_spec.supported_ops = [
    tf.lite.OpsSet.TFLITE_BUILTINS,
    tf.lite.OpsSet.SELECT_TF_OPS,
]
@tf.lite.experimental.authoring.compatible(converter_target_spec=target_spec, raise_exception=True)
@tf.function(input_signature=[
    tf.TensorSpec(shape=[None], dtype=tf.float32)
])
def f(x):
  return tf.cosh(x)

# Evaluate the tf.function
result = f(tf.constant([0.0]))
print (f"result = {result}")

GPU 互換性の確認

モデルが TensorFlow Lite の GPU デリゲートと互換性があることを保証するには、tf.lite.TargetSpecexperimental_supported_backends を設定します。

次の例は、モデルの GPU デリゲートの互換性を保証する方法を示します。このモデルでは、tf.slice オペレータとサポートされていない tf.cosh オペレータが使用されているため、互換性の問題があります。2 件の互換性の警告とその場所に関する情報が表示されます。

target_spec = tf.lite.TargetSpec()
target_spec.supported_ops = [
    tf.lite.OpsSet.TFLITE_BUILTINS,
    tf.lite.OpsSet.SELECT_TF_OPS,
]
target_spec.experimental_supported_backends = ["GPU"]
@tf.lite.experimental.authoring.compatible(converter_target_spec=target_spec)
@tf.function(input_signature=[
    tf.TensorSpec(shape=[4, 4], dtype=tf.float32)
])
def func(x):
  y = tf.cosh(x)
  return y + tf.slice(x, [1, 1], [1, 1])

result = func(tf.ones(shape=(4,4), dtype=tf.float32))

その他の資料

詳細については、次のドキュメントを参照してください。