現在位置: ホーム / みらくるブログ / LXC内でNVIDIA用OpenCLプログラムを実行する

LXC内でNVIDIA用OpenCLプログラムを実行する

Linuxコンテナ(LXC)を利用すると、ホスト環境と独立した(擬似的な)マシンを迅速に用意できるため、環境の破壊を恐れずに、様々なソフトウェアをインストールしたり、試行錯誤を行うことが容易になります。一方で、ホストマシンに接続されている周辺機器を使うためには、いくつかの設定が必要です。本稿では、LXC内でNVIDIAのGPUを用いたOpenCLプログラムの実行方法を紹介します。

マシン環境

本稿の内容を試したマシン環境を以下に示します。

項目内容
CPU Intel(R) Core(TM) i7-4790 CPU
GPU NVIDIA Corporation GK107 [GeForce GTX 650] (rev a1)
OS Ubuntu 14.04.3 LTS (64bit)

ホストマシンの設定

ホストマシンには、nvidiaおよびnvidia_uvmカーネルモジュールがロードされていればOKです。その具体的な方法を以下に記します。

NVIDIAのプロプライエタリドライバをインストールします。

$ sudo apt-get install nvidia-352-updates

 ドライバを有効にするために一旦リブートします。

$ sudo reboot
modprobeなどで個別にドライバをロードすると、必ずしもリブートが必要ではないのですが、すでにオープンソースのNVIDIA用グラフィックスドライバnouveauがロードされている場合、そのアンロードなどに若干煩雑な操作が必要なので、ここでは思い切ってリブートしました。

リブート後、次のようにnvidiaドライバがインストールされていればOKです。

$ lsmod | grep nvidia
nvidia               8646656  0
drm                   344064  4 i915,drm_kms_helper,nvidia

また、以下のモジュールもロードしておいてください。

$ sudo modprobe nvidia_352_updates_uvm

コンテナ(LXC)の作成

コンテナのOSには、ホストと同じUbuntu 14.04 LTSを使用します。

$ sudo lxc-create -t download -n name -- -d ubuntu -r trusty -a amd64

-nの後には、任意のコンテナ名を指定してください。また以下の説明では、nameの部分を適宜、実際の文字列に置き換えてください。

コンテナでGPUを使うための設定

/var/lib/lxc/name/configに以下の行を追加してください。

lxc.cgroup.devices.allow = c 249:0 rw
lxc.cgroup.devices.allow = c 195:0 rw
lxc.cgroup.devices.allow = c 195:255 rw

コンテナにGPU用のデバイスファイルを作成します。

$ sudo mknod /var/lib/lxc/name/rootfs/dev/nvidia-uvm c 249 0
$ sudo mknod /var/lib/lxc/name/rootfs/dev/nvidia0 c 195 0
$ sudo mknod /var/lib/lxc/name/rootfs/dev/nvidiactl c 195 255

ログインのための設定

$ sudo chroot /var/lib/lxc/name/rootfs 
root@name:/# passwd

一般ユーザーを作る場合、以下のコマンドを実行します。user_nameの部分を適宜変更してください。

root@name:/# adduser user_name

また、sshを使ってログインできるようにするには、以下のコマンドを実行しておきます。

root@name:/# apt-get update; apt-get install openssh-server

コンテナの起動とのソフトウェアのセットアップ

$ sudo lxc-start -n name
sshでログインする場合、上記のコマンドに-dオプションを追加して、バックグラウンドで実行してください。

以下、コンテナ内の操作ですので、ホストと間違えなようにご注意ください。

# sudo apt-get install nvidia-352-updates

lightdmがGUIを起動しようとすることがあるので、削除しておきます。

# dpkg --purge lightdm nvidia-prime
OpenCLプラログラムを実行するだけなら、ICDドライバパッケージ nvidia-opencl-icd-352-updatesのみをインストールして、巨大な依存をもつnvidia-352-updatesをインストールしないことも可能なようです。しかし、動的にOpenCLのカーネルコードをビルドするために必要なファイルlibnvidia-compiler.soが、このパッケージにあるため、多くの場合、インストールしておく方がよいでしょう。

clinfoで動作確認

 clinfoがインストールされていない場合、以下のコマンドでインストールしてください。

# apt-get install clinfo

clifnoを実行して、次のように表示されればOKです。

# clinfo
Number of platforms:                             1
  Platform Profile:                              FULL_PROFILE
  Platform Version:                              OpenCL 1.2 CUDA 7.5.23
  Platform Name:                                 NVIDIA CUDA
  Platform Vendor:                               NVIDIA Corporation
(以下省略)

カーネルコードの動的なビルド確認

最後に、カーネルコードの動的なビルドを含むサンプルコードを実行してみましょう。必要なツールやヘッダをインストールします。もちろん、すでにインストールされている場合、スキップできます。

# apt-get install g++
# apt-get install opencl-headers

次の3つのファイルをダウンロードして、ひとつのディレクトリに配置してください。

ビルド、実行してみてください。このテストプログラムは、ランダムな2つの数値の足し算をOpenCLを用いて行います。次の様な出力が得られれば、動的なビルドにも成功しています。

$ make
g++ testocl.cc -std=c++11 -lOpenCL -o testocl
$ ./testocl
Platfrom ID: 0x12fe550
Device ID: 0x12fe610
i: 0, 0.840188 + 0.394383 => 1.234571
i: 1, 0.783099 + 0.798440 => 1.581539
i: 2, 0.911647 + 0.197551 => 1.109199
i: 3, 0.335223 + 0.768230 => 1.103452
i: 4, 0.277775 + 0.553970 => 0.831745
i: 5, 0.477397 + 0.628871 => 1.106268
i: 6, 0.364784 + 0.513401 => 0.878185
i: 7, 0.952230 + 0.916195 => 1.868425
i: 8, 0.635712 + 0.717297 => 1.353009
i: 9, 0.141603 + 0.606969 => 0.748571

まとめ

本稿では、試行錯誤に適するコンテナ内で、NVIDIAのGPUを用いたOpenCLプログラムの実行方法を紹介しました。

タグ: