nvidia gpuで作るheadless x11 linux
DESCRIPTION
メガデモ勉強会 http://atnd.org/events/41216 で使用したプレゼンです。 NVIDIA製のGPUを使用したHeadless X11 Linux環境の構築についての解説になります。TRANSCRIPT
NVIDIA GPUで作るHeadless X11 LinuxPresident of REAL TiME XPRESS & RTX1911 demo divisionCoder, Graphics & Music artist, Director
Tomoki Shishikura (@T_SRTX1911)メガデモ勉強会 | SAKURA Internet | Jul 20, 2013
月曜日22日7月13年
最近のデモ
月曜日22日7月13年
最近のデモ
SCOTTIE - Nonoil & SystemK
月曜日22日7月13年
最近のデモ
SCOTTIE - Nonoil & SystemK
FPS
月曜日22日7月13年
最近のデモ
月曜日22日7月13年
最近のデモ
月曜日22日7月13年
最近のデモ
月曜日22日7月13年
最近のデモ
月曜日22日7月13年
問題点
•モダンなデモを開発するには、僕のMacBook Proでは遅すぎる。(Intel Core2Duo, 8GB RAM, NVIDIA 9400M)
•SCOTTIEは、0 ~ 4 FPSでしか動かなかった。(SCOTTIEはDirectXですが、参考程度に...)
•動かすのですら大変なのに開発となったら...
月曜日22日7月13年
やりたい事
•外でOpenGLのデモを作るとき、もっと快適に開発をしたい。
•外で重いシェーダー(GLSL)などを開発したい。
•CUDAとかも使いたい
•自宅にそこそこの環境があるし、どうにかならないのか...
月曜日22日7月13年
解決案
1.WindowsのRDPを使用する。
2.Linux の X11 Forwarding を使用する。
月曜日22日7月13年
Windowsマシンに
RDP (Remote Desktop Protocol)
で画面を転送してみる
月曜日22日7月13年
月曜日22日7月13年
結果
動くには動くが、使えない機能なども結構ある
(DirectXは動くので、そっちで開発する人はこれでいいかも...)
月曜日22日7月13年
解決案
1.WindowsのRDPを使用する。
2.Linux の X11 Forwarding を使用する。
月曜日22日7月13年
Linux の X11 Forwarding
を使ってみる
月曜日22日7月13年
月曜日22日7月13年
結果
いろんな事が一応できるが、HWの依存関係とかが...
CUDAも微妙 (グラフィカルな物は動かない)...
月曜日22日7月13年
解決案
1.WindowsのRDPを使用する。
2.Linux の X11 Forwarding を使用する。
月曜日22日7月13年
解決案
1.WindowsのRDPを使用する。
2.Linux の X11 Forwarding を使用する。
3. Headless X11 な Linux を使用する。
月曜日22日7月13年
Headless X11って何?
•Headless つまり、頭がない事(直訳)
•マウス、キーボード、モニター等を必要としないLinux環境
•VNC + SSH tunneling で手元のコンピューターへ画面を転送する
•速い、CUDAとかも使える。
月曜日22日7月13年
メリット•コンピューターに必要なスペースが少ない
•速い、普通のVNCとかより描画などが速い
•VPN などを使えば、外からでも高性能な環境が使える
•OpenGLでデモを作る人はこれで捗るね! (Linuxのウィンドウ周りのコードをかく必要があるけど...) ↑ (デモならGLUT使えばいいんじゃない?)
月曜日22日7月13年
デメリット
•ネイティブ環境と比べると、遅い
•たまに切れる (致命的、僕の環境ではVNCでターミナルを開くと、切れる)
•セキュリティ的に甘い (VPNなどを通してアクセスするの推奨)
•一人しか使えない (? 調査中)
月曜日22日7月13年
今回の設定環境
•VPNは、Mac OS X ServerのVPN機能を使用 (L2TP)
• Linux は、CentOS 6.4 を使用 (RHEL系がいい)
• AMD Athlon II X2, 4GB RAM, NVIDIA GTS250...
•設定などに Mac OS X 10.8 のターミナルを使用
月曜日22日7月13年
必要スキル
•基本的な Linuxスキル (コマンドライン)
• SSHなどを扱えるスキル
•まあトラブルを自己解決できる人なら大丈夫!
月曜日22日7月13年
VIM or EMACS
• Linuxのことを話すと必ずこれでなんか言う人がいるが...
はっきり言ってどうでもいい!
•GNU nano とか echo とか使えばいいんじゃないの (適当)
• (あ、ちなみに説明ではvimを使います。[not vim教])
月曜日22日7月13年
早速作ろう!
月曜日22日7月13年
流れ1. CentOS 6セットアップ
2. 初期設定(sudo)
3. ネットワークを自動起動させる
4. GPU driver setup
4-1. 下準備
4-2.ドライバーインストール
月曜日22日7月13年
流れ5. リポジストリの編集
6. X環境構築
7. Headless X11 構築
8. CUDA 環境構築
9. x11vnc 構築
月曜日22日7月13年
1. CentOS 6 セットアップ
•普通にセットアップします
•SSH などのパッケージは、必ず選択する事
•少しの間、キーボード、マウス、ディスプレイが必要
月曜日22日7月13年
2. 初期設定 (sudo)
•作業効率を上げるため sudo の設定をする。
• $ su
• # visudo
• [アカウント名] ALL=(ALL) ALL を追加
•保存して exit
月曜日22日7月13年
2. 初期設定 (sudo)
•以上でsudoが使えるようになる。
•以降 ユーザーのコマンドは、先頭に $スーパーユーザーのコマンドは、先頭に # を付けて説明する。
月曜日22日7月13年
3. ネットワークを自動接続させる•CentOSの起動時にネットワークを自動接続させる
• #vi /etc/sysconfig/network-scripts/ifcfg-[ネットワークデバイス名]
•自動接続させるため ONBOOT を yes にする
•保存した後、ネットワークを再起動する# /etc/rc.d/init.d/network restart
•ここからはSSHを使うとよさげ
月曜日22日7月13年
4. GPU driver setup
•これより、NVIDIAのドライバーをセットアップするのだが、Windowsなどと比べるといろいろ複雑なので、少し詳しく書く。
月曜日22日7月13年
4-1. 下準備
•標準では、nouveauドライバーがロードされている。
•Xが起動しているとドライバーの切り替えができないためXを止めるのだが、標準ではXがkillされると自動復帰するので、Xが自動起動しないようにする。
月曜日22日7月13年
4-1. 下準備
•まずは、自動でXが起動しないように設定をする。
• # vi /etc/inittab
• id:5:initdefault を id:3:initdefault に変更する。
月曜日22日7月13年
4-1. 下準備
•次にnouveauドライバーがロードされないようにする
• # vi /boot/grub/grub.conf
• kernelで始まる行の終わりに次の文を加える
• nouveau.modeset=0
•保存して # reboot
月曜日22日7月13年
4-1. 下準備
•以降、起動時のロード画面がかわる
•いったんログイン後にstartxでXをスタートさせ、フォルダの名前を英語にするか聞かれるので、英語に変えておく。
月曜日22日7月13年
4-2. ドライバーインストール
• $ cd Downloads
• $ wget [NVIDIAのドライバーのダウンロードURL]
•ダウンロード後、実行可能にするパーミッションを与える
• $ chmod +x [ファイル名]
月曜日22日7月13年
4-2. ドライバーインストール
•スーパーユーザー権限でドライバーをインストールする
• $ sudo ./[ファイル名]
•全部Yesとかの方を選ぶ、WARNINGはOKを押して進める
•インストール後、再起動
• # reboot
月曜日22日7月13年
5. リポジストリの編集
•今回のやり方はテストのため、セキュリティ的に望ましくない方法をしています。しっかりやりたい人は、自分で調べて...
•まずは、リポジストリを最も速いミラーに設定する。
• $ sudo -i
• # yum install yum-fastestmirror
月曜日22日7月13年
5. リポジストリの編集
•CentOSPlusを有効にする
• # vi /etc/yum.repos.d/CentOS-Base.repo
• [centosplus] の下にある enabled=0 を 1 にする。
•そして次の二つのリポジストリを追加する
月曜日22日7月13年
5. リポジストリの編集
[rpmforge]name=RPMforge RPM repository for Red Hat Enterprise Linuxbaseurl=http://ftp.riken.jp/Linux/dag/redhat/el6/en/$basearch/rpmforge/
gpgcheck=0enabled=1
月曜日22日7月13年
5. リポジストリの編集
[epel]name=EPEL RPM Repository for Red Hat Enterprise Linuxbaseurl=http://ftp.riken.jp/Linux/fedora/epel/6/$basearch/gpgcheck=0enabled=1
の二つを追加する。
月曜日22日7月13年
5. リポジストリの編集
•保存後リポジストリをアップデートする。
• # yum update
月曜日22日7月13年
6. X環境構築
•保存後リポジストリをアップデートする。
• # yum update
月曜日22日7月13年
7. Headless X11 構築
• nvidia-xconfig の --use-display-device=Noneによって、Headless X11 環境を構築する。
• --virtual=WxH で解像度を指定し、 --enable-all-gpus で全てのGPUを使用する。
• # nvidia-xconfig -a --use-display-device=None --enable-all-gpus --virtual=1280x800
月曜日22日7月13年
7. Headless X11 構築
•備考:
• udevが起動してなかったり、DeviceセクションにBusIDがないと、Xは起動しない。
• udevを起動させておくか、DeviceセクションにBusIDを記載しておく
月曜日22日7月13年
7. Headless X11 構築
•このままでは、ユーザー権限でXを起動しようとしたとき、PAM関連のセキュリティエラーが出て起動できないので、ユーザーでもXを起動できるように書き換える。
• # vi /etc/pam.d/xserver
• auth required の pam_console.so を pam_permit.so に変更
•これで起動できるようになる
月曜日22日7月13年
7. Headless X11 構築
• Linuxには、出力画面を選択する DISPLAY変数という物がある、基本的に、GPU0は :0.0 に設定されている。
•現在のDISPLAY変数は、以下のコマンドで確認できる。$ env | grep DISPLAY
•SSHのXForwardingを使用しているときのクライアント側の画面は localhost:10.0 などになってる事が多い.
月曜日22日7月13年
7. Headless X11 構築
•Xは以下のようにディスプレイ番号を指定する事もできる$ startx -- :0.0
•また、最後に & を付けるとバックグラウンドで開始できる$ startx -- :0.0 &
•DISPLAY変数を :0.0 にかえるには$ export DISPLAY=:0.0
月曜日22日7月13年
7. Headless X11 構築
• $ export DISPLAY=:0.0
• $ glxinfo
•OpenGL vendor string などの項目をみる事で、NVIDIAのドライバーが読み込まれているかどうかを確認する事ができる。
月曜日22日7月13年
7. Headless X11 構築
• $ glxgears
• 97157 frames in 5.0 seconds = 19431.389 FPS
•HWアクセラレーションがしっかりと効いているため、1万を超えるFPSが出る。
月曜日22日7月13年
8. CUDA 環境構築
•サンプルをmakeする上でglutが必要なのでインストールする
• $ cd ~/Downloads
• $ wget http://mirror.centos.org/centos/6/os/x86_64/Packages/freeglut-2.6.0-1.el6.x86_64.rpm
• $ wget http://mirror.centos.org/centos/6/os/x86_64/Packages/freeglut-devel-2.6.0-1.el6.x86_64.rpm
月曜日22日7月13年
8. CUDA 環境構築
• # rpm -ivh freeglut-2.6.0-1.el6.x86_64.rpm freeglut-devel-2.6.0-1.el6.x86_64.rpm
•これでサンプルをコンパイルする事ができる。
•以降OpenGLが使えるが、古いfreeglutなので、必要なら新しいバージョンを入れる
月曜日22日7月13年
8. CUDA 環境構築
•これよりCUDA 5.0 をインストールするが、ドライバーはインストールせずに、Toolkitとサンプルコードのみを入れる。
• $ cd ~/Downloads
• $ wget http://developer.download.nvidia.com/compute/cuda/5_0/rel-update-1/installers/cuda_5.0.35_linux_64_rhel6.x-1.run
月曜日22日7月13年
8. CUDA 環境構築
• $ chmod +x cuda_5.0.35_linux_64_rhel6.x-1.run
• # ./cuda_5.0.35_linux_64_rhel6.x-1.run
•ライセンスに同意するか聞かれるので、 accept と入力する。
月曜日22日7月13年
8. CUDA 環境構築• Do you accept the previously read EULA? (accept/decline/quit):
accept
• Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 304.54? ((y)es/(n)o/(q)uit): n
• Install the CUDA 5.0 Toolkit? ((y)es/(n)o/(q)uit): y
• Enter Toolkit Location [ default is /usr/local/cuda-5.0 ]: (Enter)
• Install the CUDA 5.0 Samples? ((y)es/(n)o/(q)uit): y
• Enter CUDA Samples Location [ default is /usr/local/cuda-5.0/samples ]: (Enter)
月曜日22日7月13年
8. CUDA 環境構築
• sample をコンパイルする
• $ cd /usr/local/cuda-5.0/samples
• # make -k
•MPI環境をインストールしていないので、1部のコンパイルに失敗するが、無視して進める。
月曜日22日7月13年
8. CUDA 環境構築
•CUDAを使う上で、パスを通さないといけないので以下の文を ~/.bashrc に書いておく
• export PATH=$PATH:/usr/local/cuda-5.0/bin
• export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-5.0/lib64
月曜日22日7月13年
8. CUDA 環境構築
•CUDA がしっかりと動作しているか、サンプルを動かしてみて確認する。
• $ cd /usr/local/cuda-5.0/samples/0_Simple/vectorAddDrv
• $ ./vectorAddDrv
月曜日22日7月13年
8. CUDA 環境構築
•Vector Addition (Driver API)> Using Device 0: "GeForce [なんとかなんとか]" with Compute 3.5 capability> findModulePath found file at <./vectorAdd_kernel64.ptx>> initCUDA loading module: <./vectorAdd_kernel64.ptx>> PTX JIT log:
•自分の使ってるGPUの名前が出てれば成功です。
月曜日22日7月13年
8. CUDA 環境構築
•複数のGPUを搭載している場合は、複数扱えているかをサンプルを実行して確認する
• $ cd /usr/local/cuda-5.0/samples/0_Simple/simpleMultiGPU
• $ ./simpleMultiGPU
月曜日22日7月13年
8. CUDA 環境構築Starting simpleMultiGPUCUDA-capable device count: 2Generating input data...
Computing with 2 GPUs... GPU Processing time: 13.682000 (ms)
Computing with Host CPU...
Comparing GPU and Host CPU results... GPU sum: 16777280.000000 CPU sum: 16777294.395033 Relative difference: 8.580068E-07
月曜日22日7月13年
8. CUDA 環境構築
• 2GPUs と表示されればしっかり機能しているといえる。
•たくさんのGPUを使う場合もほぼ同じかと思われます。
月曜日22日7月13年
9. x11vnc 構築
• x11vncを導入する事でやっと、Linux側の画面を手元のPCに表示させる事ができます。
• http://www.karlrunge.com/x11vnc/
月曜日22日7月13年
9. x11vnc 構築
• $ cd ~/Downloads
• $ wget http://x11vnc.sourceforge.net/dev/x11vnc-0.9.14-dev.tar.gz
• $ tar -zxvf x11vnc-0.9.13
• $ ./ configure
• $ make
• $ sudo make install
月曜日22日7月13年
9. x11vnc 構築
•以上でインストールは完了する。
•これで、Headless X11 Linux が完成する。
•もう、ディスプレイ、キーボード、マウスは外してしまって大丈夫!
月曜日22日7月13年
ひとまず完成
月曜日22日7月13年
Headless X11 Linux 使い方
•VNCのソフトウェアは、SSH Tunneling に対応したVNCクライアントを使用する。
•Mac OSだと、ChickenというVNCクライアントがSSH Tunneling にも対応していておすすめです。http://sourceforge.net/projects/chicken/
•もしくは、手動でSSH Tunneling してください。
月曜日22日7月13年
Headless X11 Linux 使い方 (1)
•まずはサーバーにSSHでログインする。そして以下の二つを実行
• $ startx -- :0.0 &
• $ x11vnc -display :0.0 -forever -auth guess -noxdamage &
•これで二つともバックグラウンドで開始されます。このコマンド実行後にexitでsshを切断するとプロセスは残るので、いちいち立ち上げるのめんどいという人にはいいかも
月曜日22日7月13年
Headless X11 Linux 使い方 (2)
•次にVNCクライアントで、SSH Tunneling を使用してサーバーにアクセスします。
•Tunnel over SSH などがそうです。
•これで、Headless X11 の画面が手元のPCに送られてきます。
月曜日22日7月13年
Headless X11 Linux 使い方 (3)
•試しに、CUDA の Particles を動かしてみます。
• $ export DISPLAY=:0.0
• $ cd /usr/local/cuda-5.0/samples/5_Simulations/particles/
• $ ./particles
•実行するとVNCの画面にひょうじされるはず。
月曜日22日7月13年
で、Headless X11 Linux で何ができるの?
月曜日22日7月13年
アドバンテージ
•OpenGL はクロスプラットフォームに対応なので、高速なLinux環境でデモを作って、あとになってWindowsのバイナリをビルドした方が、作業効率的にはいい。
•HWアクセラレーションがしっかり効くので、高速な回線さえあれば、ミニノートみたいなPCで開発ができる!
•すごく重い物を作るときは、これを使うとかなりいいかも
月曜日22日7月13年
できなかった事
•VNCでアクセスしてる先で、ターミナルが開けない.(export DISPLAY=:0.0 とかでコマンドを送ってあげるしかない)
•一部の設定などをすると突然切断されたりする。
•複数ユーザーにそれぞれデスクトップを割り当てる
月曜日22日7月13年
実際にアクセスし、
使ってみます。
月曜日22日7月13年
月曜日22日7月13年
デモ以外の活用法
•ゲームをサーバー側で走らせて、画面だけこっちに表示する
•ベンチマークとかするときに外からいろいろできる。
•ひとつのデスクトップで作業を共有する
•などなど...
月曜日22日7月13年
まとめ
• Linuxの基礎知識があるとHeadless X11 Linuxを構築して、比較的快適にOpenGLのデモが作成できる。
•環境に依存する事 (CUDAなど) も外で使える。
•デモ以外にも様々な使い道がありそうですね.
月曜日22日7月13年
THANKS
月曜日22日7月13年