AWS g2インスタンス(GPU:K520)にCUDAを入れる際の落とし穴（2017年3月版）

# 概要

chainer/Tensorflowで使うことを目的に、g2インスタンスにCUDAをインストールしました。

もちろん既にCUDAインストール済みのAmazonLinuxを使用するという選択肢もありますが、今回はUbuntuが使いたかったためまっさらの状態からCUDAを入れました。その際にハマった箇所をメモします。

※ 本手順ではCUDA7.5を指定しましたが、CUDA8.0でも同様と思います。

# EC2インスタンスの構成

CUDAのインストールを始める前に、この作業を行った際のEC2のインスタンスの設定を紹介します。

* AWS EC2のインスタンス(g2.2xlarge)
* AMIはUbuntu Server 14.04 LTS (HVM) 

【参考】[Ubuntu14.04にcuda 7.5をインストール](http://qiita.com/shinya_ohtani/items/f374ed0dd51737087369)

注意点としては、EBSの領域(OSが入る領域)がデフォルトで8GBです。後々窮屈になるので、16GB以上に増やすことをオススメします。

【参考】http://qiita.com/pyr_revs/items/e1545e6f464b712517ed

# 基本的なインストールの流れ

基本的な流れは、以下いずれかの手順の通りです。

【参考】[Ubuntu14.04にcuda 7.5をインストール](http://qiita.com/shinya_ohtani/items/f374ed0dd51737087369)
もしくは
【参考】 http://www.cs.stevens.edu/~kbatsos/awscudasetup.html

ただし、Nvidiaグラフィックドライバは最新のものではなく、[Version367系の最後のもの](http://www.nvidia.co.jp/download/driverResults.aspx/108768/jp)を選んでください。理由は後述。

# 落とし穴

上記いずれの手順でも、CUDAインストール後 deviceQuery でCUDAの動作確認をする段階で、

```bash:
$ cd /usr/local/cuda/samples/1_Utilities/deviceQuery
$ sudo make
$ ./deviceQ uery
./deviceQuery Starting...

CUDA Device Query (Runtime API) version (CUDART static linking)

cudaGetDeviceCount returned 30
-> unknown error
Result = FAIL
```

といったエラーになります。その他、以下のようなエラーが確認できます。

```bash:
$ dmesg
(中略)
[ 568.286327] NVRM: The NVIDIA GRID K520 GPU installed in this system is
[ 568.286327] NVRM: supported through the NVIDIA 367.xx Legacy drivers. Please
[ 568.286327] NVRM: visit http://www.nvidia.com/object/unix.html for more
[ 568.286327] NVRM: information. The 375.26 NVIDIA driver will ignore
[ 568.286327] NVRM: this GPU. Continuing probe...
```

```bash:
$ nvidia-smi

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
```

```bash:
$ sudo modprobe nvidia

modprobe: ERROR: could not insert 'nvidia_375': No such device
```

# 原因

1. g2インスタンスのGPUであるK520は、NVIDIAグラフィックドライバーVersion367.xxまでしか対応していない
1. CUDAインストーラは、CUDAを入れるついでにNVIDIAグラフィックドライバーを最新(367.xxより新しいもの)に更新してしまう。GPUの対応状況を確認せずに! **← コイツがお馬鹿**

というコンボにより、上記の現象が発生します。

# 対処法

対処はシンプルで、上記の落とし穴にはまった後、以下のコマンドでドライバをVersion367へ戻すことで解消します。

```bash:
$ sudo apt-get install -y nvidia-367
```

【参考】 https://github.com/NVIDIA/nvidia-docker/issues/319

# 対処した後の確認結果

成功した場合、以下のような表示となります。

```bash:
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
（中略）
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 7.5, NumDevs = 1, Device0 = GRID K520
Result = PASS
```

```bash:
$ sudo modprobe nvidia
（何もメッセージが出ない）
```

```bash:
$ sudo dpkg -l | grep nvidia

ii nvidia-367 367.57-0ubuntu0.14.04.1 amd64 NVIDIA binary driver - version 367.57
rc nvidia-375 375.26-0ubuntu1 amd64 NVIDIA binary driver - version 375.26
ii nvidia-modprobe 375.26-0ubuntu1 amd64 Load the NVIDIA kernel driver and create device files
ii nvidia-opencl-icd-367 367.57-0ubuntu0.14.04.1 amd64 NVIDIA OpenCL ICD
rc nvidia-opencl-icd-375 375.26-0ubuntu1 amd64 NVIDIA OpenCL ICD
ii nvidia-prime 0.6.2.1 amd64 Tools to enable NVIDIA's Prime
ii nvidia-settings 375.26-0ubuntu1 amd64 Tool for configuring the NVIDIA graphics driver
```

※ iiはインストール済み、rcは削除済みだがconfigは残ってる の意味

# 【おまけ】 ワケが分からなくなったら

NVIDIA関係で複数のバージョンが入ってしまった・ゴミが残ってしまったようだ？という状況になったら、とりあえず

```bash:
$ sudo apt-get purge nvidia*
```

しましょう。NVIDIA関係のインストールが全て削除されるので、CUDAインストールからやり直しましょう。

# 【おまけ】 CUDAインストールの後の手順のハマりどころ

cuDNNを入れた後、tensorflow/chainerのGPUインストールが上手くいかないのは大抵、下記のいずれかが原因

* 環境変数の設定が足りない。 → 公式のインストール手順を再確認
* 一般ユーザの.bashrcに環境変数の設定をしておいて、sudo pip install している。pip install --user chainer でユーザ単位でインストールするか、virtualenvを使うのが簡単

# 感想など

対策をサラッと書いてますが、これに気付くまでが結構長かった。何か手順を間違えたかとやり直したり、ドライバのバージョンが原因と気付いてもどのタイミングで最新にされてしまうのかが分からずで半日以上潰しましたよね orz

結局 ググってヒットした上記のgithubのissueで、「オレも、オレも同じ感じでダメ！」って質問したらNVIDIAの中の人が即レスしてくれて一発解決＆感謝だったわけですが… うーん 複雑な気持ち^^;

# 【追記】既に同じような記事が…

Twitterのツイート検索をしてみたところ、[AWS E2 G2インスタンス上にKeras環境を構築する 2017年2月版](http://qiita.com/bathtimefish/items/9f62042c7424486f514c#%E3%82%A8%E3%83%95%E3%82%A7%E3%83%A1%E3%83%A9%E3%83%AB%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E6%A5%AD%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) 同様の手順を実施されている記事がありました。タイトルの最後に～年～月版と入れているところがソックリで笑ってしまいました^^;

この方の場合は、CUDAのインストール → Nvidiaグラフィックドライバの順にインストールを行っているので、この記事で起きているような現象に出遭わずに済んでいるようです。このやり方がスマートかも。