未完放流

終わりなど無い、有るのは試練だけだ……

LXDコンテナで複数のCUDA環境を管理

Edward で確率プログラミングしたいと思い、GPUというかCUDAの恩恵を受けようとすると対応したマシンを準備する必要があります。 クラウドを借りれば関係が無いかもしれませんが、手元のマシンでは管理も重要になります。 GPU周りはバージョンアップが激しく何も考えずに使い始めると後々ソフトウェア間のバージョン齟齬で泣かされそうです。

どこか要領が悪い話な気もしますが理解が深まると思ってあきらめて勉強しましょう。

LXD の GPU path through を使うことで環境そのものをバージョン管理するが比較的容易ではないかという結論になりました。 ホストはGPUドライバのみが管理対象としコンテナにライブラリを保管させるという方針です。 プロジェクトも含めて "1 project 1 container" というのも分かり易いかもしれません。

OSは linux mint 18.3 を使って確認しておりますが、Ubuntu 系を使うならば LTS 版を使うのが無難だと思われます。 LXD のバージョンは 2.5 以上必要です。*1 ホストとゲストのOSの distribution & version は揃えておいた方が無難かと思われます。

GPU(CUDA)を使う

edward を CPUのみで使うのであれば、以下の2つのソフトの依存関係を満たせば良いので比較的簡単に使うことができます。

tensorflow > edward

GPU を使おうとすると、以下の5つのソフトの依存関係を満たす必要があり手間がかかります。

gpu driver > CUDA toolkit > cuDNN > tensorflow-gpu > edward

コードの確認だけであれば CPU 版を使う方がよいと思います。

2018年03月13日現在の最新バージョンを書きますと

soft version
nvidia driver R390
cuda toolkit 9.1
cuDNN 7.1
TensorFlow 1.6
Edward 1.3.5

ホスト側の準備 GPU driver & LXD

NVIDIA の開発サイクルは良く知らないですが半年に1回位は何かしら出ている気がします。 driver の更新頻度はもっと多いんでしょうね。

CUDA が動くのハードウェアは大体この辺りになると思います。 確認したのは GeForce のみですが Quadro でもほぼ同じだと思われます。 Tesla は知らん。

グラフィックカードなどの確認からドライバのインストールまで

ハードウェアがOSから認識されているかチェック。 NVIDIA とか chip 名が表示されるはず。

$ lspci | grep -i nvidia

OSセットアップ時に設定されたドライバは古いと思いますので、 新しいものを提供してくれるPPAを登録しておきましょう。 aptで入るようになります。 バージョンチェックもしておきましょう。

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ apt-cache seach nvidia-

殆どの場合、最新のドライバを使うと思います。 3月13日現在ならば、nvidia-390 が最新となります。

$ sudo apt install nvidia-390

ドライバに含まれる適当なコマンドを打って確認。

$ nvidia-smi

ここまでがホストでの操作になります。 念のためにCUDAをインストールしても動作確認しても良いかと思います。

LXD で GPGPU用コンテナを作成

現状では16.04 LTS で通常は2.0.x系が入るので、backport か snap でインストールしてください。

$ apt install -t xenial-backports lxd

次のステップに向けてCUDA 用コンテナを作成しログインします。

$ lxc launch ubuntu:16.04 cuda-9
$ lxc shell cuda-9
root@cuda-9$

コンテナ内でCUDAなど他のソフトをインストール

特に難しくはないですが時間が少し必要です。 このトピックに関しては、既に多くの方がまとめられているので最小限に留めます。

CUDA

NVIDIAのページ *2 通りにやれば問題ないと思います。 以下はレポジトリを登録して apt でインストールやり方です。

$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.*.**-*_amd64.deb
$ dpkg -i cuda-repo-ubuntu1604_9.*.**-*_amd64.deb
$ apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/********.pub
$ apt update
$ apt install cuda

:現在の TensorFlow (1.6) は CUDA 9.1 を入れると cuBLAS 9.0 が見つからないとエラーを返されるので CUDA 9.0 を入れました。

cuDNN

TensorFlow のインストールに必要です。 積和演算の効率化に使われているようです。

NVIDIAのアカウントを取らないとダウンロードできません。 E-mail で確認を取るタイプですが認証に少し時間がかかります。 私の場合は30分程度待たされました。

deb ファイルをダウンロードしてインストールしました。

TensorFlow & Edward

前回の記事*3では virtualenv で環境を分けましたが、今回はプロジェクト専用のコンテナと考えていますので使いません。 インストール方法はほぼ変わりません。

pip install tensorflow-gpu
pip install edward

コンテナに GPU を認識させる

ホストに戻り

$ lxc config device add cuda-9 gpu gpu

コンテナに入り

root@cuda-9$ /usr/local/cuda-9.0/extras/demo_suite/bandwidthTest

コンテナ内でCUDAの適当なDEMOを走らせ動くか確認。ただし Graphics は使えないのでCLIのみのものが良い。 ホスト実行時と同様のものがでれば成功。

失敗した場合、ホストにもCUDAを入れると成功するかもしれません。 筆者は何故かこれでうまくいくようになった。 何等かの通信をしているのだろうか? その後、CUDAは purge したのだが問題なく動いている。

まとめ

マシンが占有できるのならば、virtualenv, pyenv 等で充分かと思います。 マシンを共有したり他の言語、アプリと連携させる場合、virtualenv 等では間に合わない場面が出てくるかもしれません。

またCUDA, cuDNN, TensorFlow のバージョンを特定の組み合わせを保持したい場合にも役立つかと思います。

適当な組み合わせを template として残したり、古いバージョンで開発したものを新しい方で確認するという用途もあるかと思います。 またLXDの snapshot 機能を組み合わせて使うのも強力かもしれません。

ちなみ本来の目的の Edward ですが私の環境ではGPUよりCPUが2倍ほど速いという結果になりました。 GPUが古く、CPUが最新なのが原因だと思われます。 半導体の進歩には驚かされます。

また Edward が Google TPU で問題なく動くのか分かりませんが、最も速度がでて管理が楽かもしれません。

VMware ESXi などのハードウェアから仮想環境と比べると利便性では劣るが、使いかた次第では役に立ちます。

参考にしたページ

qiita.com

qiita.com

qiita.com