AI Navigate

[P] PyTorch Geometric の OOM でノートPCが動かなくなるのにうんざりしたので、RAM を完全に回避する C++ ゼロコピーグラフエンジンを作りました。

Reddit r/MachineLearning / 2026/3/15

📰 ニュースDeveloper Stack & InfrastructureTools & Practical Usage

要点

  • GraphZero v0.2 は、RAMを回避するために前処理済みグラフデータ形式 (.gl はトポロジー用、.gd は特徴量用) をメモリマッピングするオープンソースの C++ データエンジンで、OOM なしに大規模な GNN 訓練を可能にします。
  • 生 CSV を2つのコンパクトなバイナリ形式へ変換し、POSIX mmap を用いて SSD から直接 PyTorch にゼロコピー配列としてストリーミングします(nanobind 経由)。
  • 訓練中、PyTorch は RAM 上に大きなテンソルがあると見なしますが、OS はページフォールトを介して必要な 4KB ブロックのみをオンデマンドで取得します。
  • パイプラインを飽和させるため、C++ エンジンは OpenMP で隣接サンプリング(<code>batch_random_fanout</code>)をマルチスレッド化し、ディスク I/O、CPU サンプリング、GPU 演算を完全に並列化するように Python の GIL を解放します。
  • 結果として、50GB のデータセットで訓練できる一方、Python はデータセット自体に対して文字通り 0 バイトの RAM を割り当てません。
  • 私は低レベルのシステムエンジニアリングとメモリ管理を学ぶためにこれを作りました。リポジトリには、ゼロコピーのマウントをローカルでテストできる GraphSAGE 訓練スクリプトと合成データセット生成器が含まれています。
  • このコミュニティにはこれを徹底的に検証して、Python API の設計やパフォーマンスについて厳しいフィードバックをいただければと思います!
  • <strong>GitHub</strong>: <a href="https://github.com/KrishSingaria/graphzero">リポジトリ</a>

大規模なデータセット(Papers100M のような)でグラフニューラルネットワークを訓練すると、痛みをよくご存知だと思います。エッジリストと特徴量行列を読み込もうとすると、GPU が作業を始める前に瞬時に 24GB 以上の OOM 割り当てでクラッシュします。

私はこれを解決するために作成したカスタム C++ データエンジン GraphZero v0.2 を、公開オープンソース化しました。これによってシステム RAM を完全にバイパスします。

仕組み: 標準ライブラリはすべてをメモリに読み込もうとします。GraphZero は代わりに、生 CSV を 2 種類の高度に最適化されたバイナリ形式(.gl はトポロジー用、.gd は特徴量用)にコンパイルします。

次に POSIX mmap を使ってこれら巨大なファイルを SSD から直接メモリマップします。nanobind を使用して、C++ エンジンは生のメモリポインタを PyTorch にゼロコピーの NumPy 配列として直接渡します。

訓練ループ(GraphSAGE のような場合)では、PyTorch は RAM に 50GB のテンソルがあるとみなします。ターゲットノードのバッチをインデックス付けすると、OS のページフォールトが発生します。オペレーティングシステムは必要な 4KB ブロックのみを NVMe ドライブから自動的に取得します。

パイプラインを飽和させるため、C++ エンジンは batch_random_fanout の隣接サンプリングをマルチスレッド化して、OpenMP を用い、ディスク I/O、CPU サンプリング、GPU 演算を完全に並列化します。

結果: Python がデータセット自体に対して文字通り 0 バイトの RAM を割り当てることなく、50GB のデータセットを訓練できます。

私は低レベルのシステムエンジニアリングとメモリ管理を学ぶためにこれを作りました。リポジトリには、ゼロコピーのマウントをローカルでテストできる GraphSAGE の訓練スクリプトと、合成データセット生成器が含まれています。

このコミュニティには、これを徹底的に検証して、Python API の設計やパフォーマンスについて厳しいフィードバックをいただければと思います!

GitHub: リポジトリ

投稿者: /u/Important-Trash-4868
[リンク] [コメント]