XEngine: Optimal Tensor Rematerialization for Neural Networks in Heterogeneous Environments

ACM TACO 20(1)(2022) · 論文 · schuler2022xengine

📅 この論文を見た日

初回 2026-08-27 / 最終 2026-08-27 / 計 1 回更新

AI解説

情報源:arXiv 版全文(https://arxiv.org/abs/2212.09290)を精読。図は同 PDF から抽出した。実装は公開されている(https://github.com/dfki-asr/xengine)。

一言で

Checkmate の MILP による最適な再計算(rematerialization)計画を、CPU と GPU が混在するヘテロジニアス環境に拡張した MIQP(混合整数二次計画)ソルバ。 どの演算子をどのタイムステップにどのデバイスで計算し、どのテンソルをチェックポイントとして保持し、どれを再計算するかを、デバイスごとのメモリ上限の下で一括して最適化する。 単一デバイスで最速の Checkmate スケジュールと比べて最大 22.5% 速いスケジュールを見つけ、GPU 単体ではメモリが足りず学習できないネットワークにも CPU/GPU 混合の実行可能スケジュールを与える。

XEngine の全体像

Fig. 1: XEngine の全体パイプライン。ハードウェアとネットワークのトポロジを読み込み、MIQP の制約を定義して MPS ファイルとして生成し、解いたスケジュール(中央下の R/S 行列)を出力する。右は実行時間とメモリ使用量の評価。

背景・問題

深層学習の学習では forward の活性を backward での勾配計算まで保持するのが普通だが、メモリが足りなければ一部のテンソルを破棄し、保存済みテンソル(チェックポイント)から後で再計算できる。 ここでの「チェックポイント」は、障害復旧のためにディスクへ保存するモデル重みのことではなく、破棄したテンソルを再計算するための起点として保持しておく forward テンソルを指す。

問題は、このチェックポイントの決め方が自明でないことに加え、既存の再計算手法(Chen らの分割法、Checkmate の MILP、DTR の貪欲オンライン法など)がすべて単一デバイスを前提にしていることである。 メモリも計算性能も限られた環境では、CPU を「テンソルの退避先」としてだけでなく計算デバイスとして使いたい。 しかし演算子を手動でデバイスに割り当てるのは、再計算を考えなくても難しい。 backward の依存構造は複雑で、単純に最速デバイスへ載せるとテンソルコピーのコストで損をする。

提案手法:MIQP による同時最適化

XEngine は Checkmate の MILP を出発点に、デバイス次元 d を全変数・全制約に追加する。 T 個の演算子を T タイムステップで、D 個のデバイスに割り当てる。

目的関数は計算コストとコピーコストの和である。

minimize  Σ_d Σ_t Σ_i c[d,i]・R[d,t,i]  +  W
W = Σ_t Σ_{e=(u→v)} Σ_{d'} Σ_d  w[e,d,d']・R[d',t,v]・Z[d,t,u]

c[d,i] は演算子 i をデバイス d で計算するコスト、w[e,d,d'] はテンソル e をデバイス d から d' へコピーするコストである。 コピーコスト項 W が決定変数の積 R・Z を含むため、Checkmate の MILP と違って二次(quadratic)の問題になる。 これが名前の由来である MIQP で、直感としては「vd' で計算する(R)とき、依存テンソル u が別デバイス d にしかない(Z)ならコピー代を払う」という条件付きコストを表す。

制約は Checkmate のものにデバイス次元を加えた形で、主なものは次のとおり。

実行フレームワークとコスト計測

ネットワークは ONNX モデルとして読み込み、Intel oneDNN 上で実行する。 演算コストは全演算子を全デバイスで一度実行して計測し、デバイス間のテンソルコピーコストも双方向に計測する(oneDNN のメモリレイアウト変換は copy コストに含まれる)。 すべてのコストを事前に計測するオフライン方式なので、実行中の資源の増減には適応できず、静的グラフのみを扱う。動的グラフは対象外である。

例ネットワークのデバイス分配

Fig. 2: forward 演算子 A, B, C とその backward 演算子 A’, B’, C’ の分配例。A と A’ を CPU(青)、残りを GPU(赤)に割り当てると、境界のテンソル a と ∇a のコピーが発生する。

再計算のメカニズム

Fig. 3: 演算子 C’ の計算時に (a) 依存テンソル b と ∇c がメモリにあればそのまま計算でき、(b) b が破棄済みなら A と B の再計算が必要になる。再計算は CPU でも GPU でもよく、コピーコストとの兼ね合いで決まる。

UNet 学習のスケジュール例

Fig. 4: メモリ予算 65%(208 MiB)で UNet(N=2)を学習する XEngine スケジュール。左から CPU の compute 行列 R0、GPU の R1、CPU の save 行列 S0、GPU の S1。列が演算子、行がタイムステップ。多くの演算子が CPU に載り、forward 終盤と backward 序盤だけ GPU に載っている。

スケジュールのメモリ使用量

Fig. 5: UNet(N=2)学習のメモリ使用量。(a) Checkmate(CPU 単体)は予算 100%(緑)と 65%(青)。(b) XEngine は CPU(青)と GPU(赤)それぞれが 65% 予算を守り、灰色は両者の合計。オレンジは全テンソル保持の場合。

実験・結果

Intel DevCloud の2構成で評価している。 「Iris」は Core i9-10920X(24スレッド、31 GiB)と Iris Xe MAX GPU(7.5 GiB)、「Gen9」は Xeon E-2176G(12スレッド、50 GiB)と UHD Graphics P630(62.6 GiB)である。 CPU スレッド数を 4〜24 に変えて CPU と GPU の性能比を振り、VGG16/19、ResNet18/34、UNet を推論と学習の両モードで評価する。 メモリ予算は「全テンソルを保存するのに必要な量」を 100% とし、25% まで人工的に絞る。 比較対象は単一デバイス版の Checkmate(GPU だけでなく CPU 単体でも実行)である。

UNet の構造

Fig. 6: 評価に使う UNet の構造。エンコーダ側のブロック出力がスキップ接続でデコーダ側の連結演算子につながるため、テンソルの生存期間が長く、メモリ要求が大きい。

結果の要点は次のとおり。

Iris での実行時間比較

Fig. 7: 「Iris」での実行時間。(a) ResNet18 学習、(b) UNet、(c) VGG16/19 推論、(d) VGG16 学習。緑(XEngine CPU+GPU)が単一デバイスの Checkmate(青: CPU、赤: GPU)を一貫して下回る。

低予算時の再計算スケジュール

Fig. 8: 予算 25% で ResNet18(N=8)を CPU 単体で学習するスケジュール。R 行列の赤丸部分が backward 中の 17 回の再計算を示し、S 行列の白い縦筋がその出力を保存していなかったことを示す。

Gen9 での実行時間比較

Fig. 9: 「Gen9」での推論の実行時間。(a) VGG16 はバッチが小さいほど混合スケジュールの利得が大きい(最大 14.2%)。(b) UNet は N=16 でも 16.2% の短縮を保つ。

エネルギー効率への拡張(議論)

MIQP は目的関数への重み付きコスト項の追加(+ αQQ は演算子ごとの消費エネルギーの和)か、デバイスごとのエネルギー予算というハード制約の追加で、エネルギー効率の最適化にも拡張できる。 ただし Intel DevCloud 上で消費電力を取得する手段がなく、実験はしていない。

モデル並列(ブランチの並列実行)は扱わない。演算子は逐次実行を仮定する。 スキップ接続の外側ブランチは計算が軽く、ボトルネックはメモリ転送になりがちなので、並列実行しても大きな短縮は見込めないという理由づけである。

ResNet18 のスキップ接続

Fig. 10: ResNet18 の3番目のスキップ接続の部分グラフ。内側ブランチ(3×3 畳み込み×2)は外側ブランチ(1×1 畳み込み)の2倍以上の計算量を持つ。

関連研究との関係

本文の位置づけをまとめると次のようになる。

Q&A

自分のコメント