分散中間表現の実践:比較サーベイ
Author: Asher Bond (asher.bond@distillative.ai)
要旨
分散中間表現(distributed intermediate representation, DIR)とは、分散フレームワークが段階(stage)とノードのあいだで部分結果を運ぶために用いる抽象である。最適化・耐障害性・同期が実際に起こるのは、まさにこの層においてである。本稿は、実運用に投入されている五つのシステム(Apache Spark、TensorFlow、Horovod、Hadoop MapReduce、Apache Flink)がそれぞれの DIR をどう実現しているかを調査し、繰り返し現れる設計軸を明らかにする。すなわち、遅延評価か即時評価か、系譜(lineage)ベースの回復かチェックポイントベースの回復か、同期更新か非同期更新か、である。これらのシステムを、合成可能な中間段階というレンズ [1, 2, 3] を通して捉える。中間表現とは突き詰めれば、合成された関数のあいだを渡される値にほかならない。そのうえで、attention [4, 5] のような効率的プリミティブが段階の演算としてどこに位置づくかを示す。
1. 序論
あらゆる分散データパイプライン、あるいは分散モデルパイプラインは、段階のあいだを何が流れるのか、そしてその流れが障害をどう生き延び、いかにして整合性を保つのかを決めねばならない。この「何が」こそが中間表現である。DIR の選択は、どの最適化が可能か(演算を並べ替えられるか、融合できるか)を規定し、回復がどう働くか(系譜から再計算するのか、チェックポイントから復元するのか)を決め、ノードがいかにして合意するか(同期バリアか、非同期進行か)を左右する。本サーベイは、よく文書化された五つのシステムをこれらの軸に沿って比較する。その寄与は記述的かつ統合的である。すなわち、通常は個別に論じられるシステム群の底に横たわる、共有された設計語彙を名指すことにある。
抽象的に見れば、中間表現とは、ある合成された関数から次の関数へと手渡される値である [1, 2, 3]。DIR とは、その値を分散可能・耐障害的・並べ替え可能にしたものである。この合成的な枠組みこそ本稿の組織原理である。同一のレンズが、以下に挙げるすべてのシステムを読み解く。
2. 関連研究
中間表現は、コンパイルと関数型プログラミングにおける古典的な着想である。プログラムを段階から段階への値の合成として捉え [1, 2]、その中間値の意味論を演算と同じく第一級の対象とみなす [3]。ML パイプラインにおいて関心の的となる段階演算は、しばしば attention であり [4]、その分散コストは IO を意識したカーネルによって扱われる [5]。以下で調査するシステム群はそれぞれの文献に文書化されている。本稿は、それらを統一する合成的 IR の系譜を引く。
3. サーベイ
3.1 機械学習フレームワーク
Apache Spark(MLlib)。 DIR は RDD/DataFrame である。変換は遅延評価され、Spark は有向非巡回グラフを構築し、それを最適化して(Catalyst)シャッフルを最小化する。耐障害性は RDD の系譜から生じる。失われたパーティションは、その導出過程から再計算される。ML パイプラインは段階を連鎖させ(tokenizer → vector assembler → model)、各段階が次の段階に消費される中間物を生む。これは段階から段階への合成の直接的な実例である [2]。
TensorFlow。 DIR は計算グラフ内のテンソルである。分散は、データ並列(各ワーカーがデータシャード上で勾配を計算する)またはモデル並列(グラフの領域を別々のデバイスに配置する)によって仕事を分割し、パラメータサーバまたは AllReduce を介して同期する。グラフレベルの最適化(op 融合、メモリプランニング)は、遅延 IR が可能にする並べ替えそのものである。
3.2 人工知能/分散学習
Horovod。 DIR は勾配/重みテンソルである。Ring-AllReduce が GPU/ノードをまたいで勾配を平均する。同期的な平均化がステップごとに重みを整合させ、チェックポイントが回復を提供する。
強化学習(actor–learner)。 DIR は再生バッファ(replay buffer)内の経験タプルである。actor が経験を生み、learner が集約された経験を消費して、更新されたパラメータを配信する。優先度付き再生(prioritized replay)は、どの中間物がサンプリングされるかに対する最適化である。
3.3 ビッグデータ
Hadoop MapReduce。 DIR は Map と Reduce のあいだの中間キー–値対であり、シャッフルとソートを経て移動する。耐障害性はタスクの再実行と HDFS の冗長性によって成り立つ。combiner は局所的な事前集約によってネットワーク転送を削減する。
Apache Flink。 DIR はデータストリームと、状態を持つ変換の状態である。分散されチェックポイントされた状態が exactly-once セマンティクスを与える。watermark がイベント時刻処理を同期し、最適化器がシャッフルを最小化する。
4. 横断的な設計軸
| システム | 中間表現 | 回復 | 同期 |
|---|---|---|---|
| Spark | RDD / DataFrame(遅延 DAG) | 系譜からの再計算 | 段階バリア |
| TensorFlow | 計算グラフ内のテンソル | チェックポイント | パラメータサーバ / AllReduce |
| Horovod | 勾配テンソル | チェックポイント | Ring-AllReduce(同期) |
| RL actor–learner | 経験タプル(replay buffer) | バッファ / チェックポイント | パラメータ配信(多くは非同期) |
| Hadoop MR | キー–値対 | タスク再実行 | シャッフルバリア |
| Flink | ストリーム + 状態 | チェックポイントされた状態 | watermark(イベント時刻) |
This table lays out システム, 中間表現, 回復, 同期 across 6 rows.
繰り返し得られる教訓は、DIR そのものが設計だということである。系譜から再計算可能な IR を選べば Spark の回復モデルが得られ、チェックポイントされた状態を選べば Flink の exactly-once セマンティクスが得られる。いずれも「合成された段階のあいだを何の値が流れ、それはどう生き延びるのか」という問いに対する具体的な答えである [1, 2, 3]。
根拠と範囲
本稿は、文書化され実運用に投入された設計——Spark、TensorFlow、Horovod、Hadoop MapReduce、Flink——を、三つの軸、すなわち評価戦略・回復モデル・同期に沿って読み解く比較サーベイである。根拠は各システム自身の確立した挙動であり、寄与はそれらを結ぶ共有語彙である。DIR は設計そのものである。合成的レンズ [2]——DIR を合成された関数のあいだの値とみなす見方——こそが、通常は別々に研究されるフレームワーク群をまたいで、その語彙を持ち運び可能にする。
References
- John Backus (1978). Can Programming Be Liberated from the von Neumann Style? A Functional Style and Its Algebra of Programs. Communications of the ACM. [1977 ACM Turing Award Lecture]
- John Hughes (1989). Why Functional Programming Matters. The Computer Journal.
- Christopher Strachey (2000). Fundamental Concepts in Programming Languages. Higher-Order and Symbolic Computation. [Reprint of 1967 lecture notes]
- Ashish Vaswani et al. (2017). Attention Is All You Need. Advances in Neural Information Processing Systems (NeurIPS). arXiv:1706.03762.
- Tri Dao et al. (2022). FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness. Advances in Neural Information Processing Systems (NeurIPS). arXiv:2205.14135.