はじめに
TensorFlow のグラフ実行のイメージがわかずあれこれ調べて、
大まかな仕組みを理解できたので共有します。
1. 「設計図」をつくる(グラフの構築)
-
@tf.functionを付けた関数内で行う演算を記録し、ノード(演算)とエッジ(テンソルの流れ)からなる計算グラフを作成 - まだ実際の計算は実行せず、「何をどう計算するか」のレシピだけを宣言している段階
@tf.function
def recipe(x):
y = x * 2 # ノード①:スケーリング
return y + 1 # ノード②:加算
2. 自動最適化(Grappler)
- 作成したグラフに対して TensorFlow が自動的に最適化を適用
-
定数折り畳み:
2*constのような計算を事前にまとめる - 演算融合:連続する演算をひとつの高速処理にまとめる
- 不要ノード削除:使われない部分を切り捨てる
-
定数折り畳み:
- 必要に応じて XLA(JIT コンパイラ)も有効化でき、さらに高度な最適化が可能
3. 一気に「調理」する(グラフの実行)
- 最適化済みグラフをまとめて一度に実行
- GPU/TPU 等、割り当てられたデバイス上で高速に動く
- 同じグラフは何度でも再利用できるため、大量データを高速に処理可能
# 実際に入力テンソルを渡してまとめて計算
result = recipe(tf.constant([3.0, 4.0]))
print(result.numpy()) # → [7. 9.]
メリット・注意点
-
メリット
- 一度最適化されたグラフは繰り返し高速実行できる
- 本番投入時の性能・移植性が高い
-
注意点
- 初回のトレース&最適化に時間がかかる
- デバッグ時は中身が見えにくいので、開発中は Eager モード(即時実行)で動作確認するのがおすすめ
使い分けの流れ
- Eager 実行 で「1行ずつ」動きを確認 →
- 安定したら
@tf.functionを付けてグラフ実行 → - Grappler/XLA による最適化で性能アップ
このように「先に設計図を作って自動最適化→まとめて実行」する仕組みが、
TensorFlow のグラフ実行の大きな特徴です。