Ubuntu20.04 LTS+Docker+GPU【備忘録】

#概要
DeepLearning学習用環境構築のため、Ubuntu+Docker+GPU導入時のメモ。
デュアルブートではなく、一台のSSDあるいはHDDを搭載したPCにUbuntuを導入する手順について記録しておく。
# 1. Ubuntu導入
###LiveUSBの作成と起動
Ubuntuをダウンロードして、FAT32フォーマットしたUSBメモリーにisoを書き込む(MacならbalenaEtcherを使うと楽)。Ubuntuをインストールしたいマシンに、作成したLiveUSBメモリを接続してBIOSのBootMenuからUEFIモードで起動する。このとき、BIOSのセキュアブートは無効化しておくこと。
###インストール
Install Ubuntuを選択する。言語を日本語にすると、CUI操作時にフォルダ名が日本語だったりして個人的に気持ち悪いので言語はEnglishにする。
**【ポイント】** インターネットに接続しておいて「Ubuntuのインストール中にアップデートをダウンロードする」は必ずチェックする。2021/08時点最新版なら自動的にnvidia driver 470が導入されて、面倒なdriver選定の工程を減らせる。手動のドライバインストールだといろいろと問題が発生して再インストールするはめになったが、結局この方法で導入成功した。
####ネット接続について
私の環境では有線LANが使えないため、USBテザリングでデスクトップをインターネット接続して作業を実施した。TP LinkなどWifi受信用のデバイスドライバは後で設定したほうがいい。最初にWIFI端末の設定をするとGPUドライバをインストールしたときに、なぜかTP Linkとかbluetoothレシーバーが認識されなくなって積んだ経験がある。２回もUbuntuをクリーンインストールするはめになった。
###GPU認識の確認
インストールがうまく行くと、いきなりコマンドラインで「nvidia-smi」でGPUを認識していることが確認できる。今まではここにたどり着くまで苦労したが、非常に楽になった。私のマシンには２枚のGPU（Geforce GTX1080）が刺さっている。

```shell:bash
$ nvidia-smi
Wed Aug  4 09:13:26 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.57.02    Driver Version: 470.57.02    CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0  On |                  N/A |
| 60%   75C    P2   192W / 198W |   5028MiB /  8111MiB |     33%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA GeForce ...  Off  | 00000000:02:00.0 Off |                  N/A |
|  0%   43C    P8     6W / 198W |     11MiB /  8119MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A       973      G   /usr/lib/xorg/Xorg                 35MiB |
|    0   N/A  N/A      1654      G   /usr/lib/xorg/Xorg                140MiB |
|    0   N/A  N/A      1800      G   /usr/bin/gnome-shell               31MiB |
|    0   N/A  N/A      2104      G   ...bexec/gnome-initial-setup        1MiB |
|    0   N/A  N/A      2694      G   /usr/lib/firefox/firefox            1MiB 
|
|    0   N/A  N/A    178239      C   /opt/conda/bin/python            4707MiB |
|    1   N/A  N/A       973      G   /usr/lib/xorg/Xorg                  4MiB |
|    1   N/A  N/A      1654      G   /usr/lib/xorg/Xorg                  4MiB |
+-----------------------------------------------------------------------------+

```
# 2. Dockerインストール
以前はnvidia-dockerコマンドが存在したが、最新の環境ではnvidia-container-toolkitをインストールすれば通常のdockerコマンドでGPU認識させることができる。

```shell:install-docker.sh
#Docker
sudo apt-get update
sudo apt-get remove docker docker-engine docker.io
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
docker --version

# Put the user in the docker group
sudo usermod -a -G docker $USER
newgrp docker

# Nvidia Docker
sudo apt install curl
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
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-container-toolkit
sudo systemctl restart docker

# Check Docker image
docker run --gpus all nvidia/cuda:10.0-base nvidia-smi
```
# 3.Dockerイメージの取得
tensorflow1.15とpytorchを試しに取得してみた。

```shell:bash
$sudo docker pull nvcr.io/nvidia/tensorflow:20.11-tf1-py3
$sudo docker pull nvcr.io/nvidia/pytorch:21.05-py3
```
確認してみると適切にインストールされている

```shell:bash
$ docker images
REPOSITORY                  TAG             IMAGE ID       CREATED        SIZE
nvcr.io/nvidia/pytorch      21.05-py3       32386e6204f5   3 months ago   14.5GB
nvcr.io/nvidia/tensorflow   20.11-tf1-py3   3f91f9db07d4   9 months ago   14.4GB
```
[TensorFlow Release 21.03]
(https://docs.nvidia.com/deeplearning/frameworks/tensorflow-release-notes/rel_21-03.html#rel_21-03)
[Running Pytorch]
(https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/running.html#running)

Dockerコンテナの生成

```shell:bash
docker run -it --gpus all --name tfvm -v /home/user/develop:/home/develop nvcr.io/nvidia/tensorflow:20.11-tf1-py3
```

# 4.その他環境整備

### キーボードの設定
USキーボードで日本語入力するときは、Japanese(Mozc)だけをinput modeに設定しておいてCtrl+Spaceで直接入力とかな入力を切り替えるようにすると楽。

```shell:bash
$ sudo apt install ibus-mozc 
$ ibus restart 
$ gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'jp'), ('ibus', 'mozc-jp')]"

# 設定が表示されないとき
$ sudo apt install mozc-utils-gui
$ ibus restart 
```

### ドライブの割当
WindowsのようにDドライブを設定したいとき。
パーティションテーブルを確認して、好きなディレクトリにマウントする。
ディスクの使用率はbaobabで見ることができる。

```shell:bash
fdisk -l
（Dドライブに相当するディレクトリを確認する。この例では/dev/hda2が該当する。）
mkdir /mnt/d
mount /dev/hda2 /mnt/d
```
### WIFIレシーバドライバのインストール
gitからコードを拾ってきてビルドする。

```shell:bash
$ sudo apt install usbutils
$ lsusb

# check device name and install drivers
# 2357:0101: v1
# 2357:010d: v2
# 2357:0115: v3
$ sudo apt-get install build-essential dkms git
$ git clone https://github.com/cilynx/rtl88x2bu.git
$ cd rtl88x2bu
$ VER=$(sed -n 's/\PACKAGE_VERSION="\(.*\)"/\1/p' dkms.conf)
$ sudo rsync -rvhP ./ /usr/src/rtl88x2bu-${VER}
$ sudo dkms add -m rtl88x2bu -v ${VER}
$ sudo dkms build -m rtl88x2bu -v ${VER}
$ sudo dkms install -m rtl88x2bu -v ${VER}
$ sudo modprobe 88x2bu
```

###権限の制御

面倒くさいので新規作成されるファイルやディレクトリに全パーミッションを付与する。

```shell:bash
$ umask 0000
```

[How to install TP-LINK Archer T4U driver?](https://askubuntu.com/questions/1230788/ubuntu-20-04-issues-with-tp-link-ac1300-archer-t4u)

# 5. 参考
[DockerでのディープラーニングGPU学習環境構築方法](https://qiita.com/karaage0703/items/e79a8ad2f57abc6872aa)
[Docker and Nvidia Docker installation in Ubuntu 20.04 LTS](https://gist.github.com/nathzi1505/d2aab27ff93a3a9d82dada1336c45041)
[Ubuntu20.04で日本語入力(Mozc)を可能にする方法](https://novicengineering.com/ubuntu_mozc_install/)
[Linuxでのマウントに必要なコマンド](https://pctrouble.net/knowledge/linux_mount.html)