経緯とやりたいこと
卒業研究で、グラフデータを取り扱った手法を行っていたのですが、
このグラフデータがかなりのメモリを消費する(主にテンソルの計算)ので
VMで環境構築をしました。
環境設定
今回は、以下の設定で環境を構築していきます。
- Ubuntu 16.04 LTS
- GCE
- CUDA 9.0
- cuNN 7.4
- TensolFlowGPU 1.12.0
TensolFlowはバージョンによって、CUDAとバージョンを合わせたりする必要があるみたいです。
このバージョンがずれていたりするとうまくGCPが認識できなかったりするみたいなので、
以下から確認することをお勧めします。
環境構築の手順
0. GCPへの登録
- CCPへアカウント登録
- VMインススタンスの課金の有効化
- VMインスタンスの作成
- vCPU x 24
- メモリ 90 GB
- GPU : NVIDIA Tesla T4
- Boot disk : Ubuntu 16.04 LTS (Size 250GB)
- ZONE : us-west1-b
- HTTPトラフィックを許可
 
参考サイト: タダでGCPのGPU(NVIDIA Tesla K80)を使ってディープラーニング(NVIDIA DIGITS)する方法
1. CUDAとNVIDIAドライバのインストール
VMインスタンスで以下のcommandを実行し,CUDAとドライバをインストールします。
$ curl -O http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda-9-0
さらに、GPUのパフォーマンスを最適化するために、以下のcommandを実行します。
$ sudo nvidia-smi -pm 1
2. cuDNN7.0のインストール
ここからdeveloperアカウントを作成し、cuDNNの以下の3つのファイルをダウンロードします。
- version : ubuntu 16.04 cuda-9.0 version
- libcudnn7_7.6.4.38-1+cuda9.0_amd64.deb
- libcudnn7-dev_7.6.4.38-1+cuda9.0_amd64.deb
- libcudnn7-doc_7.6.4.38-1+cuda9.0_amd64.deb
ダウンロードが完了したら、3つのファイルをStarageへアップロードします。
ここではバケット名はcuda_9とします(お好みで変更してください!)。
アップロードが完了したら gsutil command でそのままインスタンスへの転送します。
アップロードするディレクトリはお好みでどうぞ。
$ cd {UP_LOAD_PATH}
$ gsutil cp gs://cuda_9/libcudnn7_7.6.4.38-1+cuda9.0_amd64.deb .
$ gsutil cp gs://cuda_9/libcudnn7-dev_7.6.4.38-1+cuda9.0_amd64.deb .
$ gsutil cp gs://cuda_9/libcudnn7-doc_7.6.4.38-1+cuda9.0_amd64.deb .
転送が完了したらファイルを展開してインストールしていきます。
$ sudo dpkg -i *.deb
3. swap file の設定
swap file がない場合、プログラム実行時にメモリリークする可能性があります。
GCEでLinux仮想マシンを作成するとmUbuntuだろうがCentOSだろうが swap file がない状態で仮想マシンが作成される...らしい...です。(私は、ここで詰みました)
ということで、まずはfree commandでswapの有無を確認。
$ free -m
以下のようになっていたらSwap:がゼロになっているので、swapファイルを作成する必要があります。
               total        used        free      shared  buff/cache   available
Mem:            581         148          90           0         342         336
Swap:             0           0           0
swap file の作成。swap file の容量はお好みで(今回は10G)
$ sudo fallocate -l 10G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
swap file の確認
$ free -m
               total        used        free      shared  buff/cache   available
Mem:            581         148          88           0         344         336
Swap:          1023           0        10023
Tips : 再起動時にスワップファイルを自動マウントするには,/etc/fstabに以下を追加したらいいみたいです。
/swapfile none swap sw 0 0
4. GPU認識確認とCUDAの設定
CUDAの設定を行っていきます。
$ echo "export PATH=/usr/local/cuda-9.0/bin\${PATH:+:\${PATH}}" >> ~/.bashrc
$ source ~/.bashrc
$ sudo /usr/bin/nvidia-persistenced
その後、GPUが認識されているかを確認します。
$ nvidia-smi
以下のようなresponseがあれば、GPUの設定は完了です!
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.72       Driver Version: 410.72       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| 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 K80           Off  | 00000000:00:04.0 Off |                    0 |
| N/A   42C    P0    65W / 149W |      0MiB / 11441MiB |    100%      Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
5. Python環境の構築
最後に、Python環境をAnadondaで構築していきます。
(普段からAnacondaを使っているのと、他の方法だとなぜがプログラムが動かなかったので今回はAnacondaにしました)
wgetでAnaconda をダウンロードします。
$ wget https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh
$ sh ./Anaconda3-5.3.1-Linux-x86_64.sh
$ echo ". /home/{USER_NAME}/anaconda3/etc/profile.d/conda.sh" >> ~/.bashrc
$ source ~/.bashrc
次に、Anaondaの仮装環境を構築します。PythonのversionとENV_NAMEはお好みで。
(今回はtensorflow==1.12.0を使いたいので、Python3.6.5)
$ conda create -n {ENV_NAME} python=3.6.5
$ conda activate {ENV_NAME}
6. tensorflow-gpuのインストール
condaからinstallします。(ここまでくると安心感がすごい)
$ conda install tensorflow-gpu==1.12.0
以下のプログラムを実行して、GPUと出てきたらtensorflow-gpuがGPUを認識してくれています。
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
- OUT
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 2319180638018740093
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 11324325888
locality {
  bus_id: 1
}
incarnation: 13854674477442207273
physical_device_desc: "device: 0, name: Tesla K80, pci bus id: 0000:00:04.0, compute capability: 3.7"
]
その他、必要なライブラリがあればcondaからinstallしてください。
$ conda install numpy==1.15.4
$ conda install scipy==1.1.0 
$ conda install scikit-learn==0.20.0
これで、GCPのVMを使ってPythonのプログラムを実行できるはずです!
※ 間違いなどがあればコメントをいただけますと幸いです。