このページは Cloud Translation API によって翻訳されました。
Switch to English

TensorFlowバージョンの互換性

このドキュメントは、TensorFlowの異なるバージョン間(コードまたはデータのいずれか)での下位互換性が必要なユーザーと、互換性を維持しながらTensorFlowを変更したい開発者向けです。

セマンティックバージョニング2.0

TensorFlowは、そのパブリックAPIのセマンティックバージョニング2.0( semver )に準拠しています。 TensorFlowの各リリースバージョンの形式はMAJOR.MINOR.PATCHです。たとえば、TensorFlowバージョン1.2.3には、 MAJORバージョン1、 MINORバージョン2、およびPATCHバージョン3があります。各番号の変更には、次の意味があります。

  • メジャー :互換性のない変更が後方にある可能性があります。以前のメジャーリリースで機能していたコードとデータは、必ずしも新しいリリースで機能するとは限りません。ただし、既存のTensorFlowグラフとチェックポイントが新しいリリースに移行できる場合があります。データの互換性の詳細については、グラフとチェックポイントの互換性を参照してください。

  • MINOR:以前のマイナーリリースと協力し、そのまま作業を継続します非実験パブリックAPIにのみ依存して下位互換性機能、速度の向上などのコードとデータ。パブリックAPIと非APIの詳細については、対象となるものを参照してください。

  • パッチ :下位互換性のあるバグ修正。

たとえば、リリース1.0.0では、リリース0.12.1からの下位互換性のない変更が導入されています。ただし、リリース1.1.1はリリース1.0.0と下位互換性がありました。

カバーされるもの

TensorFlowのパブリックAPIのみが、マイナーバージョンとパッチバージョン間で下位互換性があります。パブリックAPIは、

  • tensorflowモジュールとそのサブモジュールに記載されているすべてのPython関数とクラス

    • プライベートシンボル:名前が_始まる関数、クラスなど
    • 実験的およびtf.contribシンボル。詳細は以下を参照してください。

    examples/およびtools/ディレクトリ内のコードは、 tensorflow Pythonモジュールを介して到達できないため、互換性の保証の対象ではないことに注意してください。

    シンボルがtensorflow Pythonモジュールまたはそのサブモジュールを通じて利用可能であるが、文書化されていない場合、そのシンボルはパブリックAPIの一部と見なされません

  • 互換性API(Pythonでは、 tf.compatモジュール)。メジャーバージョンでは、新しいメジャーバージョンへの移行を支援するユーティリティと追加のエンドポイントをリリースする場合があります。これらのAPIシンボルは非推奨であり、サポートされていません(つまり、機能を追加せず、脆弱性を修正する以外のバグを修正しません)が、互換性の保証に該当します。

  • C API

  • 次のプロトコルバッファファイル:

カバーされていないもの

TensorFlowの一部は、下位互換性のない方法でいつでも変更できます。これらには以下が含まれます:

  • 試験的なAPI :開発を容易にするために、互換性の保証から、試験的にマークされた一部のAPIシンボルを除外します。特に、以下は互換性保証の対象外です。

    • tf.contribモジュールまたはそのサブモジュール内のシンボル。
    • 名前にexperimentalまたはExperimental含むシンボル(モジュール、関数、引数、プロパティ、クラス、または定数)。または

    • 完全修飾名に、それ自体が実験的なモジュールまたはクラスが含まれているシンボル。これは、フィールドと呼ばれる任意のプロトコルバッファのサブメッセージが含まexperimental

  • その他の言語 :PythonやC以外の言語のTensorFlow API:

  • 複合演算の詳細: Pythonの多くのパブリック関数はグラフ内のいくつかのプリミティブGraphDef展開され、これらの詳細はGraphDefとしてディスクに保存されたグラフの一部になります。これらの詳細は、マイナーリリースで変更される可能性があります。特に、グラフの動作が変更されず、既存のチェックポイントが機能する場合でも、グラフ間の正確な一致をチェックする回帰テストは、マイナーリリースで中断する可能性があります。

  • 浮動小数点数値の詳細: opsによって計算される特定の浮動小数点値は、いつでも変更される可能性があります。ユーザーは、計算された特定のビットではなく、おおよその精度と数値の安定性のみに依存する必要があります。マイナーリリースとパッチリリースで数式を変更すると、同等または正確な精度が得られるはずです。ただし、機械学習では、特定の数式の精度が向上すると、システム全体の精度が低下する可能性があります。

  • 乱数:計算される特定の乱数はいつでも変更される可能性があります。ユーザーは、計算された特定のビットではなく、おおよそ正しい分布と統計強度のみに依存する必要があります。詳細については、 乱数生成ガイドを参照してください。

  • 分散 Tensorflowでのバージョンスキュー: 1つのクラスターで2つの異なるバージョンのTensorFlowを実行することはサポートされていません。ワイヤプロトコルの下位互換性については保証されません。

  • バグ:現在の実装が明らかに破損している場合、つまり、ドキュメントと矛盾している場合、またはよく知られた明確に意図された動作が適切に実装されていない場合、API以外の後方互換性のない動作を変更する権利を留保します。バグに。たとえば、オプティマイザが既知の最適化アルゴリズムを実装すると主張しているが、バグのためにそのアルゴリズムと一致しない場合、オプティマイザを修正します。私たちの修正は、収束のために間違った振る舞いに依存しているコードを壊すかもしれません。このような変更については、リリースノートで説明します。

  • 未使用のAPI:APIに後方互換性のない変更を加える権利を留保します(APIに文書化された使用が見つからない場合(GitHub検索を通じてTensorFlow使用の監査を実行することにより))。そのような変更を行う前に、変更を行う意向をannounce @メーリングリストで発表し、破損への対処方法(該当する場合)を提供し、コミュニティにフィードバックを共有する機会を与えるために2週間待ちます。

  • エラー動作:エラーを非エラー動作に置き換える場合があります。たとえば、エラーが文書化されている場合でも、エラーを発生させる代わりに関数を変更して結果を計算する場合があります。また、エラーメッセージのテキストを変更する権利を留保します。さらに、特定のエラー条件の例外タイプがドキュメントで指定されていない限り、エラーのタイプは変わる可能性があります。

SavedModels、グラフ、チェックポイントの互換性

SavedModelは、TensorFlowプログラムで使用するための推奨シリアル化形式です。 SavedModelsには、 GraphDefsとしてエンコードされた1つ以上のグラフとチェックポイントの2つの部分が含まれています。グラフは、実行される演算のデータフローを示し、チェックポイントには、グラフ内の変数の保存されたテンソル値が含まれます。

多くのTensorFlowユーザーはSavedModelsを作成し、それをTensorFlowの新しいリリースでロードして実行します。 semverに準拠して、TensorFlowの1つのバージョンで記述されたSavedModelsをロードして、同じメジャーリリースを持つTensorFlowの新しいバージョンで評価できます。

サポートされる SavedModelsについて 、追加の保証が行われます。 TensorFlowのメジャーバージョンN で非推奨でなく、実験的で非互換性のないAPIのみを使用して作成されたSavedModelを、バージョンNサポートされるSavedModelと呼びます。 TensorFlowメジャーバージョンNサポートされるすべてのSavedModelは、TensorFlowメジャーバージョンN+1でロードして実行できます。ただし、このようなモデルの構築または変更に必要な機能は使用できなくなる可能性があるため、この保証は変更されていないSavedModelにのみ適用されます。

シリアライズされたファイルを長期間使用できるように、可能な限り下位互換性を維持するよう努めます。

GraphDefの互換性

グラフは、 GraphDefプロトコルバッファーを介してGraphDefます。グラフに対する下位互換性のない変更を容易にするために、各GraphDefはTensorFlowバージョンとは異なるバージョン番号があります。たとえば、 GraphDefバージョン17はinv opを廃止し、 reciprocal 。セマンティクスは次のとおりです。

  • TensorFlowの各バージョンは、 GraphDefバージョンの間隔をサポートしています。この間隔は、パッチリリース全体で一定であり、マイナーリリース全体でのみ増加します。 GraphDefバージョンのサポートのGraphDefは、 GraphDefのメジャーリリースでのみ発生します(SavedModelsで保証されているバージョンのサポートとのみ一致します)。

  • 新しく作成されたグラフには、最新のGraphDefバージョン番号が割り当てられます。

  • TensorFlowのGraphDefバージョンがグラフのGraphDefバージョンをサポートする場合、メジャーに関係なく、それを生成するために使用されたTensorFlowバージョンと同じ動作でロードおよび評価します(浮動小数点数値の詳細および上記で概説した乱数を除く)。 TensorFlowのバージョン。特に、TaveFlowの1つのバージョンのチェックポイントファイルと互換性のあるGraphDef(SavedModelの場合など)は、GraphDefがサポートされている限り、以降のバージョンのチェックポイントとの互換性を維持します。

    チェックポイントを読み取るコードは TensorFlowの異なるバージョンを実行して、同じコードによって生成されたチェックポイントを読み取ることができないかもしれない:これはGraphDefs(及びSavedModels)でシリアライズグラフに適用されることに留意されたいです。

  • 場合GraphDef 上限は(マイナー)リリースではXに増加している下限前に、少なくとも6ヶ月があるだろう例えばXに増加している(ここでは仮想的なバージョン番号を使用しています):

    • TensorFlow 1.2は、 GraphDefバージョンGraphDefサポートするGraphDefます。
    • TensorFlow 1.3は、 GraphDefバージョン8を追加し、バージョン4〜8をサポートできます。
    • 少なくとも6か月後、TensorFlow 2.0.0はバージョン4〜7のサポートを終了し、バージョン8のみを残す可能性があります。

    TensorFlowのメジャーバージョンは通常6か月以上離れて公開されるため、上記のサポートされているSavedModelsの保証は、GraphDefsの6か月の保証よりもはるかに強力です。

最後に、 GraphDefバージョンのサポートが終了すると、サポートされている新しいバージョンのGraphDefグラフを自動的に変換するためのツールを提供しようとします。

TensorFlowを拡張するときのグラフとチェックポイントの互換性

このセクションは、 GraphDef追加、 GraphDefGraphDefの機能の変更など、 GraphDef形式に互換性のない変更を加える場合にのみ関連します。ほとんどのユーザーには、前のセクションで十分です。

後方および部分的な前方互換性

私たちのバージョン管理スキームには3つの要件があります。

  • TensorFlowの古いバージョンで作成されたグラフとチェックポイントの読み込みをサポートするための下位互換性
  • グラフまたはチェックポイントのプロデューサーがコンシューマーより前にTensorFlowの新しいバージョンにアップグレードされるシナリオをサポートするための上位互換性
  • 互換性のない方法でTensorFlowの進化を有効にします。たとえば、操作の削除、属性の追加、属性の削除などです。

GraphDefバージョンメカニズムはGraphDefバージョンとは別ですが、 GraphDefフォーマットへの後方互換性のない変更は、セマンティックバージョニングによって依然として制限されていることに注意してください。つまり、TensorFlowのMAJORバージョン( 1.7から2.0 )の間でのみ機能を削除または変更できます。さらに、パッチリリース( 1.x.1から1.x.2など)内で上位互換性が適用されます。

後方互換性と前方互換性を実現し、フォーマットの変更をいつ適用するかを知るために、グラフとチェックポイントには、いつ作成されたかを示すメタデータがあります。以下のセクションでは、TensorFlowの実装と、進化するGraphDefバージョンのガイドラインについて詳しく説明します。

独立したデータバージョンスキーム

グラフとチェックポイントにはさまざまなデータバージョンがあります。 2つのデータ形式は、互いに異なる速度で進化し、TensorFlowからも異なる速度で進化します。どちらのバージョン管理システムもcore/public/version.h定義されています。新しいバージョンが追加されると、変更内容と日付の詳細を記したメモがヘッダーに追加されます。

データ、プロデューサー、コンシューマー

次の種類のデータバージョン情報を区別します。

  • プロデューサー :データを生成するバイナリ。プロデューサーには、互換性のあるバージョン( producer )と最小コンシューマーバージョン( min_consumer )があります。
  • コンシューマ :データを消費するバイナリ。コンシューマーには、互換性のあるバージョン( consumer )と最小プロデューサーバージョン( min_producer )があります。

バージョン管理された各データには、データを作成したproducer 、データと互換性のあるmin_consumer 、および許可されていないbad_consumersバージョンのリストを記録するVersionDef versionsフィールドがあります。

デフォルトでは、プロデューサーがデータを作成すると、データはプロデューサーのproducermin_consumerバージョンをmin_consumerます。 bad_consumersは、特定のコンシューマーバージョンにバグが含まれていることがわかっていて、回避する必要がある場合に設定できます。次の条件がすべて当てはまる場合、消費者はデータの一部を受け入れることができます。

  • consumer > =データのmin_consumer
  • データのproducer > =コンシューマーのmin_producer
  • データのbad_consumersないconsumer

プロデューサーとコンシューマーの両方が同じTensorFlowコードベースに由来するため、 core/public/version.hは、コンテキストに応じてproducerまたはconsumerとして処理されるメインデータバージョンと、 min_consumermin_producer両方(それぞれプロデューサーとコンシューマーで必要)が含まれます。 。具体的には

  • GraphDefバージョンには、 TF_GRAPH_DEF_VERSIONTF_GRAPH_DEF_VERSION_MIN_CONSUMER 、およびTF_GRAPH_DEF_VERSION_MIN_PRODUCERます。
  • チェックポイントバージョンについては、 TF_CHECKPOINT_VERSIONTF_CHECKPOINT_VERSION_MIN_CONSUMER 、およびTF_CHECKPOINT_VERSION_MIN_PRODUCERます。

デフォルトの新しい属性を既存の操作に追加します

以下のガイダンスに従うと、一連の操作が変更されていない場合にのみ、上位互換性が提供されます。

  1. 上位互換性が必要な場合は、 SavedModelBuilderクラスのtf.saved_model.SavedModelBuilder.add_meta_graph_and_variablesおよびtf.saved_model.SavedModelBuilder.add_meta_graphメソッド、またはtf.estimator.Estimator.export_saved_modelを使用してモデルをエクスポートするときに、 strip_default_attrsTrueに設定します。
  2. これにより、モデルの生成/エクスポート時にデフォルト値の属性が取り除かれます。これにより、デフォルト値が使用されている場合、エクスポートされたtf.MetaGraphDefに新しいop属性が含まれないようになります。
  3. このコントロールを使用すると、古いコンシューマー(たとえば、トレーニングバイナリに遅れをとるバイナリの提供)がモデルの読み込みを続行し、モデル提供の中断を防ぐことができます。

進化するGraphDefバージョン

このセクションでは、このバージョン管理メカニズムを使用して、 GraphDef形式にさまざまなタイプの変更を加える方法について説明します。

オペレーションを追加

新しいopをコンシューマーとプロデューサーの両方に同時に追加し、 GraphDefバージョンを変更しないでください。このタイプの変更は自動的に下位互換性があり、既存のプロデューサースクリプトが新しい機能を突然使用しないため、上位互換性計画には影響しません。

opを追加し、それを使用するように既存のPythonラッパーを切り替えます

  1. 新しいコンシューマー機能を実装し、 GraphDefバージョンをGraphDefます。
  2. 以前に機能しなかった場合にのみ、ラッパーが新しい機能を使用できるようにすることが可能である場合、ラッパーを今すぐ更新できます。
  3. 新しい機能を使用するようにPythonラッパーを変更します。このmin_consumer使用しないモデルは壊れないため、 min_consumerインクリメントしないでください。

opの機能を削除または制限する

  1. (TensorFlow自体ではなく)すべてのプロデューサースクリプトを修正して、禁止されたopまたは機能を使用しないようにします。
  2. GraphDefバージョンをインクリメントし、新しいバージョン以上でGraphDefsの削除されたopまたは機能を禁止する新しいコンシューマー機能を実装します。可能であれば、 GraphDefsに、禁止されている機能を備えたGraphDefs生成を停止させます。これを行うには、 REGISTER_OP(...).Deprecated(deprecated_at_version, message)追加しREGISTER_OP(...).Deprecated(deprecated_at_version, message)
  3. 下位互換性のためにメジャーリリースを待ちます。
  4. min_producerを(2)からGraphDefバージョンに増やし、機能を完全に削除します。

オペレーションの機能を変更する

  1. SomethingV2などの新しい類似のopを追加し、それを追加して既存のPythonラッパーを切り替えて使用するプロセスを実行します。上位互換性を確保するには、Pythonラッパーを変更するときにcompat.pyで提案されているチェックを使用します。
  2. 古い操作を削除します(下位互換性のためにメジャーバージョンが変更された場合にのみ実行できます)。
  3. min_consumerを増やして、古いopを持つコンシューマーを除外し、 SomethingV2エイリアスとして古いopを追加し直して、既存のPythonラッパーを使用するようにプロセスを切り替えます。
  4. SomethingV2を削除するプロセスを実行します。

安全でない単一のコンシューマーバージョンを禁止する

  1. GraphDefバージョンをバンプし、すべての新しいGraphDefの不良バージョンをbad_consumers追加します。可能であれば、特定のopなどを含むbad_consumers場合のみbad_consumersに追加してbad_consumers
  2. 既存の消費者が悪いバージョンを持っている場合、できるだけ早くそれらを押し出します。