Copyright 2018 The TensorFlow Authors.
コードを TensorFlow 2 に自動的にアップグレードする
TensorFlow 2.0には引数の並べ替え、シンボル名の変更、パラメータのデフォルト値の変更など、多くのAPIの変更が含まれています。これらの変更をすべて手動で実行するのは退屈で、エラーが発生しやすくなります。変更を合理化し、可能な限りシームレスに TF 2.0 に移行できるよう、TensorFlow チームはレガシーコードの新しい API への移行を支援する tf_upgrade_v2
ユーティリティを作成しています。
注意: tf_upgrade_v2
は TensorFlow 1.13 以降(すべての TF 2.0 ビルドを含む)に自動的にインストールされています。
一般的な使用方法は以下のとおりです。
tf_upgrade_v2 \
--intree my_project/ \
--outtree my_project_v2/ \
--reportfile report.txt
これにより、既存の TensorFlow 1.x Python スクリプトが TensorFlow 2.0 に変換され、アップグレード処理が高速化します。
この変換スクリプトは可能な限り自動化を行いますが、スクリプトでは実行できない構文やスタイルの変更もあります。
互換性モジュール
いくつかの API シンボルは単に文字列置換を使用するだけではアップグレードできません。コードを確実に TensorFlow 2.0 に対応させるため、アップグレードスクリプトには compat.v1
モジュールが含まれています。このモジュールは tf.foo
のような TF 1.x のシンボルを同等の tf.compat.v1.foo
参照に置換します。この互換性モジュールは優れていますが、置換箇所を手作業で見直し、それらを tf.compat.v1
名前空間ではなく tf.*
名前空間の新しい API に早急に移行することをお勧めします。
TensorFlow 2.x で廃止されているモジュール(tf.flags
や tf.contrib
など)があるため、一部の変更は compat.v1
に切り替えても対応できません。このようなコードをアップグレードするには、追加のライブラリ(absl.flags
など)を使用するか、tensorflow/addons にあるパッケージに切り替える必要があるかもしれません。
推奨アップグレード手順
このガイドの残りの部分では、アップグレードスクリプトの使用方法を説明します。アップグレードスクリプトは簡単に使用できますが、次の手順の一環として使用することを強く推奨します。
単体テスト: アップグレード対象のコードにカバレッジ率が適度な単体テストスイートを確実に用意します。このコードは Python で記述されているため、さまざまなミスから保護されることはありません。また、すべての依存物が TensorFlow 2.0 との互換性を確保できるようにアップグレード済みであることを確認してください。
TensorFlow 1.14 のインストール: TensorFlow を最新の TensorFlow 1.x バージョン(1.14 以上)にアップグレードします。このバージョンには
tf.compat.v2
に最終的な TensorFlow 2.0 API が含まれています。1.14 でテスト: この時点で単体テストに合格することを確認します。単体テストはアップグレード中に何度も実行することになるため、安全な状態で開始することが重要です。
アップグレードスクリプトの実行: テストを含むソースツリー全体で
tf_upgrade_v2
を実行します。これにより、TensorFlow 2.0 で利用できるシンボルのみを使用する形式にコードがアップグレードされます。廃止されたシンボルはtf.compat.v1
でアクセスできます。このようなシンボルは最終的には手動での対応が必要ですが、すぐに対応する必要はありません。変換後のテストを TensorFlow 1.14 で実行: コードは引き続き TensorFlow 1.14 で正常に動作するはずです。もう一度単体テストを実行してください。テストで何らかのエラーが発生する場合は、アップグレードスクリプトにバグがあります。その場合はお知らせください。
アップグレードレポートの警告とエラーを確認: このスクリプトは再確認が必要な変換や、必要な手動対応を説明するレポートファイルを書き出します。たとえば、残っているすべての contrib インスタンスを手動で削除する必要がある場合などです。RFC で詳細を確認してください。
TensorFlow 2.0 のインストール: この時点で TensorFlow 2.0 に切り替えても安全です。
v1.disable_v2_behavior
でのテスト: テストの main 関数でv1.disable_v2_behavior()
を使用してテストをもう一度実行すると、1.14 で実行した場合と同じ結果になるはずです。V2の動作を有効化: テストが v2 API を使用して動作するようになったため、v2 の動作をオンにすることを検討し始めることができます。コードの記述方法によっては、若干の変更が必要になる場合があります。詳細については、移行ガイドを参照してください。
アップグレードスクリプトの使用
セットアップ
始める前に、TensorlFlow 2.0 がインストールされていることを確認してください。
テスト対象のコードがある tensorflow/models git リポジトリをクローンします。
ヘルプを読む
スクリプトは TensorFlow と共にインストールされています。組み込みのヘルプは次のとおりです。
TF1 のコード例
単純な TensorFlow 1.0 のスクリプトは次のとおりです。
TensorFlow 2.0 がインストールされている状態では動作しません。
単一ファイル
アップグレードスクリプトは単体の Python ファイルに対して実行できます。
コードの修正策が見つからない場合、スクリプトはエラーを出力します。
ディレクトリツリー
この単純な例を含む一般的なプロジェクトでは、複数のファイルが使用されています。通常はパッケージ全体をアップグレードするため、スクリプトをディレクトリツリーに対して実行することもできます。
dataset.make_one_shot_iterator
関数に関して警告が 1 つ表示されていることに注意してください。
これで、スクリプトが TensorFlow 2.0 で動作するようになりました。
tf.compat.v1
モジュールのため、変換後のスクリプトは TensorFlow 1.14 でも実行されることに注意してください。
詳細レポート
このスクリプトは、詳細な変更のリストも報告します。この例では安全でない可能性のある変換が 1 つ検出され、ファイルの先頭で警告が表示されています。
再度 Dataset.make_one_shot_iterator function
に関して警告が 1 つ表示されていることに注意してください。
その他の場合、重要な変更の根拠が出力されます。
変更されたファイルの内容は次のとおりです。スクリプトがどのように引数名を追加し、移動および名前変更された引数を処理しているかに注目してください。
大規模なプロジェクトでは、若干のエラーが発生する可能性があります。たとえば、deeplab モデルを変換します。
次のような出力ファイルが生成されました。
しかし、エラーが発生していました。レポートは、実行前に修正する必要があるものを正確に把握するのに役立ちます。最初の 3 つのエラーは次のとおりです。
"Safety" モード
この変換スクリプトには tensorflow.compat.v1
モジュールを使用するようにインポートを変更するだけの侵襲性の低い SAFETY
モードもあります。
ご覧のとおり、このモードはコードをアップグレードしませんが、TensorFlow 1 のコードを TensorFlow 2 で実行できます。
警告
このスクリプトを実行する前に手動でコードの一部をアップデートしないでください。特に、
tf.argmax
やtf.batch_to_space
などの引数の順序が変更された関数により、既存コードを誤ってマッピングするキーワード引数が不正に追加されてしまいます。このスクリプトは
tensorflow
がimport tensorflow as tf
を使用してインポートされていることを前提としています。このスクリプトは引数の順序を変更しません。その代わり、キーワード引数を引数の順序が変更された関数に追加します。
GitHub リポジトリ内の Jupyter ノートブックと Python ファイルをアップグレードするための便利なツールについては、tf2up.ml をチェックしてください。
アップグレードスクリプトのバグの報告または機能リクエストを行うには、GitHub で課題を報告してください。また、TensorFlow 2.0 をテストしている場合は結果をお聞かせください!TF 2.0 テストコミュニティに参加し、質問や議論を [email protected] 宛に投稿してください。