GPUコンピューティング脱落者から見たNVIDIA GPUの利用規約騒動

一週間ほど前から,NVIDIAがGeForceのデータセンタ利用を制限した話がネットを賑わしはじめた.おもしろいことになってるなと感じたので,私の経験と,それに照らし合わせて今回の騒動に感じた事を語りたくなった.記憶も記録も曖昧であるため,年寄りの昔話程度に読んでもらいたい.

ここでいうおもしろいとは,滑稽という意味ではなく,興味深いという意味合いである.この件で色々な対応を迫られている方々を蔑む意図は微塵もないことはご理解いただきたい.

今回の騒動に抱いた感想

俗っぽい言い方をすると「恋人がこちらをフって乗り換えた相手が意外に曲者で,元恋人が困っているのを眺める気持ち」だろうか.そのような経験をしたことはないし,恋人というほどNVIDIA社に固執しているわけでもないが.

事の発端

NVIDIAが規約変更によりGeForceのデータセンター利用を制限。大学などの研究活動にも大ブレーキ

これが最初の報告だろうか?NVIDIA社がGeForceのドライバの利用規約を変更し,データセンタでの利用を制限したというニュースである.

記事の中でも解説されているが,NVIDIA社のGPUには三つの製品ファミリがある.ゲーム用(家庭用)のGeForce,CG用のQuadro,そしてGPGPU用のTeslaである.GPGPUとはGeneral Purpose Computing on GPUの略で,本来は画像処理用のハードウェアであるGPU(Graphics Processing Unit)をそれ以外の一般的な用途に利用する行為をさす.GPGPUの中でも数値計算(物理シミュレーション)にGPUを用いる事を,特にGPUコンピューティングとよぶ.

今回の規約変更は,家庭用のGeForceを大量に詰んだサーバをデータセンタに置くことを止めさせたい意図があるようだ.

なぜ今更?

このニュースを読んだときにそう感じた.NVIDIA社は10年ほど前から,GeForceは家庭用であるため24時間の動作は想定してない.GPGPUにはTeslaを使って欲しいと言っていたからだ(もっとも,NVIDIA社から直接というより,GPGPU関係の学会でベンダからそう言われていたというのが正確だ).

そう念を押す理由は,身をもって理解している.きちんとチューニングしていないと,私の分野におけるシミュレーションプログラムは,大体はTeslaよりGeForceを使う方が速くなる.GeForceの上位モデルの方がTeslaより演算器(今ではCUDA Coreと呼ばれる)もメモリも動作周波数が高いためである.そのため,GeForceとTeslaに搭載される機能は差別化されている.物理シミュレーションで重要な倍精度演算器とメモリのエラーチェック機能はTeslaにしか搭載されていない.倍精度演算器がないと,倍精度実数の計算を単精度演算器等を使って処理する必要があり,実行に時間がかかる.また,メモリのエラーチェック機能がないと,一度メモリエラーが発生すると狂った物理量の値を使うことになるので,全く意味のない結果しか得られない.

上記のような理由があるので,GeForceはデスクトップなど手元のPCで使い,多人数がログインして利用するワークステーションやスーパーコンピュータにはTeslaが搭載されるという環境が当たり前の光景だった.

このような意識があるので,冒頭のニュースを見ても,なぜ今更?としか思わなかった.

GPGPUと私(Tesla世代)

私がGPGPUに取り組み始めたのは2009年頃で,CUDAのバージョンは2.2だったか2.3だったかは記憶が定かでない.秋葉原でGeForce GTX 285を6万円くらいで買ってきて,サンプルコードを動かし,取り寄せた論文や講演資料を読みながら行列行列積などを実装した.その頃,Tesla C1060は確か35万くらいだったと思う.1個10万円まで下がったタイミングで3個購入し,3個買っても1個より安いと思った記憶がある.これらを取り付けるために,ASUSのP6T Supercomputerというマザーボードを買ってきて,4GPUのシステムをこしらえた.電源は1200Wで,GPUからの発熱もすごく,ケースは開けっ放しで運用した.

念願のTesla C1060を取り付け,実装したプログラムを実行したが,GTX 285より遅かった.ハードウェアとしてはC1060とGTX 280が同じで,GTX 285はクロックアップされている分速かったのである.これはPoor Man's Supercomputerだと喜んだ.世にはTSUBAME 1.2というスーパーコンピュータがあり,Tesla S1070が大量に搭載されていたが,自身には使う機会はなく,それを使って発表される華々しい結果を見ながら,できる限り業務のプログラムに取り込もうと追いかけた.学会やカンファレンスに足繁く通って得た情報によると,一つのマザーボードに複数のGPUを接続すると,PCI-Expressを介した複数GPU間の通信がボトルネックになるので,小さめのPCに1台だけGPUを取り付け,そのPCでクラスタを組むのが効率的であることが分かった.私は落胆しながら4GPUのシステムから2枚ほどGPUを引っこ抜いて,スカスカになった筐体を眺めた.

この頃はこの世代のGPUをGT200などとモデル番号で呼んでいたが,次のFermi世代のGPUが出た頃から,GT200のTはTesla世代のTだと言われるようになった.Tesla世代のTeslaとFermi世代のTeslaというわかりにくい呼び方をすることになるが,現在のCUDAはすでにTesla世代のサポートを打ち切っており,Teslaといえば主に製品ファミリをさす.

2010年にAccelerated Computingというカンファレンスが開かれ,翌年以降,現在も開催されているGTC Japanにつながる.

GPGPUと私(Fermi世代)

予定からずいぶん遅れたがFermi世代のGPUとして,GeForce GTX 480が発表された.GPGPUに舵を切った世代であり,GeForceとTeslaに明確な差別化がはかられ始めた世代でもある.Fermi世代のTesla(Tesla C2xxx)には,キャッシュ,メモリのエラーチェック機能,倍精度演算器が搭載されていたが,GTX 480にはキャッシュ以外は搭載されなかった.そして,GTX 480はビッグダイで発熱も大きく,Direct Xへの対応も遅く,GPUとしての評価はむしろ悪かったように記憶している.そのころのAMD社(当時はまだATIブランドだった)のGPUの方が理論性能が高く,消費電力も少なかったので評価がよかった.

当然AMD社もGPGPUに参入し,開発環境も公開していた.自身も2度ほどAMD社の説明会に参加した(残念ながらその頃の資料は転職と引越で廃棄されている).一度目は,開発環境ATI Stream SDKを見て,実際にそれを使っている大学の先生(確か会津大学だった)の講演を聴いて,これはダメだと思った.C言語の拡張であるCUDAと比較して,まるでアセンブラを書くようなATI Stream SDKでは,私の業務プログラムをどうコードに落とし込んでいいか分からなかった.講演している先生が仙人のように思えてきた.ハードウェアにAMD社製のGPU,開発環境にCUDAを使えればどれだけよいかと思ったものである(その後,2015年頃にAMD社がCUDAをサポートすると発表している).そうこうしていると,ハードウェアに依存しない開発環境を目指したOpenCLが登場した.AMD社が開発環境をOpenCLに乗り換えたタイミングでまた説明会に参加した.業界的には非常に盛り上がった.私も挑戦したが,記述量が多く,性能もCUDAと比べると若干遅かった.そのうち話を聞かなくなってきた.後に開催されたワークショップでもそのことが言及されている.業績を求められる学術界では,目の前にGPGPUという未開拓領域が広がっているのに,わざわざOpenCLの成熟を待つ理由がなかったと推察する.いつの間にか,AMDはCPUとGPUを統合したAPUでいくという話になっていた.

本来の業務とは別にGPUを触っていた私にはGPUを買う予算は割り当てられなかったので,ほそぼそと私費でGeForceを購入していた.Tesla M2050が搭載された1Uのサーバを譲り受け,執務室において爆音の中使っていたが,私の作ったプログラムではGTX 580よりも遅い場合があった.倍精度演算器を搭載していても,メモリ転送の方が支配的な(バンド幅律速の)プログラムでは,倍精度演算器を効率的に動作させるデータ供給が間に合わず,単純にメモリクロックの速いGTX 580の方が速くなっていたようだ.データ転送能力と演算性能の比であるByte/Flop(あるいはFlop/Byte)の重要性を身をもって体感した.

GTC Japanでは,次のKepler世代の情報が公開されるようになり,GPUコンピューティングをより効率的にする機能の搭載に心躍らせた.

GPGPUと私(Kepler世代以降)

GeForce GTX 680が発売され,レビューを読むと,やはり倍精度演算の性能が抑えられていた.この世代のTeslaも値段がべらぼうに高く,もう個人では買える額ではなかった.そんな中で,GTX Titanが発売された.これは倍精度演算の性能が抑えられておらず,Teslaと同じ性能が出る.すぐさま購入し,新しく搭載されたshuffle命令などを試し,ベンチマークを取って性能を評価した.10万円したが,50万円を超すTeslaを買うことを思えば,安いものだった.Poor Man's Supercomputerの再来かと喜んだ.この世代が私の購入した最後のGPUになる.Pascal世代もVolta世代もスペックを調べてはいるが,無理して買おうとは思わない.ただ,Titan VはHBM2が体験できそうなので欲しいと思っている.

次のMaxwell世代では倍精度演算器は搭載されず,GPUコンピューティングの業界ではあまり話題に上らなかった.そして,GTC Japanではディープラーニングに関する話が多くなった.GPGPUが物理シミュレーション専用の技術ではなく,様々な分野で使われていたことを思えば,いくつかGPGPUの技術が成熟してくる分野が現れる.2010年台半ばにはほとんどの自動車会社がGPUクラスタを導入していると聞いていたので,CAE業界を半ば制したNVIDIA社が次の商機を探すのは当然のことと思われた(この時点でNVIDIA社を知らない日経に問題がある).倍精度演算が必要な物理シミュレーションよりは,単精度演算でも問題のないディープラーニングの方がGPUの性能がより発揮できるだろうし,NVIDIA社も安泰かなと感じた.私の足はGTC Japanから遠のいた.転職による分野の変更もあり,無理して参加するほどでもないと結論づけたからだ.

今回の騒動は,ディープラーニングという2匹目の大きな獲物にチクリとやられたように映る.

物理シミュレーションとディープラーニングの違い

大規模な物理シミュレーションを行うには,やはりTeslaが求められる.GeForceを使ったときにごく希にでもメモリエラーが起こると,シミュレーション結果が物理的に意味を持たなくなる.例えば,10000点の観測点で水が全て右向きに流れていなければならない状況で,どこか1点だけ左を向いている結果が得られると,それは「99.99%正しいのでよしとしましょう」とはならない.一方で,これは私の憶測であるが,ディープラーニングでは非常に大量の学習データを用いるので,ごく希にメモリエラーでどこかの数値が変化しても,学習が進むにつれて統計的に鈍されて影響が極めて小さくなるように思われる(これは間違っている,わずかな数値の変化も許されないというのであれば,ご指摘ください).そうすると,単精度でTeslaと差がない,むしろクロックアップなどでTeslaよりも速いGeForceの上位モデルを用いる事に何の問題もなくなる.それが今回の騒動の背景にあることだと理解している.この物理シミュレーションとディープラーニングの違いから,冒頭のおもしろいという言葉が出てきた.

NVIDIA社が物理シミュレーションの分野で行ったGeForceとTeslaの差別化が,ディープラーニングには通用しなかった.それでも個人でGeForceを買って取り付けて細々とやっている分にはよいお客さんだったのだろうが,ニュース記事によると,とある事業社がGeForceを大量に搭載して提供するサービスを始めたので,待ったをかけたくなったようだ.

結局どうするのがいいんでしょう?

私は完全に部外者なのでお好きなようにとしか言えないし,どう収束するかを完全に外野席から見守るだけである.この記事のようなヤジを飛ばしながら.

OpenCLが出た頃,CUDAは企業依存の開発環境なのでN社が辞めれば無駄になるが,OpenCLはオープンな規格なのでどこかがこけても大丈夫,という話を幾度も聞いた.AMD GPU+OpenCLがもっと存在感を発揮していれば今回の騒動はなかっただろう.なんだか(再燃し始めた)CPUにおけるIntelとAMDの競争を思い出す.

今回の規約変更で「金がない人は使うな」を暗喩しているのかというと,悔しいがその通りであろう.購入する予算を獲得できない人は降りるか,代替手段を模索しなければならない.

法律に明るい人が,規約変更がおかしいと訴えて使う権利を勝ち取ればよいのだろうか.デバイスドライバを書ける人が,GeForceのドライバを書けばよいのだろうか.AMDのGPUを使える人が,CUDAのコードを置き換えればよいのだろうか.数学が得意な人が,ディープラーニングに代わる軽量のアルゴリズムを開発すればよいのだろうか.静音ラックを導入して,執務室に置けばよいのだろうか.

私は金がなくてGPGPUから降りた.ディープラーニングが極めて重要な技術である事は門外漢の私でも理解できるので,日本が開発競争から取り残されないためにも今回の件が平和裏に解決することを願っている.

フリーライド?

この件で,みんな、これからは深層学習にはGeForceではなくRadeonを使おう という記事を読んだ.Radeonを使うことには大いに賛成だし,AMDは確か2015年にCUDAをサポートすると発表している.これで競争が起こって値段が安くなるのは歓迎したい.

1点だけ,”NVIDIA社が深層学習コミュニティやオープンソースコミュニティにフリーライドしてきた”というような記述があったが,これは(おそらく第3次ブームであろう)深層学習の発展を正確には知らない私にはどういうことか読めなかった.ハードウェアとしてのGPUの進展はそれなりに調べているつもりだが,NVIDIA社も深層学習コミュニティも共存関係を築いているように思えたからだ(今回の騒動までは).

GPUは元々画像処理を行うハードウェアであり,画像処理の性質に合うように,性能の低い演算器を大量に搭載し,太いメモリバンド幅を活かして並列処理をするハードウェアとして進化してきた.GPUには処理に応じた専用回路が搭載されていたが,回路の利用効率を上げるためにプログラマブルシェーダ→ユニファイドシェーダと進化している.固定化された処理だけを行うのではく,プログラムによって処理を記述できるようになったことで,GPU (Graphics Processing Unit)と呼ばれるようになった.

2004年に出版されたGPU Gemsではすでに2次元の流体計算が行われている.開発にはCg言語を用い,テクスチャを配列とみなしており,物理シミュレーションよりは画像処理感が強い.2007年頃にCUDAを発表して開発環境を整え,Teslaを製品ファミリに加え,Fermi世代からはGPGPUに大きく舵を切った.本来のGPUとしては余分な機能を載せることになり,GPUとしては上述のように評判が悪かった.それでも改善しながらGPGPUの路線を進み続けたから,アクセラレータとしてのGPUの地位がある.GPUの理論演算性能と理論バンド幅は年々上昇していたので,GPUの世代に特化したプログラムを作らなければ,GPUを新しい世代に取り替えるだけで速くなった.

加えて,NVIDIA社は毎年世界各地でGPU Technology Conferenceを開催して,かなりの費用をかけてGPUを計算資源として熱心に売り込んでいた.このような前提があった上で,深層学習のコミュニティが計算資源として着目し,GPUが期待通りの役割を果たしたから今のブームがあるのではないかと思うのだが・・・加えて,深層学習の有用性やインパクトに着目したNVIDIA社は,GTCのメインを物理シミュレーションからAIに切り替えている.固定回路を排除してGPUに進化したのに,Volta世代ではTensor Coreという半ばディープラーニング専用回路まで搭載している.こういう背景から,私はNVIDIA社と深層学習コミュニティは非常に良好な共存関係を築き,共に成長しているように思っていた(あくまで今回の騒動までは).もしかして私がフリーライドという言葉を勘違いしてる?

この記事が気に入ったらサポートをしてみませんか?