1. 定義と概要
Define-and-Runとは、ニューラルネットワークの計算の流れを表す計算グラフを、実行前にあらかじめ固定した構造として定義し、その後に実際のデータを流し込んで計算を行う方式です。グラフを組み立てる「定義」の段階と、データを流す「実行」の段階が明確に分離している点が特徴です。
計算グラフ自体の詳しい仕組みは別の用語として整理されますが、ここでは計算の手順をあらかじめ図のような構造にまとめたものと理解しておけば十分です。代表的な採用例として、TensorFlow(Googleが開発した代表的なディープラーニング用フレームワーク。ソフトウェアの土台にあたります)の初期のバージョン、1系が挙げられます。
プログラムは通常、コードを1行ずつ実行しながら結果を確認できますが、大規模なニューラルネットワークの計算では、処理全体の設計図にあたる計算グラフを先にまとめて組み立ててから、計算資源に効率よく割り当てる方式が求められてきました。Define-and-Runは、この「先に設計図を確定させてから動かす」考え方を体現したアプローチとして、初期のディープラーニングフレームワークで広く採用されてきました。
近年は、系列データ(文章や音声のように、順番に並んだ長さの異なるデータ)を柔軟に扱いたいという要求も高まっています。そこで、実行しながらグラフを組み立てるDefine-by-Run(コードを実行しながら、そのつど計算グラフを組み立てていく方式)の採用が進んでいます。
2. 試験対策ポイント
G検定の学習では、Define-and-Runがグラフの構造を実行前に固定するという性質から生まれる利点と制約をあわせて整理しておきたいところです。グラフの形が実行前に決まっているため、フレームワーク側が計算全体を見渡した最適化、たとえば計算の順序を並べ替えたりメモリの配置を効率化したりする処理を行いやすいという利点があります。
一方で、入力データによって処理の分岐や系列の長さが変わるようなモデルには対応しにくく、モデルの構造を変えるたびにグラフを組み直す手間が生じやすいという制約もあります。エラーもグラフの実行段階でまとめて表面化しやすく、コードを1行ずつ実行しながら途中の値を確認するデバッグ(プログラムの不具合を見つけて直す作業)がしにくい点も、実行しながらグラフを組み立てる方式との対比で整理される論点です。
代表的な採用フレームワークとバージョンの対応関係は取り違えやすいところです。TensorFlowは初期のバージョン、1系でDefine-and-Runを採用していましたが、バージョン2以降は実行しながらグラフを組み立てる方式が既定になっています。フレームワークの名前だけでなく、バージョンとセットで押さえておきたいところです。
3. 関連概念との比較・相違点
Define-by-Runとの最大の違いは、計算グラフをいつ構築するかというタイミングにあります。Define-and-Runが実行前にグラフを固定するのに対し、Define-by-Runはコードの実行に合わせてそのつどグラフを組み立てていきます。
この違いから、計算全体を見渡した最適化のしやすさと、入力ごとに処理を変える柔軟性やデバッグのしやすさとの間にトレードオフの関係が生まれます。主な観点を並べると次のようになります。
| 観点 | Define-and-Run | Define-by-Run |
|---|---|---|
| 計算グラフを作るタイミング | 実行前にまとめて固定する | コードの実行に合わせてそのつど組み立てる |
| 得意なこと | 計算全体を見渡した最適化 | 入力ごとに処理を変える柔軟性、デバッグのしやすさ |
| 向いている場面 | 構造を固定して速く安定して動かしたい場面 | 試行錯誤しながら構造を組み替えたい場面 |
どちらが優れているという関係ではなく、何を優先するかによって向き不向きが分かれる関係です。
計算グラフとの違いは、位置づけそのものにあります。計算グラフは計算の手順をグラフ構造で表す概念そのものを指し、Define-and-Runはそのグラフを「いつ作るか」という構築方式の一方を指す用語です。計算グラフという土台があり、その組み立て方の選択肢としてDefine-and-RunとDefine-by-Runが並ぶ、という関係にあります。
4. ビジネス・実務での活用シナリオ
本番環境でのデプロイや大規模な運用の場面では、モデルの構造が確定した段階でグラフを事前に固定して最適化できる設計が活きてきます。処理内容があらかじめ決まっているため、推論(学習済みモデルを使って答えを出す処理)の実行効率を高めたり、使用するメモリなどの資源を抑えたりする効果につながる場面があります。
研究開発やプロトタイピング(試作段階での検証)のように、モデルの構造を頻繁に試行錯誤する開発初期の局面では、事情が変わってきます。実行しながらグラフを組み立てる方式のほうが、コードを直しては動かすという検証サイクルを回しやすく、Define-and-Runの得意・不得意が意識されやすい文脈です。
計算資源が限られた組み込み機器やエッジ側(現場に近い末端の機器)での推論向けにモデルを提供する場面でも、グラフがあらかじめ固定されている特性が活かされることがあります。処理内容を事前に最適化できるため、限られた電力やメモリの中でも安定した動作につながる場面があります。
5. 要点まとめ
- Define-and-Runは計算グラフの構造を実行前に固定してからデータを流す方式で、TensorFlowの初期バージョンなどが採用してきました。
- グラフが固定されているため計算全体の最適化がしやすい一方、入力ごとに処理を変える柔軟性やデバッグのしやすさでは制約があります。
- 実行しながらグラフを構築するDefine-by-Runとの対比、およびフレームワークの採用状況がバージョンによって変わってきた点も押さえておきたいポイントです。
6. 確認問題
問1Define-and-Runは、計算グラフの構造を実行前に確定させたうえで、そこにデータを流し込んで計算する方式である。
解答・解説をみる
○ 正しい
定義どおりの内容です。グラフを組み立てる段階と、データを流して計算する段階が分離している点が特徴です。
問2Define-and-Runは、入力データによって処理の分岐や系列の長さが変わるモデルに対して、Define-by-Runより柔軟に対応できる。
解答・解説をみる
× 誤り
正しくは逆の関係です。グラフがあらかじめ固定されているため、入力ごとに処理を変える柔軟性はDefine-by-Runのほうが高くなります。取り違えやすい点です。
問3Define-and-Runでは計算グラフの構造があらかじめ固定されているため、計算全体を見渡した最適化を行いやすいという利点がある。
解答・解説をみる
○ 正しい
グラフが固定されていることで、計算の並べ替えやメモリ配置の効率化など、事前の最適化がしやすいという利点につながります。

