Ubuntu 16.04LTSにGPUが使える状態でKerasやTensorFlowをインストールする。TensorFlowとしては4つの方法が紹介されている*1が、大別すればDockerを使う場合とDockerを使わない場合(virtualenv, native pip, Anaconda)にわけられる。それぞれ必要なパッケージが違う為、何が違うかの一覧は次の表にまとめた。native pipはvirtualenvと同様なので記載していない。
Docker | virtualenv | Anaconda | |
---|---|---|---|
NIVIDIA Driver | 必要 | 必要 | 必要 |
CUDA | 不要 | 必要 | 必要 |
cuDNN | 不要 | 必要 | 不要 |
Docker | 必要 | 不要 | 不要 |
nvidia-docker | 必要 | 不要 | 不要 |
導入の容易性を考えると、ネイティヴで使いたいならAnaconda, そうでなければDockerといった所か。Wheel形式が増えてきたからvirtualenvもかなり導入が用意になったが、KerasやTensorFlowを使うようなユーザはJupyterも利用する可能性が高く、JupyterはAnaconda推奨となっている。
ここでは方式を問わず必要なNVIDIAのドライバのインストールをしてから、それぞれ導入方法を解説していく。なお、次の環境で試している。
CPU | Intel(R) Core(TM) i5-6600T CPU @ 2.70GHz |
Mem | 12GB |
GPU | GeForce GTX 750 Ti |
OS | Lubuntu 16.04.3 LTS |
NVIDIA driver | 361.42 |
Python | 3.x |
CUDA | V8.0.61 |
cuDNN | v6 |
NVIDIAドライバのインストール
標準のドライバで既にGPUは認識されているはずだが、CUDAを使うにはプロプライエタリなドライバを解する必要がある。そこでGPUのドライバをNVIDIAのドライバにしてやる必要がある。このくらいはGUIでもできる。[Preference]-[Additional Drivers]を選んでいくと次のような画面になる。nvidiaのドライバを選択してアプライすればよい。
個人的な趣味でtestedのnvidia-375をインストールしたが、nvidia-340でもCUDAやnvidia-dockerの要件を満たしているのでnvidia-340でもよい。
インストール処理が終了すると再起動が求められるので再起動をしてやる。再起動後に選択したドライバに切り替わっていればインストールは成功した事になる。次はドライバより上のレイヤのインストール処理になる。
Dockerを使う場合
NVIDIAが提供しているnvidia-docker*2を導入すれば、Docker上でならかなり簡単にGPGPUで遊べる。ここではDockerのインストール方法から紹介する。
Dockerのインストール
公式ドキュメント*3に従ってインストールする。
まず、事前パッケージのインストールとリポジトリの追加をする。
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ sudo apt-key fingerprint 0EBFCD88 $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
後は普通にaptで取得するだけで済む。
$ sudo apt update $ sudo apt install docker-ce
nvidia-dockerのインストール
後はgithubからdebパッケージを取得して、インストールをしてやるだけになる。
$ wget https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb $ sudo dpkg -i nvidia-docker*.deb && rm nvidia-docker*.deb
以下の要領でテストができるようだ。
nvidia-docker run --rm nvidia/cuda nvidia-smi
TensorFlowの利用
TensorFlowのコンテナ*4はタグによってPythonのバージョンやGPUの有無が管理されている。そこで次のようにすればPython3でGPUが使えるコンテナが8888ポートでJupyterが立ち上がった状態で起動する。
$ nvidia-docker run -it -p 8888:8888 tensorflow/tensorflow:latest-gpu-py3
しかしこの状態ではKerasは入らないし、Jupyterがローカルホストからしか使えない状態である。そのようにDockerfileとjupyter_notebook_config.pyを書き換えたりこれをベースイメージに新たなDockerfileを作ってもよいが、状況に応じて自分で一から作ってしまってもよい。NVIDIAがCUDA/cuDNNの各バージョンに合わせたDockerイメージを公開している(https://hub.docker.com/r/nvidia/cuda/)からこれをベースイメージにしよう。
Dockerを使わない場合
CUDAインストール
CUDA*5をダウンロードしてインストールして、テストしてみる。なお、exportしているパスはCUDAを使う場合には実質必須となるので.bashrc等に書いてしまってもよいだろう。
$ wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb $ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb $ export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}} $ export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64 ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}update_8.0.61-1_amd64-deb $ nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2016 NVIDIA Corporation Built on Tue_Jan_10_13:22:03_CST_2017 Cuda compilation tools, release 8.0, V8.0.61
更にCUDAには現在(2017/08/23)、パッチが公開されているのでこれも適用してやる。
$ wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/patches/2/cuda-repo-ubuntu1604-8-0-local-cublas-performance- $ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-cublas-performance-update_8.0.61-1_amd64-deb
Anaconda
minicondaのサイレントインストール
condaの最小構成のminicondaをインストールしてcondaを使えるようにする。
$ wget -O miniconda.sh https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh $ bash ~/miniconda.sh -b -p $HOME/miniconda $ export PATH="$HOME/miniconda/bin:$PATH" $ conda update conda
KerasやTensorFlowをcondaでインストール
TensorFlowのインストール手順でcondaでインストールする場合のリポジトリとしてconda-forgeを上げている為、ここではconda-forgeを使っている。なおcondaを使う場合はcuDNNが取得されるので後述するようなインストールは不要である。
$ conda create -n keras_tensorflow -c conda-forge -y python=3.6 keras tensorflow-gpu jupyter $ source activate keras_tensorflow
virtualenv
cuDNNのインストール
virtualenvでcuDNNが欲しい場合、自分でインストールしなければならない。cuDNNのダウンローダを取得するには開発者プログラムへの登録が必要である*6。用途等が聞かれるので素直に答えて登録してやればいい。
cuDNNの最新版はv7であるが、TensorFlowが現状で対応しているのはcuDNN v6なので次では6をインストールしている*7。
$ sudo dpkg -i libcudnn6_6.0.20-1+cuda8.0_amd64-deb $ sudo dpkg -i libcudnn6-dev_6.0.20-1+cuda8.0_amd64-deb $ sudo dpkg -i libcudnn6-doc_6.0.20-1%2Bcuda8.0_amd64-deb
隔離環境の構築とTensorFlow等のインストール
virtualenvwrapperでPython3の環境を作り、その中でTensorFlow等をインストールする。setuptoolsをインストールしているのはKerasの依存関係で取得されるTheanoが必要とするからである。早くWheel形式になって欲しいものだ。
sudo apt install python3-pip pip3 install setuptools virtualenvwrapper export WORKON_HOME=~/Envs mkdir -p $WORKON_HOME source /usr/local/bin/virtualenvwrapper.sh mkvirtualenv keras_tensorflow -p python3 pip3 install keras tensorflow-gpu jupyter
取り敢えず書いてみたが、金があるなら各クラウドサービスの機械学習系インスタンスをそのまま使ったほうがいいんじゃないですかね。
*1:Installing TensorFlow on Ubuntu | TensorFlow
*2:GitHub - NVIDIA/nvidia-docker: Build and run Docker containers leveraging NVIDIA GPUs
*3:Get Docker CE for Ubuntu | Docker Documentation
*4:tensorflow/tensorflow/tools/docker at master · tensorflow/tensorflow · GitHub
*5:CUDA Toolkit Download | NVIDIA Developer
*6:https://developer.nvidia.com/rdp/cudnn-download
*7:v7をインストールした場合、libcudnn.so.6がないというエラーになる為、次のようにリンクを張ってやる必要がある。sudo ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so.7.0.1 /usr/lib/x86_64-linux-gnu/libcudnn.so.6