LXD による GPU 共有 Ubuntuコンテナ編

何がしたいかというとホストOSが持つGPUをコンテナと共有するということ。この任意のリソースを共有できるというのが、コンテナの素晴らしいところ。KVMだと排他的にリソースを管理してしまうため、同じGPUをUbuntuとCentOSで共有なんて事は出来ないのだが、コンテナであれば同じリソースをホストOSと複数のコンテナで共有できてしまう。現在のホストOSはUbuntuなんだけど、Ubuntuコンテナは言うまでもなく、おそらくCentOSコンテナとも共有できる可能性がある。コンテナの特徴を生かすべく両OSでのGPU共有を成功させたい。



GeForce GTX 1080 AMP Edition (ZTGTX1080-8GD5XAMP01/ZT-P10800C-10P)
価格 : 71,258円(税込、送料無料)
by Yahoo! ショッピング

CentOS時代はコンテナにLXCを使っていたんだけど、せっかくUbuntuに乗り換えたので今回はLXDを利用する。中身はLXCなんだけどね。skylakeの内蔵GPUをホストOSとコンテナで共有させた時の経験から言うと、ホストOSとコンテナに同じドライバをインストールする必要がある。コンテナ側のドライバにおそらく意味はないんだけど、リソースを扱う上で同じソフトウェアが入っていないと動かせないので、結局ドライバごとインストールしてしまっている。つまり今回で言えば、UbuntuのホストOSとCentOSコンテナで同じドライバを入れる必要があるはずだ。

幸いなことにNVIDIAは以前からLinuxでの利用に対して協力的で、大体CentOS用とUbuntu用のパッケージが用意されている。今回使おうと思っているcuda 9.0のパッケージも両ディストリビューションのパッケージが用意されているのでこれを使ってみる。ホストOS側はdpkgでローカルリポジトリ用のパッケージを入れた後に、aptでcudaとcuda-driversをインストールする。
まあ、前回の記事に詳細があるので、そちらを参考にして下さい。続いて、UbuntuのゲストOSを構築して、デバイスをコンテナに引き渡してみる。

lxd init
lxc launch ubuntu: u01
lxc config device add u01 card1 unix-char path=/dev/dri/card0
lxc config device add u01 renderD129 unix-char path=/dev/dri/renderD128
lxc config device add u01 nvidia0 unix-char path=/dev/nvidia0
lxc config device add u01 nvidiactl unix-char path=/dev/nvidiactl
lxc config device add u01 nvidia-uvm unix-char path=/dev/nvidia-uvm

このような形で、ホストOS上のキャラクタデバイスをコンテナ側でも使えるようにする。このとき、ホストOSに2枚のGeForceをGTX 1080を刺していたので、デバイス名が標準的ではないかもしれない。そこは自分の環境に合わせて変更して下さい。コンテナ側の用意が出来たら、あとはホストOSで行ったと同じセットアップをコンテナでも実施する。dpkgでローカルリポジトリを用意してcudaとcuda-driversをインストールする。インストールが完了したら、nvidia-smiコマンドを使って、GPUの状態を確認してみる。

lxc exec u01 bash
dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb
apt update
apt install -y cuda cuda-drivers
nvidia-smi

問題なくコンテナ側からもGPUリソースにアクセスすることができた。せっかくなので、前回作ったnvenc対応のffmpegパッケージもインストールして、GTX 1080によるハードウェアエンコーディングも試してみる。パッケージはホストOS側からrsyncで持ってくる。dpkgでインストールしたらffmpegで変換速度を測ってみる。変換する動画もホストOSからコピるということで。ファイルは前回同様ガキの使いの30分動画。

rsync -avR host1:/usr/local/src/ffmpeg /
cd /usr/local/src/ffmpeg
dpkg -i *.deb

scp host1:~/gaki.ts ~
cd ~
time ffmpeg -y -i gaki.ts -f mp4 -tune film -vcodec nvenc -s 1280x720 -vf yadif -vb 4500k -acodec aac -strict -2 -ac 2 -ar 48000 -ab 128k -threads 0 h264.mp4

何の問題もなく、コンテナ上でハードウェアエンコーディングが出来た。もちろん処理時間が劣化するような事はまったくない。このリソース共有が容易というのが、本当にコンテナの魅力。うちの場合は、CPUもメモリもディスクも全て共有しているしね。KVMでリソースを切り刻むことにうんざりしている人は是非使ってみて欲しい。この調子で次回はUbuntuホスト上のCentOSコンテナに対してデバイスパススルーを行い、GPUの共有を試してみようと思う。楽しみ。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)