GPUで実行されるIPOPTのような制約付き非線形最適化ライブラリはありますか?


8

私のチームの誰かがIPOPTを並列化したいと考えています。(少なくともその機能のいくつか)。それまたは同様のパッケージのGPU実装を見つけることができませんでした。また、ドキュメントには何も見つかりませんでした。

だから問題は、GPUにすでに実装されている代替案があるかどうかです。または、少なくとも誰かがGPUに移植して、一緒に作業できるようにしていますか?

回答:


12

tl; dr:文献からの私の一般的な印象は、スピードアップは控えめなものです(存在する場合)。これらのメソッドで表示されるメインカーネルは、スパースダイレクトメソッド(スパースLU、スパースLDLTなど)であり、メモリアクセスは不規則です。これらの特性は、GPUの使用には適していません。また、パラレルIPMはまだ初期段階にあります。私はまだ人々がGPU実装に取り​​組むのではないかと思っていますが、私はそれらから多くが来るのではないかと疑っています。(ただし、分散メモリIPMは少し有望で便利なようです。)


数人がGPUの内点法(IPM)に取り組んできました。

  • Smith、Gondzio、およびHallは、線形プログラム(LP)用のIPMを開発し、4〜10倍の高速化を実現しました。
  • JungとO'Learyは、LPのIPMの線形代数カーネルのいくつかを調べ、テストセット内のより大きな問題でGPUの適度な高速化を確認します。

一般に、この論文では、彼らの研究を高度に調整されたLPソルバーと比較していません。JungとO'Learyはlinprogと比較します。linprogはほとんどの開業医の選択ではありません。Smithなどの論文をスキャンして得た印象は、シリアル内点法がゼロから作成されたというものです。HallはオープンソースのLPソルバーに非常に関与していることを考えると、その作業をもう少し真剣に受け止めます。そこにあるより優れたオープンソースLPソルバーの1つは、ホールが維持しているClpです。彼らがそのコードを使用した場合、名前で言及されます。したがって、これらのコードが、最先端ではない1回限りのシリアル比較ではなく、既に高度に調整されたソルバーを加速している場合は、さらに注意を払います。

そうは言っても、既存の作業はLP向けであり、IPOPTがそうであるので、おそらく非線形プログラミング(NLP)ソルバーを求めているでしょう。NLPソルバーのケースについて私が知っていることは次のとおりです。

  • IPMの並列化は一般的に困難です(LPおよびSOCPの場合は、Elementalを参照してください。一般的なIPMには、SOCPバージョン(またはQPバージョン)のようなものを使用します。
  • NLPに明確な構造がない場合(たとえば、確率的プログラムではない、境界付きブロック角度構造が明確でない、PDEの前提条件がよく知られているPDE制約付き最適化問題ではない) 、最良の線形代数法には、通常はGPUアーキテクチャには適さない(前述の)不規則なメモリアクセスを伴うスパースダイレクト法(LU、LDLTなど)が含まれます。
  • NLPに明らかな構造がある場合は、慣性を明らかにする因数分解を必要としない慣性のないラインサーチアルゴリズム(ChiangとZavalaによる最近の研究に基づいて構築)を使用する必要があるため、既知の前提条件を使用して支援することができます。 Karush-Kuhn-Tuckerシステムを解く
  • 私が知っている利用可能な最良の並列行列内点法は、ゴンジオ(実装論文、 理論論文)とWaechterらによる方法です。(大規模な内点概観論文大規模な内点法の実装についてさらに詳しく説明する論文); 構造を活用するペトラ、ザヴァラ他によるアルゴリズムもあります(構造化非凸最適化論文内点法論文のシューア補完)。

ほとんどの研究は、分散メモリの場合の並列処理に取り組んでいるようです(これは十分に困難です)。LPおよびQPソルバーの共有メモリのケースにはいくつかの作業があります。これは、その作業が商用コード(たとえば、Gurobi、CPLEX、Xpress)になるためです。既存の作業は興味深いですが、特別なアプリケーション(例:機械学習、GPUにより適したさまざまなアルゴリズムを使用できる機械学習)を除いて、GPUに魅力的なものはまだありません。


LPのIPMの並列化は、まばらなコレスキー分解を並列化することになります。これは、特にGPUの場合、十分に保存された問題ではありません。LPのシンプレックスメソッドの並列化ははるかに困難であり、その領域で役立つ作業はほとんどありません。大規模なLPを並列で解決する場合は、おそらくIPMを使用することになります。
ブライアンボーチャーズ、2015年

1
SDPの場合、各反復で因数分解する必要のある行列はほとんどの場合密であり、コレスキー因数分解は共有メモリマシンで適切に並列化します。このマトリックスの構築も、並列化がかなり簡単です。したがって、最大64程度にプロセッサの番号を持つSDPのための内点法で共有メモリマルチプロセッサ上で適度に良好な並列スピードアップを取得することが可能です(限り私が行ってきたように。)
ブライアンBorchersの

cuSolverはNVidiaのcudaソルバーのセットであり、コレスキー分解に基づくcsrlsvcholのようなAPIを提供します。docs.nvidia.com/ cuda / cusolver
Andrew Hundt

@GeoffOxberry一部のリンクが機能していません。
T ....

1

一般に非線形最適化は、そのステップアルゴリズムが非常に逐次的であるため、並列化が困難です。GPUはCPUよりも低速であるため、高度な並列処理(つまり、数千のスレッド)として問題が発生した場合にのみ速度が向上します。したがって、GPUに非線形ソルバーを配置することによる高速化の大部分(または通常、それよりも遅い)は期待できません。だれもそれをうまくやっていない理由であり、ほとんどの人はそれを試さないでしょう。

一方、目的関数と制約関数が高度に並列化(またはベクトル化)された方法で計算できる場合、GPUで目的関数と制約関数を解くことで大幅な高速化を実現できます。これは、コードの最も難しい(そして最も並列な)部分でGPUアクセラレーションを使用するため、非線形最適化でGPUを使用する一般的な方法であり、おそらく最も効率的です。


1

パーティーには少し遅れますが、簡単に言えば、GPUの内点法を並列化することは可能ですが、それが成功するかどうかは、問題の構造によって異なります。既存のソフトウェアに関しては、Optizelleはそれを行うことができます。近い将来に新しいリリースが発生するまで、開発ブランチを入手してください。

元の問題に等式または不等式が含まれているかどうかによって、状況は少し異なります。これにはさまざまな方法がありますが、不平等制約のみの問題に対してこれを行う最善の方法は、不正確な信頼領域法ニュートン法と主双対内点法を組み合わせることです。

不等式の場合のみ、基本的な不正確な信頼領域ニュートン法は、NocedalとWrightの数値最適化(175ページ)またはConn、Gould、およびTointの信頼領域法(205ページ)にあります。このアルゴリズムは、本質的には、Byrd、Hribar、およびNocedalによる論文890ページの大規模な非線形計画のための内点法からの修正された切り捨てCG法を使用した二重内点法。個人的には、彼らが内点システムをどのように設定するのが好きではないので、私は彼らの内点公式を使用しませんが、それが好みです。NITROは優れたアルゴリズムです。内点の詳細に関しては、Optizelleのマニュアルにその方法が説明されています。更新されたマニュアルを投稿するべきだろう

不等式と等式の両方の制約がある場合、最良のアルゴリズムは、平等制約付き最適化のための行列なしの信頼領域SQP法というタイトルの論文で、HeinkenschossとRidzalの不正確な信頼領域複合ステップSQP法を組み合わせることです。基本的に、内点法に取り組むプロセスは、準正規ステップも保護する必要があることを除いて、制約なしの場合とほぼ同じように機能します。

並列化の機会に関しては、上記で参照したアルゴリズムは、これらのアルゴリズムを行列なしで実装できるため、うまく機能します。具体的には、問題に対するOptizelleの実装

minxX{f(x):g(x)=0,h(x)0}

ユーザーが実装を提供する必要があります

  • f(x),f(x),2f(x)x

  • g(x),g(x)x,g(x)y,(g(x)x)y

  • h(x),h(x)x,h(x)y,(h(x)x)y

これらの実装がどこから来たか、どのように並列化されたかは関係ありません。これらは、共有メモリ、分散メモリ、またはGPUで実行できます。それはどうでもいい事です。特定の問題に最適な方法は、構造によって異なります。さらに、ユーザーは線形代数を提供する必要があります

  • init: Memory allocation and size setting
  • copy: y <- x (Shallow. No memory allocation.)
  • scal: x <- alpha * x
  • axpy: y <- alpha * x + y
  • innr: innr <- <x,y>
  • zero: x <- 0
  • rand: x <- random
  • prod: Jordan product, z <- x o y
  • id: Identity element, x <- e such that x o e = x
  • linv: Jordan product inverse, z <- inv(L(x)) y where L(x) y = x o y
  • barr: Barrier function, barr <- barr(x) where x o grad barr(x) = e
  • srch: Line search, srch <- argmax {alpha \in Real >= 0 : alpha x + y >= 0} where y > 0
  • symm: Symmetrization, x <- symm(x) such that L(symm(x)) is a symmetric operator

これらの操作は、シリアル、パラレル、分散メモリ、共有メモリ、またはGPUで実行できます。それはどうでもいい事です。何が最適かは、問題の構造によって異なります。

最後に、線形システムがあり、提供できる3つがあります。

  • 前提条件2f(x)
  • 左の前提条件g(x)g(x)
  • 正しい前提条件g(x)g(x)

これらの各プレコンディショナーは、シリアルまたはパラレル、分散メモリまたは共有、またはGPUに実装できます。基本的に、最初の前提条件は、最適化システムに関連付けられた切り捨てCGシステムの前提条件です。最後の2つの前提条件子は、複合ステップSQPアルゴリズムに関連付けられた拡張システムの解決に使用されます。一般的に、ここでパフォーマンスを最大化できます。制約ある種のPDEを表していると想像してください。次に、の前提条件は、順PDEソルブとそれに続く随伴PDEソルブに対応します。正方形の場合、gg(x)g(x)(g(x)g(x))1=g(x)g(x)1。明示的な時間積分器を備えた有限差分法などの多数のPDE公式の場合、これらの解はGPUで非常によく並列化できます。

最後に、Optizelleのアルゴリズムは、境界、2 次錐、半確定制約を含む対称錐問題で機能します。それにもかかわらず、一般に、線形円錐ソルブはそれを実行する傾向があります。基本的に、線形円錐ソルブは、コレスキー因数分解できる非常にコンパクトなシステムに対して実行される実行可能性と最適性のソルブを減らす可能性があります。Optizelleは非線形システムで動作するため、実際にはそれができません。少なくとも、私には方法がわかりません。その上、Optizelleが処理できるSDPブロックのサイズには制限があります。オペレーターlinv上記は、SDP行列の逆行列を必要とし、その逆行列は、大きなブロックに対して非常に高価です。さらに、コレスキー分解を必要とする追加の安全ガードがあります。これらの因数分解は、GPUでは実際には適切に並列化されません。少なくとも、並列化がうまくいく実装については知りません。とにかく、一番下の行は、それが線形コーンプログラムである場合、CSDPやSDPT3のような線形コーンソルバーを使用することです。

TLDR; Optizelleを使用します。これは無料のオープンソースであり、BSDライセンスを取得しています。私はそれを5億の変数のようなものにスケーリングしましたが、それはうまくいきました。私はGPUで実行しましたが、問題なく動作しました。それがGPUでうまく機能するかどうかは、上記の操作がGPUで適切に並列化されるかどうかに依存します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.