前回、Ubuntuホスト上でLXDで構築したコンテナとのGPU共有に成功した。今回はUbuntuホスト上にLXDでCentOSコンテナを作成し、そのコンテナとGPU共有を試みる。うまくいけばUbuntuホスト、Ubuntuコンテナ、CentOSコンテナの3者で自由にGPUを利用することができる。これがうまくいけばGPUを利用するソフトウェアをrpmパッケージだろうが、debパッケージだろうが利用可能ということになる。ソースからコンパイルすれば、どちらのディストリビューションでも使えるんだけど、構成管理を考えるとパッケージ使えた方が楽だからね。
by Yahoo! ショッピング |
lxd initによる初期設定は既に終わっているものとして、lxc launchにてCentOSコンテナを作成。尚、systemdでエラーが出るので、とりあえず作成時にsecurity.privilegedは有効にしておく。この設定についての是非はよくわかっていないです。そして、作成したコンテナにnvidiaのGPUに相当するキャラクターデバイスを引き渡す。これでubuntuコンテナと同様に、コンテナからGPUデバイスを参照できるようになる。以前にも触れたが、コンテナの場合リソースは共有され、排他ではない。
lxc launch -c security.privileged=true images:centos/7/amd64 c01
lxc config device add c01 card1 unix-char path=/dev/dri/card0
lxc config device add c01 renderD129 unix-char path=/dev/dri/renderD128
lxc config device add c01 nvidia0 unix-char path=/dev/nvidia0
lxc config device add c01 nvidiactl unix-char path=/dev/nvidiactl
lxc config device add c01 nvidia-uvm unix-char path=/dev/nvidia-uvm
作成されたコンテナにアタッチして、nvidiaの公式からダウンロードしたcudaのパッケージをインストールする。ダウンロードしたパッケージが/usr/local/srcに配置されているものとする。cuda-repo-rhel7-9-0-local-9.0.176-1.x86_64-rpmをインストールすると/varの下にcudaのローカルリポジトリを作成してくれるので、yumでcudaとcuda-driversをインストールする。epelにあるパッケージを幾つか必要とするので、その設定もしておく。インストールがうまくいったら、nvidia-smiで動作確認を行う。
lxc exec c01 bash
cd /usr/local/src
mv cuda-repo-rhel7-9-0-local-9.0.176-1.x86_64-rpm cuda-repo-rhel7-9-0-local-9.0.176-1.x86_64.rpm
yum install -y cuda-repo-rhel7-9-0-local-9.0.176-1.x86_64.rpm
yum clean all
yum install -y --enablerepo=epel cuda cuda-drivers
nvidia-smi
:
Failed to initialize NVML: Driver/library version mismatch
むむ、失敗してしまった。エラー文言からすると、versionが合っていないということらしい。cuda-driversのversionを確認すると384.81になっている。ホストOS側でnvidia-smiを実行してversionを確認すると、384.90になってしまっている。ubuntuもcentosも同じcudaにバンドルされたcuda-driversをインストールしたはずなんだけど。dpkgでよく確認すると、xenial-updatesリポジトリにcudaバンドルのドライバよりちょっとだけ新しい384.90のnvidia-384が存在していた。これか。。。
lxc exec c01 bash
rpm -qa cuda-drivers
:
cuda-drivers-384.81-1.x86_64
sudo ssh h01
nvidia-smi
:
| NVIDIA-SMI 384.90 Driver Version: 384.90
dpkg -l | grep nvidia
ii nvidia-384 384.90-0ubuntu0~gpu16.04.1 amd64 NVIDIA binary driver - version 384.90
ubuntu側でcuda-driversをインストールする際にパッケージ名はnvidia-384になってしまうため、より新しいxenial-updatesリポジトリのパッケージが選択されてしまったようだ。aptでインストールする際に、細かいバージョンを指定してcudaにバンドルされているnvidia-384をインストールできればうまくいきそうだけど。ubuntu力が低くてバージョンロックする方法を知らないので、ぐぐって調査。どうやらパッケージ名のあとに『=』で繋いでバージョンを指定すればよいらしい。ホストOS側のドライバを以下のように入れ替える。
ZT-P10800C-10P ZOTAC PCI-Express 3.0 x16対応 グラフィックスボードZOTAC GeForce GTX 1080 AMP Edition [ZTP10800C10P]【返品種別B】【送料無料】
|
apt remove -y cuda cuda-drivers nvidia-384
apt install nvidia-384=384.81-0ubuntu1 nvidia-384-dev=384.81-0ubuntu1 nvidia-opencl-icd-384=384.81-0ubuntu1 cuda cuda-drivers libcuda1-384=384.81-0ubuntu1
これで、CentOSのコンテナに戻ってnvidia-smiしてみると・・・動いた!素晴らしい。ここまでやってみて気付いたんだけど、これならホストOSがubuntuだろうがcentosだろうが関係ないということになる。ホストOSをubuntuに変えたのはopenstackを試したいというものもあったんだけど、幾つか試した結果、自宅で使うには大げさ過ぎるなという結論。QSVもまだ動かせていないし、一旦はホストOSをCentOSに戻して、今後の検証を続行することにする。