Technology

線形計画ソルバーcuOpt、GPUあたりのメモリー使用量を最大6分の1に

この記事のポイント

  1. 実現したこと

    最適化ソフトウェアcuOptの新ソルバーmPDLPで、線形計画問題をNVLink接続の複数GPUへ分散して解くことが可能になった。

  2. 実現の仕組み

    制約行列の疎な構造から変数間の依存関係を捉え、強く結び付いた計算を可能な限り同じGPUへ配置して通信を減らす。

  3. 得られた結果

    NVIDIAの測定では、非ゼロ要素数21億以下の問題で、GPUあたりのピークメモリー使用量が単一GPU版PDLPの最大6分の1になった。

  4. 従来との違い

    既存方式が疎行列・ベクトル積を個別に分散していたのに対し、mPDLPは連続する2つの演算の依存関係をまとめて扱う分割方式を採用した。

4基の汎用GPUを収めた計算機と、疎行列のまとまりをGPUごとに分け、2段階のベクトル演算へ渡す流れを示す図解イラスト。
AI生成画像

線形計画問題を複数GPUへ分散する新ソルバーmPDLPが、cuOptに加わった。連続する行列演算の依存関係を踏まえて計算を配置する。NVIDIAによると、非ゼロ要素数21億以下の問題で、GPUあたりのピークメモリー使用量が単一GPU版PDLPの最大6分の1になったという。

制約を満たす解を2つのベクトルで更新する

NVIDIAの最適化ソフトウェアcuOptに加わったmPDLPは、線形計画問題をNVLinkで接続した複数GPUへ分散する。線形計画では、線形の制約と変数の上下限を満たす範囲で、費用などを表す線形の目的関数を最適化する。

解を求めるPDLPは、勾配を使って反復的に計算を進める一次法だ。求める解を表す主変数のベクトルxと、制約に対応する双対変数のベクトルyを更新し、その更新を繰り返して解へ近づく。

行列演算の帯域を増やし、GPU間の待ち時間を抑える

反復の中心となるのは、ゼロの多い制約行列Aとその転置行列を使う疎行列・ベクトル積(SpMV)だ。yから次のxを計算し、そのxを使って次のyを計算する流れに、変数の範囲へ値を戻す射影や要素ごとの算術演算が組み合わさる。

SpMVの処理速度はメモリー帯域に制約されるため、複数GPUへの分散は利用できる帯域を増やす手段となる。一方で、GPU間通信の待ち時間や計算負荷の偏りが加わる。通信ライブラリNCCLは、NVLinkとGPU間接続を仲介するNVSwitchを利用して、GPU間の直接通信や集団通信を提供する。

連続する2つの演算を一緒に分割する

既存の分散方式D-PDLPは、制約行列を行方向と列方向に分け、各GPUへ部分行列を割り当てる。各GPUが計算した部分的な出力を通信で足し合わせ、元の行列に対応する出力を復元する方式で、SpMVをそれぞれ独立に扱う。

mPDLPの分割方式min-cut partitioningは、xとyを介して連続する2つのSpMVを一緒に考慮する。行列の疎な構造から、各出力の計算に必要な入力を捉え、強く結び付いた依存関係を可能な限り同じGPUに保つ。これにより、前の演算の出力を次の演算へ渡す際のGPU間通信を減らす。

GPUあたりのメモリー削減と大規模問題の高速化

NVIDIAの測定では、非ゼロ要素数を21億以下とした線形計画問題で、mPDLPのGPUあたりのピークメモリー使用量が単一GPU版PDLPの最大6分の1になった。この比較の対象は各GPUが必要とするメモリーであり、複数GPU全体の合計使用量ではない。

大規模ベンチマーク問題zib03には、1億400万を超える非ゼロ要素が含まれる。NVIDIAは、この問題を複数GPU上のmPDLPで解き、1年前と比べて解く速度が約10倍になったとしている。