Ubuntu18.04にeGPUでDeep Learning環境を構築した（失敗談付き）

eGPUによる環境構築報告がなかったので、需要は小さいだろうがポエムとして残しておく。数多のログインループとdependency hellを乗り越えて。~~むしゃくしゃしたから書いた。~~

# ハードウェア
- 機種: HP Spectre x360 13-ac000
- 外付けGPU: [akitio node pro](https://www.akitio.jp/expansion/node-pro)

- GPU: [nvidia gtx 1080ti msi armor](https://www.ask-corp.jp/products/msi/graphicsboard/geforce-gtx1080ti/geforce-gtx-1080-ti-armor-11g-oc.html)

# 前提環境
- Windows10とのdualboot

```bash
sudo apt update
sudo apt upgrade
cat /etc/lsb-release
#DISTRIB_ID=Ubuntu
#DISTRIB_RELEASE=18.04
#DISTRIB_CODENAME=bionic
#DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
```
# NVIDIA driverのインストール
ubuntu18.04だと自動でeGPUを認識してくれた。usb-c/thunderboltすごい。
以前、環境構築したときはdriver .runファイルを公式から落としてきたり、nouveauをblacklistしたが最近は必要ないようだ。

- GPUを認識しているか確認。

```bash
lspci | grep -i nvidia
#07:00.0 VGA compatible controller: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] (rev a1)
#07:00.1 Audio device: NVIDIA Corporation GP102 HDMI Audio Controller (rev a1)
```
- GPUに必要なdriverの確認

```bash
ubuntu-drivers devices
#== #/sys/devices/pci0000:00/0000:00:1c.4/0000:02:00.0/0000:03:01.0/0000:05:00.0/0000:06:01.0/0000:07:00.0 ==
#modalias : pci:v000010DEd00001B06sv00001462sd00003607bc03sc00i00
#vendor   : NVIDIA Corporation
#model    : GP102 [GeForce GTX 1080 Ti]
#driver   : nvidia-driver-418 - third-party free recommended
#driver   : nvidia-driver-396 - third-party free
#driver   : nvidia-driver-410 - third-party free
#driver   : nvidia-driver-415 - third-party free
#driver   : nvidia-driver-390 - distro non-free
#driver   : xserver-xorg-video-nouveau - distro free builtin
```

- ここでdriverを上手く指定してあげないとログインループに嵌まる

```bash
sudo apt install nvidia-driver-390 nvidia-settings
sudo init 6 #reboot
```
必要に応じて、`sudo prime-select query`で`intel`と返ってきたら、

```bash
sudo prime select nvidia
sudo init 6
```

上手くログインできたら`nvidia-smi`でGPU確認。

# tensorflowのインストール
**Anacondaからインストールする。**
そうなのだ。最近はCUDAやcuDNNのインストールが不要となっていた。どうやら、パッケージがCUDAやcuDNNのバイナリを含んでいるようだ。~~だがこれはこれでconda installのとき一緒にどのversionかを気をつけないと痛い目にあった。~~
anacondaのインストールは済んでいるとする。

- 壊れてもいいように仮想環境構築
 
```bash
conda create --name tf-gpu
source activate tf-gpu
```

- 多少versionは落ちるが

```bash
conda install \
tensorflow-gpu==1.12 \                                                   
cudatoolkit==9.0 \                                                       
cudnn=7.1.2 \                                                            
h5py
conda install keras ## optional
```

- jupyter notebookのkernel登録

```
conda install jupyter
conda install ipykernel
python -m ipykernel install --user --name tf-gpu --display-name "tf-gpu"
```
- GPU実行確認

```bash
python -c "from tensorflow.python.client import device_lib; device_lib.list_local_devices()"
```
長々としたoutputにGPUとあったら使えている。

# pytorchのインストール

- 仮想環境とか

```bash
conda create -n pytorch python=3.6 numpy scipy
```
- [公式サイト](https://pytorch.org/)から必要な情報を入力するとインストール方法が分かる。今回は、CUDA9.0指定。

```bash
conda install pytorch torchvision cudatoolkit=9.0 -c pytorch
```

- GPU実行確認

```python
import torch 
print(torch.cuda.is_available())
>> True

torch.cuda.get_device_name(0)
>> 'GeForce GTX 1080 Ti'
```
# 失敗したこと

## NVIDIA-driverのバージョン
推奨されているように``` sudo ubuntu-drivers autoinstall```を実行してしまうと、もれなく```nvidia-driver-418 - third-party free recommended```がインストールされてログインできなくなる。そんなときは慌てず騒がずgrubでsafe modeまたはログイン画面で```Alt + F2```を押してterminalに入る。```sudo apt remove nvidia*```で一度driverを消してあげればまたログインできるようになる。

## ライブラリインストール
まず、nvidia-driver-390までインストールできた。前回と同じようにCUDAをインストールしようとしたところ、driver incompatabilityやらでまたログインループに嵌った。今度は、CUDA/cuDNNなしのインストール方法を模索した。公式tensorflowの指示通りにdockerを立ち上げたがdriver incompatibleと怒られた。(nvidia-driverをインストールしておくだけで実行できると書かれているにも関わらず。）今度はanacondaからinstallしようとした。`conda install tensorflow-gpu`で実行できるかと思われたが最新のCUDA10がインストールされ、driver incompatible。仮想環境を作っていたので、apt installよりは気楽である。最終的にdriverに一致するCUDAを特定し、そこから対応するtensorflowを探し、上記バージョン指定となった。

# 結語
これでもNVIDIA公式.runファイルとの格闘はなくなり簡単になったとは思う。GPU設定は根気が必要。

# 追記(2019/07/14)
ある時、アップデート後にthunderboltが認識されなくなった。
`sudo apt install bolt` で解決した。