Ubuntu 16.04 LTS インストール, CUDA, TensorFlow, Docker 等のセットアップ 20180913版

# 概要

- Ubuntu 16.04 LTS
- 日本語環境
- 開発環境(Python, TensorFlow, Docker 等)
- GPU(CUDA, cuDNN)
- 主にサーバとして使う(ssh で別マシンから接続)
- たまにデスクトップとしても使う
- 20180913 時点

という用途でのセットアップのメモです.

# 16.04 or 18.04?

20180913 時点では,

- [CUDA が公式で対応しているのは Ubuntu 17.10 まで](https://developer.nvidia.com/cuda-downloads) ([でも 17.10 用を 18.04 にインストールすることは可能だそうです](https://qiita.com/yukoba/items/4733e8602fa4acabcc35#cuda-92-%E3%82%92nvidia%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%8B%E3%82%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB))
- [TensorFlow のバイナリを使うなら CUDA 9.0 でないといけない](https://www.tensorflow.org/install/source#tested_build_configurations) (9.2 を使うには TensorFlow をソースからコンパイルする必要がある)

ということから当面 TensorFlow を使うには 16.04 でよさそう.

20180922 追記: Ubuntu 18.04 に対応した CUDA 10 がリリースされていた. あとは [TensorFlow が CUDA 10 に対応すれば](https://www.tensorflow.org/install/source#tested_build_configurations) 18.04 に移行できるかもしれない.

TensorFlow をソースからコンパイルする方法は以下を参照.

- [TensorFlow をソースからコンパイル 20180917版](https://qiita.com/Guwashi/items/d26f06ed45f9d740ffa2)



# ISO ダウンロード

日本語環境のために [Ubuntu Desktop 日本語 Remix](https://www.ubuntulinux.jp/download/ja-remix) の ISO を使う.

以下から `ubuntu-ja-16.04-desktop-amd64.iso` をダウンロード.

http://cdimage.ubuntulinux.jp/releases/16.04/

# インストール USB ディスク作成

Mac なら以下のページに従って [Etcher](https://etcher.io/) を使って ISO を USB ディスクに焼くのが楽.

https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-macos#0

あるいは `hdiutil` と `dd` で作成する場合は以下を参照. ただし, `dd` するディスク番号によく気をつけること!

https://qiita.com/kpkpkp/items/6664a1dba97198b984ec

# BIOS 設定

Ubuntu をインストールするマシンの BIOS 設定を変更して USB ディスクからブート出来るようにする. BIOS によるが以下の設定のどちらか or 両方でブート出来るはず.

- ブートするメディアの優先順位の設定で USB ディスクを最優先にする
- BIOS 起動時にキーを押してブートするメディアを選択する

なお, ASUS の P6X58D-E という結構古いマザーボードでは, BIOS ロゴ表示中に `F8` を連打してブートメディアを選択すると USB ディスクから起動できる.

無事インストールが終わったら元の設定に戻しておくとよいかもしれない.

# Ubuntu インストール

USB ディスクからブートして `Ubuntu を試す` を実行して問題なさそうなら `Ubuntu をインストールする` を実行.

以下を参照.

https://qiita.com/SUZUKI_Masaya/items/fbc10d437788dd95ad0d#ubuntu%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

パーティションの選択に特に気をつける! それ以外は基本的にデフォルトで OK.

# システムアップデート

`sudo apt update -y` すると `Error in 'appstreamcli': double free ...` というエラーが出るので, [このページ](https://www.hiroom2.com/2016/05/20/ubuntu-16-04%E3%81%AEapt-update%E3%81%A7appstreamcli%E3%81%8C%E5%9B%BA%E3%81%BE%E3%82%8B/)を参考に修正.

```bash
sudo killall -KILL apt.systemd.daily
sudo mv /etc/apt/apt.conf.d/50appstream /etc/apt/apt.conf.d/50appstream.disable
sudo apt update -y
sudo apt upgrade -y
sudo mv /etc/apt/apt.conf.d/50appstream.disable /etc/apt/apt.conf.d/50appstream
sudo rm /var/crash/*
```

改めてアップデート. `-y` はお好みで.

```bash
sudo apt update -y
sudo apt upgrade -y
sudo apt dist-upgrade -y
sudo apt autoremove -y
sudo apt autoclean -y
sudo apt clean -y
```

# 各種設定

## 日本語フォルダ名を英語に変更

以下を参照.

https://qiita.com/take5249/items/13ada73bbd01ee12a2c3

```bash
LANG=C xdg-user-dirs-gtk-update
```

## Emacs

```bash
sudo apt install emacs24
emacs  ~/.emacs.d/init.el
```

```emacs-lisp:~/.emacs.d/init.el

(set-language-environment "Japanese")
(setq inhibit-startup-message t)
(setq initial-scratch-message "")

(dolist (elt '((width . 80) (height . 60) (top . 0) (left . 0)
               (foreground-color . "white")
               (background-color . "black")))
  (add-to-list 'default-frame-alist elt))

;;; emacs -nw
(unless (eq 'x window-system)
  (menu-bar-mode -1))

;;; X
(when (eq 'x window-system)
  (tool-bar-mode 0)
  (set-frame-parameter (selected-frame) 'alpha '(85 50)))
```

## sshd

Ubuntu のターミナルで,

```bash
sudo apt install openssh-server
ssh localhost # テスト. ~/.ssh が作られて known_hosts が追加.
```

### 公開鍵認証

公開鍵認証でログインできるようにする.

別 PC のターミナルで (`user@ip` は Ubuntu のユーザと IP),　公開鍵を Ubuntu にコピー.

```bash
scp ~/.ssh/id_rsa.pub user@ip:~/.ssh/authorized_keys
ssh user@ip
```

パスワードなしでログインできれば OK.

### 最低限の sshd 設定

Ubuntu のターミナルで,

```bash
sudo cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.org
sudo emacs /etc/ssh/sshd_config
```

以下 3 箇所の該当行を変更. ポート変更, root ログイン不可, パスワード認証不可.

```conf:/etc/ssh/sshd_config
Port 10022
PermitRootLogin no
PasswordAuthentication no
```

変更箇所を確認して, 問題なければ sshd 再起動.

```bash
diff -u /etc/ssh/sshd_config.org /etc/ssh/sshd_config
sudo systemctl restart ssh
```

別 PC のターミナルで, 以下のようにしてポート指定してパスワードなしでログインできれば OK.

```bash
ssh -p 10022 user@ip
```

## OS 起動時の UI

サーバとして使うので GUI が必要ない場合は `multi-user.target`, デスクトップとして使いたい場合は `graphical.target` を指定.

```bash
sudo systemctl get-default
sudo systemctl set-default multi-user.target # or graphical.target
sudo systemctl get-default
sudo shutdown -r now # 再起動
```

## ロケール

色々なメッセージが日本語で出て面倒なので `C.UTF-8` にする. 日本語に戻すには `ja_JP.UTF-8` にする.

```bash
localectl set-locale LANG=C.UTF-8
exit
ssh -p 10022 user@ip
```

## GNU Screen

```bash
sudo apt install screen
emacs ~/.screenrc
```

```conf:~/.screenrc
# Encoding
defencodig utf-8

# Prefix Key
escape ^Jj

# set scrollback
defscrollback 1000000

# Delete start up screen
startup_message off

# Enable Auto detach
autodetach on

# alternate screen
altscreen on

# Enable mouse scroll
termcapinfo xterm* ti@:te@
```

`screen` を実行して `Ctrl-j d` でデタッチして `screen -r` でアタッチ出来れば OK.

# Python

[venv](https://docs.python.jp/3/library/venv.html) で仮想環境を作成してテストするところまで.

## Python 開発環境のインストール

```bash
sudo apt install python3-pip python3-dev
pip3 freeze
```

結構色々入ってる.

## venv のインストール

デフォルトでは入っていないので `apt` でインストール.

```bash
sudo apt install python3-venv
```

## venv のテスト

`#` 以下のコメントのようになれば OK.

```bash
which python3
which python # 2
which pip3
which pip # ない
python3 -V
python -V # 2
mkdir somewhere
cd somewhere
python3 -m venv venv # venv フォルダが作られる
source venv/bin/activate # プロンプトに (venv) が付く
which python3
which python # 3
which pip3
which pip # ある
python3 -V
python -V # 3
pip3 freeze # pkg-resources==0.0.0 だけ
deactivate # プロンプトの (venv) が消える
pip3 freeze # 色々出てくる
```

# TensorFlow GPU 版

TensorFlow 1.5 から 1.10.1 までのバイナリは CUDA 9.0, cuDNN 7 向けにコンパイルされているので, バイナリをインストールするのであればそのバージョンに合わせる必要がある.

https://www.tensorflow.org/install/source#tested_build_configurations

また TensorFlow 1.6 以降からは CPU の AVX というオプション付きでコンパイルされているので, AVX がない CPU の場合はソースからコンパイルするか 1.5 以前を使う必要がある. 自分の CPU に AVX があるかどうかは `cat /proc/cpuinfo` して `flags` を確認.

## CUDA 9.0

以下のページを参考に `cuda-9-0` と `cuda-drivers` をインストールする.

https://developer.nvidia.com/cuda-downloads
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
https://qiita.com/yukoba/items/3692f1cb677b2383c983

```bash
wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.2.148-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604_9.2.148-1_amd64.deb
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-9-0 cuda-drivers
```

`~/.bashrc` の末尾に以下を追加.

```~/.bashrc
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```

再起動して `nvidia-smi` で確認.

```bash
sudo reboot
nvidia-smi
```

## cuDNN 7.0.5

TensorFlow のバージョンによっては cuDNN 7.2 辺りをインストールしないといけないかもしれない. とりあえず TensorFlow 1.5.0 は cuDNN 7.0.5 で動く.

以下ページからユーザ登録して, 

https://developer.nvidia.com/rdp/cudnn-download

`I Agree To the Terms of the cuDNN Software License Agreement`, `Archived cuDNN Releases` の順にクリックして,

```
Download cuDNN v7.0.5 (Dec 5, 2017), for CUDA 9.0
```

をクリックして,

```
cuDNN v7.0.5 Runtime Library for Ubuntu16.04 (Deb)
cuDNN v7.0.5 Developer Library for Ubuntu16.04 (Deb)
cuDNN v7.0.5 Code Samples and User Guide for Ubuntu16.04 (Deb)
```

の 3 つをダウンロードする. 以下ページに従って進める.

https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#installlinux-deb

`.deb` をインストールする.

```bash
sudo dpkg -i libcudnn7_7.0.5.15-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.0.5.15-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.0.5.15-1+cuda9.0_amd64.deb
```

サンプルプログラムで cuDNN の動作を検証する.

```bash
cp -r /usr/src/cudnn_samples_v7/ $HOME
cd $HOME/cudnn_samples_v7/mnistCUDNN
make clean && make
./mnistCUDNN
```

`Test passed!` とでれば検証完了.

## TensorFlow GPU

以下を参考に Python3 の venv に TensorFlow GPU をインストールする (Python3 しか使わないので virtualenv ではなく venv).

https://www.tensorflow.org/install/install_linux#InstallingVirtualenv

```bash
python3 -V
pip3 -V
sudo apt install python3-pip python3-dev python3-venv
mkdir ~/tensorflow
cd ~/tensorflow
python3 -m venv venv
source ~/tensorflow/venv/bin/activate
```

最新版バイナリをインストールする. 20180912 現在 は `1.10.1` が最新.

```bash
pip install --upgrade tensorflow-gpu
python -c "import tensorflow as tf; print(tf.__version__)"
```

`1.10.1` と表示されれば OK.

ここで, AVX　が有効になっている CPU であればバージョン番号がでて正常に終了するはず. が AVX がない CPU の場合は `Illegal instruction (core dumped)` とでて実行できない([`1.6` 以降のバイナリは CPU の AVX というオプションを有効にしてコンパイルされている](https://www.tensorflow.org/install/install_sources)ため).

ここではひとまず AVX が必要ない `1.5.0` をインストールして動作確認する(なお, [`pip` からインストールできる `1.5.1` は AVX が有効になってしまっている](https://github.com/tensorflow/tensorflow/releases/tag/v1.5.1)ので注意).

```bash
pip install --upgrade tensorflow-gpu==1.5.0
python -c "import tensorflow as tf; print(tf.__version__)"
```

`1.5.0` と表示されれば OK.


# Docker

## Docker CE for Ubuntu

Docker の公式ドキュメント通りの手順でインストールする.

https://docs.docker.com/install/linux/docker-ce/ubuntu/

```bash
sudo apt-get remove docker docker-engine docker.io
sudo apt-get update
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"

sudo apt-get update
sudo apt-get install docker-ce

docker -v
sudo docker run hello-world
```

## `sudo` なしで実行できるようにする

https://docs.docker.com/install/linux/linux-postinstall/

```bash
grep docker /etc/group
sudo usermod -aG docker $USER
grep docker /etc/group
exit
ssh -p 10022 user@ip
docker run hello-world
```

## Docker Compose

以下ページに従ってインストールする.

https://docs.docker.com/compose/install/#install-compose

以下のページで最新リリースのバージョン番号を確認して `curl` の URL の該当部分を書き換える. 20180910 現在では `1.22.0`

https://github.com/docker/compose/releases

```bash
sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
```

## NVIDIA Container Runtime for Docker (nvidia-docker2)

以下ページに従ってインストールする.

https://github.com/NVIDIA/nvidia-docker

```bash
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
```

以上.