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

前回、Ubuntuホスト上でLXDで構築したコンテナとのGPU共有に成功した。今回はUbuntuホスト上にLXDでCentOSコンテナを作成し、そのコンテナとGPU共有を試みる。うまくいけばUbuntuホスト、Ubuntuコンテナ、CentOSコンテナの3者で自由にGPUを利用することができる。これがうまくいけばGPUを利用するソフトウェアをrpmパッケージだろうが、debパッケージだろうが利用可能ということになる。ソースからコンパイルすれば、どちらのディストリビューションでも使えるんだけど、構成管理を考えるとパッケージ使えた方が楽だからね。



GeForce GTX 1080 AMP Edition (ZTGTX1080-8GD5XAMP01/ZT-P10800C-10P)
価格 : 71,258円(税込、送料無料)
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側のドライバを以下のように入れ替える。

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に戻して、今後の検証を続行することにする。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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