#背景
AI開発において、特にネットワークモデルが複雑な、画像系AI開発においては、その処理時間の短さを主な理由に、GPUを利用する事が推奨されています。
ただ、私が会社で利用しているAI開発環境は、GPUを2枚搭載しているサーバーであり、複数人がこの環境を共有し、GPUを使える事は非常にありがたいのですが、TensorFlowを使って、AIの勉強やPoCの学習をする際には、標準でTensorFlowを動かしてしまうと、GPUメモリーの90%を確保する為、同時に複数人でプログラムを動かしてしまうと、メモリー不足になり作業する事が出来なくなります。
このような状況を回避する為、自分で利用するGPUを制限する事が必要になりました。
###1.Pythonプログラムで、TensorFlow実行時に、使用するGPUを指定する方法
GPU版のtensorFlow環境が前提:
実行前のGPUの状況:2枚のGPUを実装している例
$ 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を指定するプログラム例:
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)
###実行後の状況例
$ 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 |
+-------------------------------+----------------------+----------------------+
2.NVIDIA Docker 2.0 で、コンテナ実行時に、使用するGPUを制限する場合
指定されたコンテナ上では、指定されたGPUしか認識できないし、IDもずれる。
NVIDIA Docker 2.0でのGPUを制限したコンテナの起動方法:
$ docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=1 -it -p 8888:8888 tensorflow/tensorflow:latest-gpu
確認する為のテスト的なコンテナの起動時のGPU使用状況:GPU #1を指定しているが、状況ではGPU #0 として表示される事に注意
$ 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:~$