EC2(g2.2xlarge)でOpenGLを使う方法

EC2上でGPUを使って何かをさせるというのを比較的よく見かけるようになりました。

CUDA/OpenCLを使う例は多いですが、OpenGL(のオフスクリーンレンダリング)を使いたい場合もあると思います。例えば、WebGLを使う3Dコンテンツのサムネイル画像をサーバー側で生成したいとか、本当はCUDAのほうが適しているけどGLSLで書かれている資産を活用したいなどのケースです。

今回、私もOpenGLを使う必要が発生して、わりと苦労したのでその手順と注意点などを書いておきます。

より具体的にはg2.2xlargeで次のライブラリを使うアプリケーションを動作させます。

AMIの選択

まずAMIには仮想化の方式によってpravirtualとHVMの2種類があって、GPUを使うにはここでHVMの方を選ぶ必要があります。

この時点で大まかに2つの選択があって、

  1. Amazon Linux AMI with NVIDIA GRID GPU Driver on AWS Marketplace

  2. 「普通の」Linux (GPUドライバーなし)

1はドライバーはインストールされているのですが、3rd partyのライブラリはほとんどリポジトリになく、自前でmakeする必要があります。

一方2はライブラリ等は比較的簡単に入れられるものの、肝心のGPUのドライバー周りがなかなか動作しないという問題があります。

最初は2でubuntu/images/hvm/ubuntu-trusty-14.04-amd64-server-20140416.1をベースにやってたんですが、ドライバーはなんとかインストールできたもののmodprobe nvidiaが動かない(drm_openが見つからないとか言われる)ので断念しました。

1は面倒ですが、特に問題はないはずです。

GPUの動作確認とX11の起動

nvidia-smi -q -a

とすると以下のように表示されました。X11が動作していなくてもこれは表示されるはずです。

ここで

sudo xinit &

してもモニターがない的なことを言われるので、仮想スクリーンを設定する必要があります。

nvidia-xconfig --virtual=1280x1024 --use-display-device=none

とするとそれっぽい設定が/etc/X11/xorg.confに生成されるのですが、そのままでは動作せず、実際に動いてるファイルは次のような感じです(どの違いが重要なのかは特定していない)。

xorg.confを変更してsudo xinit &とするとX11は終了しないはずなので、

env DISPLAY=:0 glxinfo

とすると色々表示されて、特に下の2行が含まれていれば問題ないでしょう。

direct rendering: Yes

server glx vendor string: NVIDIA Corporation

OpenGLX11に依存しているので、他のアプリケーションでもDISPLAY=:0が必要です。

GLFWのバージョン

ここまでは順調なのですが、GLFWでwindowを作成しようと*1すると

X Error of failed request:  BadRRCrtc (invalid Crtc parameter)
  Major opcode of failed request:  140 (RANDR)
  Minor opcode of failed request:  22 (RRGetCrtcGammaSize)
  Crtc id in failed request: 0x8a6b90
  Serial number of failed request:  57
  Current serial number in output stream:  57

と言ってX11が落ちてしまいます。

どうもこれはglfw-3.0.4の問題のようで、https://github.com/glfw/glfw/issues/36 の後ろの方でもEC2で動かそうとして失敗したという人がいます。幸いなことにこの記事を書いている時点でのmasterでは正常に動作するようです(動作しました)。 

あとは好きなことが出来るはずです。

 

*1:フレームバッファーに描画する場合もOpenGLコンテキストを得るためにwindowは作る必要があります。