[目次]
バックエンドはコンパイラとランタイムの構成で、コンテキスト内で AST を構築、コンパイル、および実行するために使用されます。つまり、バックエンドは、AST を評価する環境を構築します。
バックエンドパッケージにはTFF コンパイラや TFF ランタイムを拡張できるバックエンドが含まれます。これらの拡張機能は、対応するバックエンドにあります。
バックエンドのランタイムが実行スタックとして実装されている場合、そのバックエンドは AST を評価する環境を TFF に提供する ExecutionContext を構築できます。この場合、バックエンドは、高位の抽出を使用して TFF に統合していますが、ランタイムが実行スタックとして実装されていない場合は、コンテキストを構築する必要があり、低位の抽出を使用して TFF と統合しています。
<!--#include file="backend.dot"-->
青のノードは、TFFのコアによって提供されます。
緑、赤、黄色、および紫のノードはそれぞれ、native、mapreduce、および reference バックエンドによって提供されます。
破線のノードは、外部システムによって提供されます。
実線の矢印は関係を示し、破線の矢印は継承を示します。
Native
native バックエンドは、適度に効率的でデバッグ可能な方法で AST をコンパイルして実行するために、TFF コンパイラと TFF ランタイムで構成されています。
ネイティブ形態
ネイティブ形態とは、TFF 組み込み関数の有向非巡回グラフ(DAG)にトポロジー的にソートされ、それらの組み込み関数の依存関係にいくつかの最適化が加えられた AST です。
コンパイラ
compiler.transform_to_native_form 関数は AST をネイティブ形態にコンパイルします。
ランタイム
native バックエンドには TFF ランタイムに対するバックエンド固有の拡張機能が含まれない代わりに、実行スタックを直接使用できます。
コンテキスト
native コンテキストは、native コンパイラ(またはコンパイラなし)と TFF ランタイムで構成される ExecutionContext です。以下に例を示します。
executor = eager_tf_executor.EagerTFExecutor()
factory = executor_factory.create_executor_factory(lambda _: executor)
context = execution_context.ExecutionContext(
executor_fn=factory,
compiler_fn=None)
set_default_context.set_default_context(context)
ただし、共通する構成がいくつかあります。
execution_context.set_sync_local_cpp_execution_context 関数は、ExecutionContext
を native コンパイラとローカルの実行スタックを使って構築します。
MapReduce
mapreduce バックエンドには、MapReduce に似たランタイムで実行できる形態を構築するために必要なデータ構造とコンパイラが含まれます。
MapReduceForm
forms.MapReduceForm は、MapReduce のようなランタイムで実行できるロジックの表現を定義するデータ構造です。このロジックは、TensorFlow 関数のコレクションとして編成されています。これらの関数の性質に関する詳細については、forms モジュールをご覧ください。
コンパイラ
compiler モジュールには、ビルディングブロックと TensorFlow Computation 変換が含まれます。これらは、AST を MapReduceForm に変換するために必要です。
form_utils モジュールには MapReduce バックエンドのコンパイラが含まれており、MapReduceForm を構築します。
ランタイム
MapReduce ランタイムは、TFF によってではなく外部の MapReduce のようなシステムによって提供されます。
コンテキスト
MapReduce コンテキストは TFF によって提供されません。