AI開発におけるGPU利用に関する備忘録

#背景
AI開発において、特にネットワークモデルが複雑な、画像系AI開発においては、その処理時間の短さを主な理由に、GPUを利用する事が推奨されています。

ただ、私が会社で利用しているAI開発環境は、GPUを２枚搭載しているサーバーであり、複数人がこの環境を共有し、GPUを使える事は非常にありがたいのですが、TensorFlowを使って、AIの勉強やPoCの学習をする際には、標準でTensorFlowを動かしてしまうと、GPUメモリーの90%を確保する為、同時に複数人でプログラムを動かしてしまうと、メモリー不足になり作業する事が出来なくなります。

このような状況を回避する為、自分で利用するGPUを制限する事が必要になりました。

###１．Pythonプログラムで、TensorFlow実行時に、使用するGPUを指定する方法
GPU版のtensorFlow環境が前提：

## 実行前のGPUの状況：２枚のGPUを実装している例

```python
$ nvidia-smi
Tue Aug 28 13:02:51 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.30                 Driver Version: 390.30                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P100-PCIE...  Off  | 00000000:08:00.0 Off |                    0 |
| N/A   28C    P0    33W / 250W |     18MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P100-PCIE...  Off  | 00000000:84:00.0 Off |                    0 |
| N/A   28C    P0    25W / 250W |     18MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
```

### TensorFlowで使用するGPUを指定するプログラム例：

```python
from __future__ import print_function

import tensorflow as tf

# Select GPU
config = tf.ConfigProto(
    gpu_options=tf.GPUOptions(
        visible_device_list="1", # specify GPU number
        allow_growth=True
    )
)

with tf.Session(config=config):
    input1 = tf.constant([1.0, 1.0, 1.0, 1.0])
    input2 = tf.constant([2.0, 2.0, 2.0, 2.0])
    output = tf.add(input1, input2)
    result = output.eval()
    print("result: ", result)
```

###実行後の状況例
```python
$ nvidia-smi

Tue Aug 28 13:26:57 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.30                 Driver Version: 390.30                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P100-PCIE...  Off  | 00000000:08:00.0 Off |                    0 |
| N/A   28C    P0    33W / 250W |     18MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P100-PCIE...  Off  | 00000000:84:00.0 Off |                    0 |
| N/A   30C    P0    31W / 250W |  15518MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
```

### ２．NVIDIA Docker 2.0 で、コンテナ実行時に、使用するGPUを制限する場合
指定されたコンテナ上では、指定されたGPUしか認識できないし、IDもずれる。

### NVIDIA Docker 2.0でのGPUを制限したコンテナの起動方法：

```python
$ docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=1 -it -p 8888:8888 tensorflow/tensorflow:latest-gpu
```

### 確認する為のテスト的なコンテナの起動時のGPU使用状況：GPU #1を指定しているが、状況ではGPU #0 として表示される事に注意

```python
$ docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=1 -it --rm nvidia/cuda:8.0-cudnn7-devel-ubuntu16.04 nvidia-smi

Tue Aug 28 07:15:38 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.30                 Driver Version: 390.30                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P100-PCIE...  Off  | 00000000:84:00.0 Off |                    0 |
| N/A   28C    P0    25W / 250W |     18MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
z2010035@gpu1:~$
```