Path: blob/master/site/ja/guide/migrate/saved_model.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
SavedModel ワークフローを移行する
モデルを TensorFlow 1 のグラフとセッションから tf.keras.Model
、tf.function
、tf.Module
などの TensorFlow 2 API に移行したら、モデルの保存と読み込みコードを移行できます。このノートブックは、TensorFlow 1 と TensorFlow 2 の SavedModel 形式で保存および読み込む方法の例を提供します。TensorFlow 1 から TensorFlow 2 への移行に関連する API の変更の概要を次に示します。
| TensorFlow 1 | TensorFlow 2 への移行 --- | --- | --- 保存 | tf.compat.v1.saved_model.Builder
tf.compat.v1.saved_model.simple_save
| tf.saved_model.save
Keras: tf.keras.models.save_model
読み込み | tf.compat.v1.saved_model.load
| tf.saved_model.load
Keras: tf.keras.models.load_model
シグネチャ: 実行に使用できる
入力と出力
テンソルのセット
| *.signature_def
ユーティリティを使用して生成
(例: tf.compat.v1.saved_model.predict_signature_def
) | tf.function
を作成し、tf.saved_model.save
で signatures
引数を
使用してエクスポートします。 分類
および回帰:
特別な種類のシグネチャ | tf.compat.v1.saved_model.classification_signature_def
、tf.compat.v1.saved_model.regression_signature_def
、および特定の Estimator エクスポートで生成。
| これら 2 つのシグネチャタイプは TensorFlow 2 から削除されました。
サービス提供ライブラリがこれらのメソッド名を必要とする場合は、
tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater
。
| TensorFlow 1 | TensorFlow 2 への移行 --- | --- | --- 保存 | tf.compat.v1.saved_model.Builder
tf.compat.v1.saved_model.simple_save
| tf.saved_model.save
Keras: tf.keras.models.save_model
読み込み | tf.compat.v1.saved_model.load
| tf.saved_model.load
Keras: tf.keras.models.load_model
シグネチャ: 実行に使用できる
入力と出力
テンソルのセット
| *.signature_def
ユーティリティを使用して生成
(例: tf.compat.v1.saved_model.predict_signature_def
) | tf.function
を作成し、tf.saved_model.save
で signatures
引数を
使用してエクスポートします。 分類
および回帰:
特別な種類のシグネチャ | tf.compat.v1.saved_model.classification_signature_def
、tf.compat.v1.saved_model.regression_signature_def
、および特定の Estimator エクスポートで生成。
| これら 2 つのシグネチャタイプは TensorFlow 2 から削除されました。
サービス提供ライブラリがこれらのメソッド名を必要とする場合は、
tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater
。
セットアップ
以下の例は、TensorFlow 1 および TensorFlow 2 API を使用して、同じダミーの TensorFlow モデル(以下で add_two
として定義)を SavedModel 形式にエクスポートおよびロードする方法を示しています。インポートとユーティリティ関数を設定することから始めます。
TensorFlow 1: SavedModel を保存してエクスポートする
TensorFlow 1 では、tf.compat.v1.saved_model.Builder
、tf.compat.v1.saved_model.simple_save
、および tf.estimator.Estimator.export_saved_model
API を使用して、TensorFlow グラフとセッションを構築、保存、およびエクスポートします。
1. SavedModelBuilder を使用して、グラフを SavedModel として保存する
2. 提供する SavedModel を構築する
3. Estimator 推論グラフを SavedModel としてエクスポートする
Estimator model_fn
(以下で定義)の定義では、tf.estimator.EstimatorSpec
で export_outputs
を返すことにより、モデルでシグネチャを定義できます。出力にはさまざまなタイプがあります。
tf.estimator.export.ClassificationOutput
tf.estimator.export.RegressionOutput
tf.estimator.export.PredictOutput
これらは、それぞれ分類、回帰、および予測シグネチャタイプを生成します。
estimator が tf.estimator.Estimator.export_saved_model
でエクスポートされると、これらのシグネチャはモデルとともに保存されます。
TensorFlow 2: SavedModel を保存してエクスポートする
tf.Module で定義された SavedModel を保存してエクスポートする
TensorFlow 2 でモデルをエクスポートするには、モデルのすべての変数と関数を保持するために tf.Module
または tf.keras.Model
を定義する必要があります。次に、tf.saved_model.save
を呼び出して、SavedModel を作成できます。詳細については、SavedModel 形式の使用のカスタムモデルの保存セクションを参照してください。
Keras で定義された SavedModel を保存してエクスポートする
廃止: Keras オブジェクトについては、新しい高レベルの .keras
形式と tf.keras.Model.export
を使用することをお勧めします。これについては、こちらのガイドで説明されています。既存のコードについては、低レベルの SavedModel 形式が引き続きサポートされます。
保存およびエクスポート用の Keras API(Mode.save
または tf.keras.models.save_model
)は、 SavedModel を tf.keras.Model
からエクスポートできます。詳細については、Keras モデルの保存と読み込みをご覧ください。
SavedModel の読み込み
上記の API のいずれかで保存された SavedModel は、TensorFlow 1 または TensorFlow 2 API のいずれかを使用して読み込むことができます。
TensorFlow 1 の SavedModel は通常、TensorFlow 2 に読み込まれたときに推論に使用できますが、トレーニング(勾配の生成)は、SavedModel にリソース変数が含まれている場合にのみ可能です。変数の dtype を確認できます。変数 dtype に「_ref」が含まれている場合、それは参照変数です。
TensorFlow 2 SavedModel は、SavedModel がシグネチャ付きで保存されている限り、TensorFlow 1 から読み込んで実行できます。
以下のセクションには、前のセクションで保存された SavedModels を読み込み、エクスポートされたシグネチャを呼び出す方法を示すコードサンプルが含まれています。
TensorFlow 1: tf.saved_model.load で SavedModel をロードする
TensorFlow 1 では、tf.saved_model.load
を使用して、SavedModel を現在のグラフとセッションに直接インポートできます。テンソルの入力名と出力名で Session.run
を呼び出すことができます。
TensorFlow 2: tf.saved_model で保存されたモデルを読み込む
TensorFlow 2 では、変数と関数を格納する Python オブジェクトにオブジェクトが読み込まれます。これは、TensorFlow 1 から保存されたモデルと互換性があります。
詳細については、SavedModel フォーマットの使用ガイドの tf.saved_model.load
API ドキュメント、およびカスタムのモデルの読み込みと使用セクションを確認してください。
TensorFlow 2 API で保存されたモデルは、(シグネチャとしてエクスポートされたものの代わりに)モデルに添付された tf.function
と変数にもアクセスできます。例えば、次の例をご覧ください。
TensorFlow 2: Keras で保存されたモデルを読み込む
廃止: Keras オブジェクトについては、新しい高レベルの .keras
形式と tf.keras.Model.export
を使用することをお勧めします。これについては、こちらのガイドで説明されています。既存のコードについては、低レベルの SavedModel 形式が引き続きサポートされます。
The Keras loading API—tf.keras.models.load_model
—allows you to reload a saved model back into a Keras Model object. Note that this only allows you to load SavedModels saved with Keras (Model.save
or tf.keras.models.save_model
).
tf.saved_model.save
で保存されたモデルは、tf.saved_model.load
でロードする必要があります。tf.saved_model.load
を使用して Model.save
で保存された Keras モデルを読み込めますが、TensorFlow グラフしか取得できません。詳細については、tf.keras.models.load_model
API ドキュメントと Keras モデルの保存と読み込みに関するガイドを参照してください。
GraphDef と MetaGraphDef
<a name="graphdef_and_metagraphdef">
未処理の GraphDef
または MetaGraphDef
を TF2 に読み込む簡単な方法はありません。ただし、TF1 コードを変換し、v1.wrap_function
を使用して、グラフを TF2 concrete_function
にインポートできます。
まず、MetaGraphDef を保存します。
TF1 API を使用すると、tf1.train.import_meta_graph
を使用してグラフをインポートし、値を復元できます。
グラフを読み込むための TF2 API はありませんが、eager モードで実行できる具象関数にインポートできます。
TensorFlow 1 から TensorFlow 2 への変更
<a id="changes_from_tf1_to_tf2">
このセクションでは、TensorFlow 1 の重要な保存と読み込みの用語、TensorFlow 2 の同等の用語、および変更点を一覧表示します。
SavedModel
SavedModel は、パラメータと計算を含む完全な TensorFlow プログラムを保存する形式です。これには、サービスプラットフォームがモデルを実行するために使用するシグネチャが含まれています。
ファイル形式自体は大幅に変更されていないため、SavedModels は TensorFlow 1 または TensorFlow 2 API のいずれかを使用して読み込みおよび提供できます。
TensorFlow 1 と TensorFlow 2 の違い
サービス提供と推論のユースケースは、API の変更を除けば、TensorFlow 2 では更新されていません。SavedModel から読み込まれたモデルを構成して再利用する機能が改善されました。
TensorFlow 2 では、プログラムは tf.Variable
、tf.Module
、または高レベルの Keras モデル(tf.keras.Model
)およびレイヤー(tf.keras.layers
)などのオブジェクトによって表されます。セッションに保管された値を持つグローバル変数はなくなり、グラフは異なる tf.function
に存在するようになりました。したがって、モデルのエクスポート中に、SavedModel は各コンポーネントと関数グラフを個別に保存します。
TensorFlow Python API を使用して TensorFlow プログラムを作成する場合、変数、関数、およびその他のリソースを管理するオブジェクトを作成する必要があります。通常、これは Keras API を使用して実現されますが、tf.Module
を作成またはサブクラス化してオブジェクトを構築することもできます。
Keras モデル(tf.keras.Model
)と tf.Module
は、それらに接続された変数と関数を自動的に追跡します。SavedModel はモジュール、変数、および関数間のこれらの接続を保存し、読み込み時に復元できるようにします。
シグネチャ
シグニチャは、SavedModel のエンドポイントです。シグニチャは、モデルの実行方法と必要な入力をユーザーに伝えます。
TensorFlow 1 では、シグネチャは入力テンソルと出力テンソルをリストすることによって作成されます。TensorFlow 2 では、シグネチャは具象関数を渡すことによって生成されます。(TensorFlow 関数の詳細については、グラフと tf.function の概要ガイド、特に多態性: 1 つの関数、多数のグラフセクションを参照してください。)要するに、具象関数は tf.function
から生成されます。
Session.run
TensorFlow 1 では、テンソル名が分かっている限り、インポートされたグラフで Session.run
を呼び出すことができました。これにより、復元された変数値を取得したり、シグネチャでエクスポートされなかったモデルの一部を実行したりできます。
TensorFlow 2 では、重み行列(kernel
)などの変数に直接アクセスできます。
または、モデルオブジェクトに接続された tf.function
を呼び出します。例えば、loaded.__call__
です。
TF1 とは異なり、関数の一部を抽出して中間値にアクセスする方法はありません。保存されたオブジェクトで必要なすべての機能をエクスポートする必要があります。
TensorFlow Serving の移行に関する注意事項
SavedModel はもともと TensorFlow Serving で動作するように作成されました。このプラットフォームは、分類、回帰、予測など、さまざまなタイプの予測リクエストを提供します。
TensorFlow 1 API を使用すると、ユーティリティで次のタイプのシグネチャを作成できます。
tf.compat.v1.saved_model.classification_signature_def
tf.compat.v1.saved_model.regression_signature_def
tf.compat.v1.saved_model.predict_signature_def
分類(classification_signature_def
)と回帰(regression_signature_def
)は入力と出力を制限するため、入力は tf.Example
である必要があり、出力は classes
、scores
、または prediction
である必要があります。一方、 予測シグネチャ(predict_signature_def
)には制限がありません。
TensorFlow 2 API でエクスポートされた SavedModel は TensorFlow Serving と互換性がありますが、予測シグネチャのみが含まれます。分類および回帰シグネチャは削除されました。
分類および回帰シグネチャの使用が必要な場合は、エクスポートされた SavedModel を tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater
を使用して変更できます。
次のステップ
TensorFlow 2 の SavedModel の詳細については、次のガイドをご覧ください。
SavedModel 形式の使用
Kerasモデルの保存と読み込み
TensorFlow Hub を使用している場合は、次のガイドが役立つことがあります。