Ubuntu 16.04LTSにKerasやTensorFlowを入れてGPGPUできるようにする

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のドライバを選択してアプライすればよい。
f:id:yyasui:20170817172732p:plain

個人的な趣味で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

取り敢えず書いてみたが、金があるなら各クラウドサービスの機械学習インスタンスをそのまま使ったほうがいいんじゃないですかね。