JUmPER: Performance Data Monitoring, Instrumentation and Visualization for Jupyter Notebooks

SC24-W(SC '24 Workshops, IEEE)pp.2003-2011(2024) · 論文 · werner2024jumper

📅 この論文を見た日

初回 2026-06-10 / 最終 2026-06-11 / 計 2 回更新

AI解説

情報源:対象論文の本文全文(PDF・全9ページ、Abstract〜References)を通読して記述。掲載している図表(Fig.1〜6・Table I/II)も論文オリジナルを PDF から切り出して載せている。本文に書かれていない事項は補わない。著者の GitHub 実装コードは情報源にしていない。

一言で

JUmPER は、Jupyter のセル実行に性能計測を組み込んだ Jupyter カーネル。セルを実行するたびに CPU / GPU / IO / メモリといったシステムメトリクスを自動収集し、実行したユーザコードとひもづけて保存して、Jupyter 内の magic コマンドでその場で対話的に可視化する(粗粒度モニタリング)。さらに必要なセルだけ Score-P によるコード計装を有効化して、trace / profile などの詳細な性能イベントも取れる(細粒度分析)。計装モードで生じるカーネルのオーバーヘッドを、並列 marshalling と in-memory(pipe)通信で削減しつつ、探索的プログラミングの体験を壊さないことを重視している。先行研究 Werner et al. 2021(Bridging) の Score-P カーネルを拡張したもの。

背景・動機

問題と課題(区別して整理)

関連研究(位置づけ)

提案手法:2モードを持つ Jupyter カーネル

JUmPER は Score-P Python カーネルを拡張した Python 実行カーネルで、設定は Jupyter 慣習どおり magic コマンドと環境変数で行う。次の二層のインタフェースを持つ(Fig.1)。

  1. Monitoring(常時オン):CPU 使用率・GPU 使用率・IO バイト/操作・メモリ使用率を記録。
  2. Instrumentation(必要時のみ):Score-P で性能イベントを記録。

JUmPER の全体像(Fig.1)

原論文 Fig.1:性能モニタリングは常時有効でシステムメトリクスを集める。Score-P は計装モードでのみ使われ、trace / profile などの追加データを与える(右側のパスは計装モードのみ)。

(1) Monitoring モード(常時)

(2) Instrumentation モード(必要なときだけ)

Score-P 実行時のインタプリタ状態の永続化(Fig.2)

原論文 Fig.2:%%execute_with_scorep で実行する際、IPython カーネルプロセスと Score-P プロセスの間で、Python インタプリタ状態を marshalling/unmarshalling して受け渡す(往路で渡し、復路で戻す)。転送はファイル経由かメモリ内(pipe)で行える。

Multi-cell モード・write-file モード

カーネル実行オーバーヘッドの削減

計装モードでは、インタプリタ状態の永続化(marshalling)に伴うオーバーヘッドが生じる。先行研究と違い全セルではなく Score-P で実行するセルだけ永続化が要り(他セルは稼働中の IPython にそのまま渡す)、モニタリングのオーバーヘッドも無視できる。永続化のコストを抑えるため2つの手を打っている。

1. 並列 marshalling

2. In-memory(pipe)通信

ユーザインタフェース

設定・操作は magic コマンドと環境変数で行う(Table I)。可視化は matplotlib(ズーム・移動できる対話的グラフ)と itables(index/タイムスタンプ付きのコード履歴)を使い、表示メトリクスはドロップダウンで選べる。Multi-cell モードではグラフのどの部分がどのセルかも示す。計測データは %%perfdata_to_json / %%perfdata_to_variable で JSON や Python 変数に書き出せる(ここでは VSCode/PyCharm の独自 UI ではなく標準の Jupyter Web インタフェースを前提)。Score-P の trace / profile は Vampir(小さい trace なら Pipit)で表示する。

JUmPER の magic コマンドと環境変数(Table I)

原論文 Table I:主な magic コマンド(コード履歴・グラフ表示、エクスポート、marshalling 設定、Score-P 引数、multi-cell、write-file)と環境変数(JUMPER_SAMPLING_RATE:メトリクス収集のサンプリングレート、JUMPER_MIN_REPORTS:セルを保存するのに要るデータ点数=import や関数定義のような軽いセルを捨てて計算負荷の高いセルに絞るための設定)。

マルチノード対応

性能モニタはモジュール式で、Slurm のようなバッチスケジューラ環境では srun でジョブ割り当て内の各ノードに接続してメトリクスを集めるカスタムモニタを定義でき、ssh で分散ノードに繋ぐ構成も可能。ただしプロセスレベルのメトリクス監視は並列化機構の知識(並列プロセスの ID 取得)が要り難しい。著者らの ZIH JupyterHub では直近1年で 92% が単一ノード利用、単一ノードジョブのうち 60% が GPU を1つ以上、37% が複数 CPU、21% が両方を使う。よって本研究は単一ノードで複数 CPU・1つ以上の GPU を使うジョブを主対象とする。マルチノードでは純粋なシステムメトリクスより並列部分間の相互依存が重要になり、その場合は MPI ベースのマルチノードに対応する Score-P を使う Instrumentation モードが有効(多くの ML フレームワークは各プロセス起動時に MPI_Init すれば対応可能)。

評価

実験は TU Dresden ZIH の JupyterHub(AMD EPYC 7352 の 8コア・64GB RAM・3.5TB ローカル NVMe・Nvidia A100 GPU 1基)で実施。ここでは Jupyter セッション全体が単一の Slurm ジョブとして動くため、複数割り当て間の状態永続化は不要で JUmPER を容易に統合できる。

(1) 並列モンテカルロ・シミュレーション

π を推定する単純な例。independent な反復を Python multiprocessing で複数コアに分散する。最初のセルで compute_pi と import を定義し、次のセルで 10⁹ 反復を4コアに分散して呼ぶと、JUmPER のサマリが CPU 使用率がおよそ 50%(半分のコアしか使っていない)と表示。そこで次のセルで同じ反復数を8コアに分散するとほぼ 100% になる。Fig.3 はコード履歴と性能データの表示例で、同じコードを再実行しても index は上書きされず別タイムスタンプの新エントリが追加される。コードを index ごとに pretty-print でき、セル[11](4コア・約50%)とセル[12](8コア・ほぼ100%)の CPU 使用率グラフを見比べられる。コード履歴と計測データをセルごとに並べて持てることが、対話的 HPC での性能エンジニアリングの肝になる。

コード履歴と性能データの表示(Fig.3)

原論文 Fig.3:2つのセル実行に対する各種 magic コマンドの出力。セル実行後の性能サマリ、%%display_code_history のコード履歴(index・タイムスタンプ)、%%display_code_for_index のコード表示、%%display_graph_for_index の CPU 使用率グラフ(4コア時は約50%、8コア時はほぼ100%)。

(2) GPT 風 ML モデルの学習

PyTorch で小さな GPT 風モデルを1エポック・縮小データセットで学習する例(先行研究 Werner et al. 2021 の NLP 例)。学習セルに %%execute_with_scorep を付ける。%%display_graph_for_last の出力(Fig.4)では、GPU 使用率が高い一方、一部 CPU は稼働・他はアイドル、主記憶は約 28GB 使用、データの読み(学習入力)と書き(モデル保存)が見える。

ML 学習後のグラフ表示(Fig.4)

原論文 Fig.4:ML モデル学習後の %%display_graph_for_last 出力。CPU 使用率(左上)、GPU 使用率(右上、ほぼ100%)、メモリ使用量(左下、約28GB)、I/O 操作(右下)が対話的グラフで表示され、メトリクスはドロップダウンで選べる。

さらに学習セルの性能データを Score-P で記録し、Vampir で表示したのが Fig.5。タイムライン(x 軸)×複数スレッド(y 軸)で、CUDA カーネル(赤)、PyTorch 関数(黄)、CPU 上の CUDA 同期(紫)、I/O セレクタ(緑)、スレッド待機(青)が色分けされる。初期化後、CUDA カーネルが GPU 上で計算(CUDA[0:7] スレッド)、PyTorch 演算は CPU 上で周期的に CUDA 同期しながら実行され、Orphan thread 1 が I/O を担う。Orphan thread とは、Score-P Python bindings が Python 内部のスレッド管理を捕捉しないため、Score-P がスレッドの開始/終了を知らされていないスレッドを指す。

ML 学習の trace(Fig.5)

原論文 Fig.5:PyTorch による ML 学習の trace を Vampir で表示(左:タイムライン、右:関数グループごとの累積排他時間)。

(3) オーバーヘッド削減の評価

並列 marshalling の実行時間(Fig.6)

原論文 Fig.6:ディスク/ファイルベースの並列 marshalling の実行時間(並列度 1–16 コア × データサイズ 24/48/96GB)。S=合計、M=marshalling、U=unmarshalling。marshalling 部分(M)は並列度を上げると縮むが、unmarshalling 部分(U)はほぼ一定。

ファイル vs メモリ内通信の実行時間(Table II)

原論文 Table II:24GB を並列 marshalling した際の実行時間(1–16 コア、ディスク vs メモリ内)。低並列度では in-memory が速く、16 コアではディスクが速い。

先行研究との関係

まとめ・今後

Q&A

(まだなし)

自分のコメント