y_megane.log

日々の勉強や改善ネタの備忘。

GCPでGPUインスタンス立ててkeras(tensorflow-gpu)実行するまで

コンソールからポチポチするだけかと思ったら、案外やること多かったのでまとめ。
GPUインスタンス立てるとこまでは苦労しなかったので、そこからスタート想定。

主な導入するもの

  • CUDA 9.0
  • cuDNN 7.12
  • NVIDIADriver 3.84
  • tensorflow-gpu 1.11

当初はcondaでインストールされるCUDA9.2を基準にするつもりだったが、ドライバインストールなどうまくいかなかったので断念。またトライする予定...

1.GPU割り当て申請

インスタンス作成画面からポチるだけではダメで、GPU割り当て申請というものが必要。
公式ドキュメントちゃんと呼めばいいんだけど、ちと分かりにくい。
リージョン、リソース(GPU等)ごとに申請して、許可された中から選んでインスタンスを作るという手順。 公式:https://cloud.google.com/compute/docs/gpus/add-gpus?hl=ja

メニューからIAMと管理>割り当て、と選択。 f:id:ymegane88:20181104152813p:plain 割り当て申請をするためには有料アカウントにアップグレードする必要がある。
とはいえ特別な作業は必要なく、画面に表示される”アップグレード”を押すだけ。
今後、課金されちゃうので注意。
”指標”をgpuで検索して使いたいGPUを選択する。Preemptibleと通常インスタンスで別個。
”場所”でリージョンを検索。リージョンによって使える資源に制約がある。
公式:https://cloud.google.com/compute/docs/gpus/?hl=ja
一通り選んだら”割り当てを編集”。アドレスや電話番号を入力すると割り当て数の入力画面が出るので、欲しい数を入力する。あまり多い(100とか)とサポートとやりとりすることになるらしい。各10個の申請はサクっと通った。
リクエストを送信すると2通程通知メールが来て、翌日あたりに承認メールが来る。

私は当初リージョン気にせず申請(東京でGPU申請)してリジェクトされてしまった...

2.GPUインスタンス作成

インスタンス作成自体はポチポチするだけ。
GPU周りのインストールでcondaを使って楽したいので、condaで入れることができるCUDA9.0想定で進める。そのためCUDA9.0対応のUbuntu16.04を選択。容量は適当。 f:id:ymegane88:20181104160623p:plain

プリエンプティブ(制約があるが価格が安い)を利用したい場合は
詳細表示>可用性ポリシー>プリエンプティブをオンにすること。

3.NVIDIAドライバーのインストール

CUDAとCuDNNはcondaが一発で入れてくれる。 上にも書いたがCUDA9.0が入るので、その想定でNVIDIAドライバーを手動インストールする。

One of the following supported CUDA versions and NVIDIA graphics driver:
NVIDIA graphics driver R375 or newer for CUDA 8
NVIDIA graphics driver R384 or newer for CUDA 9
NVIDIA graphics driver R390 or newer for CUDA 9.2

cuDNNドキュメントより、CUDA9.0には3.84以降のドライバーが必要。
3.84はgoogleスクリプトを用意してくれていたり、手間なくインストールできる。

sudo apt install nvidia-384

4.CUDA,cuDNNのインストール

www.anaconda.com Anaconda公式ブログより、condaでtensorflow入れるとCUDAとかcuDNNとかよしなにやってくれるよ、という話。
なので、Miniconda入れてcondaするだけ。
Anacondaでもいいが、私は最小限の構成にしたかったのでMiniconda採用。

wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh  
bash Miniconda3-latest-Linux-x86_64.sh  

shell再起動して

conda create -n gpuenv tensorflow-gpu  
conda install cudatoolkit=9.0

f:id:ymegane88:20181104170208p:plain

仮想環境を作りつつtensorflow-gpuをインストールする。
その際、画像の通り依存パッケージとしてCUDAやcuDNNなどがインストールされる。
CUDAは自動的に9.2が入るので、condaでバージョン指定してダウングレードする。

ここで一度インスタンスを再起動する。
再起動後、ドライバーやCUDAが入っていることを確認する。

nvidia-smi

f:id:ymegane88:20181104203056p:plain

ドライバのバージョンや、K80が認識されていることを確認。
最後にkerasでCNNのサンプルを実行してみる。 github.com keras公式に多くのサンプルコードがあるので、その中からmnist_cnn.pyを実行する。
git cloneするまでもないと思うので、pyファイルを直接ダウンロードして実行。

source activate gpuenv
conda install keras
wget https://raw.githubusercontent.com/keras-team/keras/master/examples/mnist_cnn.py
python mnist_cnn.py

f:id:ymegane88:20181104192128p:plain

実行結果。1epock8秒。CPUだと1分弱だったので、GPUが効いてるのが分かる。
ということで、無事GPUインスタンスでkeras(GPU)実行するところまで到達。
kaggleなどやる際はXGBoostとかLightGBMとか色々追加すること。

5.おしまい

今までは手元の貧相なWin機のGPU環境(1050Ti)で頑張ってたけど、これでGCPが使える!

これまでWindowsプライベートも仕事も1本だったので 、GCPがほぼ初めてのLinux系。
Windows時はVisualStudioのインストールに躓いたり、一個一個のインストールやアンインストールが手間だったり色々と手間だったのが、GPU導入という短い手順だけ見てもだいぶ楽になったかも。

今回はとにかく手軽に動くところまで、ということでconda利用してゴリゴリ作ったけど、デスクトップ、ノートPC、GCPなど使い分けるならDockerを利用した方がいいはず。GPU環境はNVIDIA Dockerが使えるはずだし。

また少ししたら、Docker使って改めて環境構築してブログ書きます。多分。

ねんがんの じーぴーゆー を てにいれたぞ!

おまけ:コードだけまとめ

インスタンス作成後のコードだけ一覧化。
順番に実行してEnterかyes入力で、一通りそろうはず。

sudo apt install nvidia-384 
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh  
bash Miniconda3-latest-Linux-x86_64.sh  
shell再起動
conda create -n gpuenv tensorflow-gpu  
conda install cudatoolkit=9.0
インスタンス再起動  
nvidia-smi
source activate gpuenv
conda install keras
wget https://raw.githubusercontent.com/keras-team/keras/master/examples/mnist_cnn.py
python mnist_cnn.py

おまけ:コマンド備忘

CUDAアンインストール

sudo apt-get remove nvidia\*  
sudo apt-get remove cuda\*  
sudo apt autoremove  

CUDA,ドライバーのバージョン確認

dpkg -l | grep nvidia  
dpkg -l | grep cuda