フレクトのクラウドblog re:newal

http://blog.flect.co.jp/cloud/からさらに引っ越しています

VirtualGLでクラウドGPUリモート3Dワークステーションを作る

みなさんこんにちは。先端技術室の佐藤です。 今回はクラウドGPULinuxリモート3Dワークステーションを作るお話を紹介したいと思います。

(手順だけが知りたい方は、こちら。紆余曲折にお付き合いいただける方は、そのままお読みください。)

話の経緯

みなさんは、ある日業務要件で「3Dビジュアルワークステーション」が必要になったら、どうやって調達しますか?筆者が昨年遭遇したのはそのような状況でした。大きなCADデータが届き、確認する必要が生じたのです。身の周りには残念ながら、ゲーミングPCの類はありませんでした。会社のラップトップで開こうとした同僚からは「全然開けない。熱くて、ファンの音もすごくて、燃えそう。」という悲鳴が聞こえてきます。

こんな時に便利なのが「Virtual Workstation(以下、仮想ワークステーション)」で、AWSなどのクラウドベンダから各種提供されています。クラウド側でGPUを接続したインスタンスを起動し、仮想デスクトップで接続するものです。画像がネットワーク越しになりますのでゲームなどの動きの激しい用途には向きませんが、動きの少ない緻密な3D表示が求められる用途には向いています。今回もこれで行けそうでした。

しかしマニュアルを読み込んでいた筆者は、ふと疑問に思うことがありました。インスタンス価格はLinuxの方が安い(WindowsはOSの利用料金が上乗せされるため)が、そのLinuxの仮想ワークステーションにどうやったら画面をつなげるのか、どこにも書いてないのです。Google Cloudのマニュアルにかろうじて書いてありましたが、有償の仮想デスクトップソフトを利用するものであり、別途お金がかかります。できるだけ安く済ませる方法はないものでしょうか。

VirtualGLを知る

方々ググって見つけたのが、VirtualGLでした。しかしこれが、難しい。いえ、基本的に、仮想ワークステーションは難しいのです。普通は画面に出力する画像(フレームバッファデータ)を回収し、ネットワーク経由で仮想デスクトップクライアントまで送信しているのです。GPUベンダが特別なドライバを用意してしつらえるもので、野良環境のLinuxで組み上げるには相当な知識が求められます。

ギブアップしてWindowsで済ませようと思った筆者でしたが、一方で、Linuxでできたら、おもしろいだろうなぁ、とも思え、VirtualGLの研究を続けていました。

VirtualGLの原理はこうです。実行ファイルが起動する時に、Linux OSが提供する特別な環境変数を設定し、OpenGLの描画命令(システムコール呼び出し)をVirtualGLのライブラリにフックします。フックした先では物理スクリーン(通常は$DISPLAY=:0)に向けてこの命令を実行し、描画結果画像を回収します。そして仮想デスクトップ側のスクリーン($DISPLAY=:1など)に向けてこの画像を送信します。こんな曲芸のような仕組みがうまくいくものなのでしょうか?しかしVirtualGL自体は開発が継続しており、それなりに評価されているように見えます。

物理スクリーンはどこに?

ところで、クラウドインスタンスに物理スクリーンはあるのでしょうか?もちろん、ありません。一方で、例えばVirtualBoxなどの仮想化ソフトにUbuntu Linuxなどをインストールし、開いた画面(=仮想化ソフトが用意した仮想ハードウェア)には、物理スクリーンがあります。先ほどの話ですと、物理スクリーンがないと、VirtualGLの仕掛けは成り立ちませんので、クラウドインスタンスでは、VirtualGLは実行できないことになります。

これには本当に困ったのですが、VirtualGLやXOrgに関する巷の文書を読み漁り、また手元環境を方々観察していると、徐々に解決の糸口が見えてきました。

筆者は今回に限らずクラウドインスタンスを仮想デスクトップで利用しているのですが、Ubuntu 18.04の/var/logにあるログを見ると、Xorg.0.log、すなわち物理スクリーンに対応するログが出ており、エラー終了していました。他のログと照らし合わせると、起動時に「LXDE lightDM起動 -> Xorg物理スクリーン初期化 -> デバイスが見つからず終了」となっているようです。それならば、GPUに対応するドライバをインストールすれば、クラウドインスタンスでも物理スクリーンが成立するのではないか?試してみたところ、これがうまく行きました。

VirtualGLが動いた!

方々調査の末にたどり着いた手順の概要は、以下のようなものです。

  1. GPU付きのインスタンスを作成する。OSはUbuntu18.04LTS。
  2. LXDEと関連ライブラリをインストール。
  3. GPUドライバをインストール。X設定スクリプトの実行。
  4. VirtualGLのインストールと設定。
  5. VNCをインストール

以下、それぞれの手順をみていきましょう。

1. GPU付きのインスタンスを作成する

筆者が試したのはGoogle CloudのCloud GPUです。小さなインスタンスにもGPUを付けることができ、安価に試せるので私はよく使っています。GPUは各種ありますが、一番安いNVIDIA Tesla T4を選びました。米国リージョンなら時間あたり0.35米ドル(執筆時)。1日8時間でも約300円です。

2. LXDEと関連ライブラリをインストール

sudo apt install \
  lxde  \
  build-essential \
  pkg-config \
  libglvnd-dev \
  libglu1-mesa

3. GPUドライバをインストール。X設定スクリプトの実行

Google Cloudでは、NVIDIA用のドライバが以下で公開されていますので、gsutilコマンドでローカルにコピーします(バージョンは執筆時点のもの)。

gsutil cp gs://nvidia-drivers-us-public/GRID/GRID12.0/NVIDIA-Linux-x86_64-460.32.03-grid.run .

内容も確認しましょう。

sha256sum ./NVIDIA-Linux-x86_64-460.32.03-grid.run
89d734014555f5cafc606a228d02388c556942b7a56d08aa08fbec4e55afbb6a  ./NVIDIA-Linux-x86_64-460.32.03-grid.run
gsutil cat gs://nvidia-drivers-us-public/GRID/GRID12.0/NVIDIA-Linux-x86_64-460.32.03-grid.run.sha256
89d734014555f5cafc606a228d02388c556942b7a56d08aa08fbec4e55afbb6a NVIDIA-Linux-x86_64-460.32.03-grid.run

sudo bash ./NVIDIA-Linux-x86_64-460.32.03-grid.run

nvidia-xconfig

4. VirtualGLのインストールと設定

wget -O virtualgl_2.6.5_amd64.deb https://sourceforge.net/projects/virtualgl/files/2.6.5/virtualgl_2.6.5_amd64.deb/download

sudo dpkg -i ./virtualgl_2.6.5_amd64.deb
apt install -f

sudo vglserver_config

1) Configure server for use with VirtualGL
2) Unconfigure server for use with VirtualGL
X) Exit

Choose:
1

Restrict 3D X server access to vglusers group (recommended)?
[Y/n]
n

Restrict framebuffer device access to vglusers group (recommended)?
[Y/n]
n

Disable XTEST extension (recommended)?
[Y/n]
Y

...

1) Configure server for use with VirtualGL
2) Unconfigure server for use with VirtualGL
X) Exit

Choose:
X

ここまできたら、リブートします。

5. VNCをインストール

sudo apt install tigervnc-standalone-server
vncserver
(パスワードを設定)
vncserver -kill :1

echo "vglrun startlxde" > ~/.vnc/xstartup
chmod 755 ~/.vnc/xstartup

vnvserver

つないでみる

tivervnc-viewerをインストールしてつないでみましょう。Firefoxを起動してabout:supportを確認すると、「WebGL 2 Driver Renderer: NVIDIA Corporation -- Tesla T4」が確認できました。WebGLのデモページで動作を確認してみると、CPUだけでは決してなし得ないスピードでオブジェクトが動きます。(とは言え、画像がネットワーク越しなので限界はありますが。)

f:id:masashi-sato-flect:20210219140234j:plain

クラウドの魅力

これで時間払いで利用できる3Dワークステーションが手に入りました。魅力はなんと言っても、初期投資がなく、単価もおそらく最低であることです。どんどん活用していきたいと思います。