Google colab で RubyからGPU を使って行列計算する

Google Colab に Cumo/NArray をインストールすることで、Google Colab上でRubyでGPUを用いた高速計算ができることがわかったのでメモを残します。


Google Colaboratory とは

Google Colaboratory はクラウドで実行できる無料のJupyter環境です。カスタムでインストールすることでJupyterカーネルがあるさまざまな言語を動かすことができると思われる。少なくともRubyは動く。


Cumo とは

PythonだとCupyに相当するものです。RubyにはNumo/NArrayという、Numpyとほぼ同等の機能をもつ数値計算ライブラリがあります。CumoはこのNArray互換のインターフェースをCUDAで動かせるライブラリです。


Google Colab のランタイムのGPUを有効にする

一番最初にGPUを有効にします。あとからGPUを有効にするとランタイムの環境がリセットされてしまうので、注意してください。GPUが有効でないランタイムにいくらRubyやライブラリを正常にインストールしても、GPU有効のランタイムでは動きませんし、その逆もしかりです。google colabはランタイム再起動や、時間切れで再起動した際に知らずに設定が切り替わってることがあり、ハマりやすいです。動かなくなったらまずこれを疑ってもいいかも知れません。


Google ColabでRubyを動かす

Google Colab で Rubyを動かしてみた を参考にGoogle ColabでRubyを動かせるようにします。


Cumo/NArray のインストール

Google Colab は2019年1月の時点で、CUDA9.2を使用しており、Cumo/NArray の公式READMEの指示通りでインストールされます。ただし、環境変数は1行ごとにクリアされているっぽいので、マジックコマンドは長々と続けて書く必要があるようです。もっといいやり方があったら教えてください。また、IRuby上ではマジックコマンドは動きませんのでRubyとは別にPythonノートブックを立ち上げて下記のコマンドは実行しています。コマンドが実行されたら、IRubyのランタイムを起動し直すとcumoがrequrieできるようになっているはずです。

(cumoのインストールには合計10分ぐらい時間がかかります)

!export CUDA_PATH="/usr/local/cuda" && export CPATH="$CUDA_PATH/include:$CPATH" && export LD_LIBRARY_PATH="$CUDA_PATH/lib64:$CUDA_PATH/lib:$LD_LIBRARY_PATH" && export PATH="$CUDA_PATH/bin:$PATH" && export LIBRARY_PATH="$CUDA_PATH/lib64:$CUDA_PATH/lib:$LIBRARY_PATH" && gem install cumo

上記でインストールされますが、ちゃんとCumoの機能が動くか確認したい場合、コンパイルに失敗してエラーが見たい場合は、下記のような感じにしてメッセージを表示させながらのコンパイルや、テストを実行することもできるようです。

!gem install bundler

!git clone https://github.com/sonots/cumo
!export CUDA_PATH="/usr/local/cuda" && export CPATH="$CUDA_PATH/include:$CPATH" && export LD_LIBRARY_PATH="$CUDA_PATH/lib64:$CUDA_PATH/lib:$LD_LIBRARY_PATH" && export PATH="$CUDA_PATH/bin:$PATH" && export LIBRARY_PATH="$CUDA_PATH/lib64:$CUDA_PATH/lib:$LIBRARY_PATH" && cd cumo && rake compile && rake test


補足

これでどこからでも無料でRubyからGPUで使うことができて個人的には満足です。ただし手元のコンピュータでは実行できたスクリプトもGoogle Colab上ではエラーが出る場合もあり、もう少し使ってみないと色々わからない面もあります。