Cumo/NArray をつかってみた

(Cumo/NArray によって生成された画像(GIMPによる加工あり))

https://github.com/sonots/cumo

 結論から言うと、思ったよりよかった。

 Cumo/NArray とは、RubyでGPUを使って行列計算するためのライブラリ。開発している方の所属をみると、PFNとかDeNAがちょっと関わっているようである?

 世の中のGPUの90%ぐらいは、GPUをゲームシーンの表示のために使っていると思う。残りも多くは、3Dレンダリングなど、画像・動画表示編集ソフトなどに使われているだろう。

 そこからさらに少ない人が、GPUで仮想通貨のマイニングをしたり、DeepLearningをしている。マイニングやDeepLearningのアルゴリズムを自分で考えるのは普通無理なので、他の人が書いた行列計算のセットを実行している人がほとんどだと思う。

 GPUでカスタムな行列計算を大量にしようとか思う人はもっと少ない。

 そういう行列計算をたくさんする人は、だいたい科学者とか、コンピュータのエンジニアとか、そういう特殊な人たちだ。コンピュータに詳しくない人も詳しい人が行列計算をする必要に迫られた場合でも、まずは信頼性と情報量の多さを考えてPythonとかC言語とかを使うのが普通なので、RubyでDeepLearningとも仮想通貨とも関係がない高速な行列計算がしたい人は世界でも、まあ、多く見積もって10〜30人ぐらいしかいないんじゃないかな。

 そういう、世界全体でもほとんど発生しない、すごくニッチな需要が、昨日エンジニアでもなんでもなく趣味でパソコンをやってるだけの自分の中で発生した。自分の中で発生すればそれは1件でも100%である。よって、はじめてCumo/NArray をつかってみた。

 そもそも何でいままでCumoを試してこなかったかというと、メインのパソコンをUbuntu 18.10 に移行したからだ。18.10には公式のCudaが提供されておらず、インストールが面倒くさい状況になっていた。DeepLearning で遊ぶためだけにUbuntuをダウングレードして手元の環境を壊すのもちょっとな…と思った。

 それに Cumo/NArray にも期待していなかった。ひとたびGPUが絡むと、Tensorflowのように有名なライブラリですら、Cudaのバージョン、Pythonのバージョン、Anaconda、Ubuntuのバージョン、必要なライブラリやらアップグレードやらで、インストールやコンパイルは複雑怪奇・悲喜こもごもになる傾向がある。もはや個人で遊ぶには迷惑な存在なのである。Docker とかAWSとか知らんし。

 ところが、先日Numo/NArrayでちょこちょこ遊んでいる(Pythonのコードを参考に参考に書き写した)Gray-Scottのモデルの計算があまりにも遅いので、どうにかしたいと感じるようになった。何しろ、ちょっと大きな画像を得ようとすると、それだけで結果が出るまで半日かかる。

 そこでいよいよ Cumo/NArrayでも使ってみますか(それでだめだったらcupyでも試してみるか)、ということになったのである。気は進まなかったが、GeForce GTX 980 Ti を搭載したちょっと昔の自作PCを立ち上げて、Cudaアップグレードして、Cumo/NArray をインストールしてみた。

 結論から言うと、インストールは拍子抜けするほど簡単だった。

これがまず予想外。エラーがたくさん出てインストールできないと思っていた。エラーが出ても、ユーザーが少ないのでStackOverFlowを頼ることはできない。途中で挫折して、GitHubのissue欄に「エラーが出てインストールできません > < (Help me!)」というクソコメを残して撤退する予感があったので、あまりに簡単にインストールが終了して拍子抜けした。

 インストールは成功したように見えたが、ちゃんと動作するかまるで信用できなかったので、rake compile を実行してあからさまなエラーが発生しないことを確認した。さらに rake test まで自分で実行してみた。これ、普段なら絶対にやろうとも思わないやつである。全部パス。ここでまたびっくりした。

 しかし、本当にこいつGPUで動いているのか? もしかして、GPUが使用できないときは、バックグラウンドでNumo/NArrayやRubyで計算してヌカ喜びさせているだけちゃうんか?という不安が襲ってきたので、ターミナルで watch -n 1 nvidia-smi を実行。テストの実行中に見事にGPUの使用率が上昇しているのを確認した。最初からちゃんと動いていたのである。ここまでインストールしただけだが、感動の連続であった。

 そして、Numo::NArrayのコードをCumoに置き換えたが、これがまた普通に動く。メソッド #linespace と #clip には対応していないようだが、ちょっと書きかえればいいだけなので大きな問題にはならない。むしろ予想したよりも広くNArrayの基本的なクラスやメソッドをカバーしているみたいでとてもよい。

 さらに、計算速度も早い。実は、計算速度も全然期待していなかったのである。WebGLを利用して行列計算をしているというgpgpu.js の公式サイトに、5倍ぐらい高速になりますよ、と書かれていたので、Cumo/NArrayも5倍ぐらい高速になればいいかな〜と思っていた。ところが、ディープラーニングでCPUをGPUに切り替えたときのアレみたいに、普通にめちゃくちゃ計算が早くて!!また感動してしまった。

 このようにCumo/NArrayを使ってみた印象はとてもよかった。最初からあまり期待していない方、インストールに対する感動の閾値が低くなっている方にはおすすめです。(もうちょっと遊んでいると印象が変わってくるかもしれないけれども)

 使ってる人があんまりいないと思われるので、とりあえずブログを書いてググラビリティを側方支援、と。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です