Oralcle CloudでNVIDIAのGPUインスタンスを構築する

# はじめに
本記事は、Oralcle CloudでNVIDIAのGPUインスタンスを構築する手順についての記事になります。

機械学習でディープラーニングを行う場合に必要なGPUですが、クラウドサービスを使用して環境構築を行う場合、自前でUbuntuにNVIDIAのドライバ、[CUDA](https://ja.wikipedia.org/wiki/CUDA)、cuDNN等をインストールして使用する方法と、各クラウドサービスが提供するマシンイメージを利用方法の二つに大別できます。

自前でUbuntuにNVIDIAのドライバ等をインストールする場合は、自分で環境のセットアップを行う必要があるため、初めての場合は時間がかかると思います。逆に、クラウドサービスが提供するマシンイメージを利用する場合は、インスタンスを作成するだけで、いきなりGPUが使用できます。但し、GPUになるので、普通のサーバインスタンスに比べると料金が高額になるので注意が必要です。

本記事では、Oralcle CloudのNVIDIAのイメージを例に記載しています。

## NVIDIA
Oracle Cloudでは、[NVIDIA GPU Cloud Image](https://cloud.oracle.com/ja_JP/iaas/gpu)を利用することで、導入時のセットアップを省略し、最適化された環境で機械学習のワークロードの実行ができます。

### インスタンスの作成
コンソールメニューから、「コンピュート」-「インスタンス」を選択し、「インスタンスの作成」をクリックします。

コンピュート・インスタンスの作成ウィンドウで、「イメージ・ソースの選択」をクリックし、画面上部の「Oracleイメージ」を選択。アプリケーション名から、**NVIDIA GPU Cloud Image Machine Image**にチェックを入れます。

<img width="1440" alt="スクリーンショット 2019-08-21 0.33.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/86c72bd6-086d-b044-ac51-070ee37c0f2c.png">

画面下部にもチェックも入れます。なお、**NVIDIA GPU Cloud Image Machine Image**を使用することに対するライセンス料金は発生しません。（Oracleに確認）

<img width="1440" alt="スクリーンショット 2019-08-21 0.34.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/9f5d5620-5b88-9839-e5a8-f22fcaa8d1e9.png">

**NVIDIA GPU Cloud Image Machine Image**が選択されます。

<img width="1440" alt="スクリーンショット 2019-08-21 0.34.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/7faa6363-c85e-3772-f7c3-9515db9a2963.png">

次に「シェイプの変更」で、インスタンスに割り当てるテンプレートを選択します。

<img width="1440" alt="スクリーンショット 2019-08-21 0.34.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/ec8b22b2-6866-7e36-5110-212cf73cd561.png">

あとは、任意で他の項目を入力し、最後に「作成」をクリックすると、プロビジョニングが行われます。

**Oralcle Cloudの留意事項として、インスタンスが存在する限り、GPUインスタンスの料金が発生するため、GPUインスタンス使用後は、インスタンスの終了を忘れない様にします。**

なお、ブートディスクを削除しないことで、完全にインスタンスを削除せずに起動・停止に近い操作が行えますが、またインスタンスを作成してプロビジョニングを行う必要があるため、勝手はよくありません。

### その他環境構築
機械学習に必要なその他環境構築の例について記載します。

#### Python
自動的にインストールされているPythonは3.5系のため、Pythonは3.6系以降を使用したい場合、別途、バイナリからのインストールが必要です。

#### ライブラリのインストール

- pipのインストール   
`$ sudo apt install python3-pip`
- tensorflow-gpuのインストール   
`$ pip3 install tensorflow-gpu`
- kerasのインストール   
`$ pip3 install keras`
- jupyterのインストール   
`$ pip3 install jupyter`

#### jupyter notebook 
jupyter notebookをインストールして、外部からアクセスしたい場合は、jupyter notebook起動時にパブリックIPアドレスに紐付くプライベートIPアドレスを指定して、起動するか、SSHポートフォワーディングすることで、外部からjupyter notebookを使用することができます。

**（※）jupyter notebookに外部からアクセスできる場合は、任意のコードが実行できてしまうので、注意しましょう**

参考として、外部からアクセスする場合の設定手順について記載します。

- 以下のコマンドを実行し、jupyter_notebook_config.pyを生成   
`$ jupyter notebook --generate-config`
- 以下のコマンドを実行し、jupyter_notebook_config.pyが生成されたことを確認  
`$ ls -l /home/ubuntu/.jupyter/jupyter_notebook_config.py`
- 以下のコマンドを実行し、jupyter_notebook_config.pyを編集   
`$ vi /home/ubuntu/.jupyter/jupyter_notebook_config.py`

```text
# 変更前
#c.NotebookApp.ip = 'localhost'

# 変更後
c.NotebookApp.ip = '0.0.0.0'
```

- 以下のコマンドを実行し、jupyterを起動  
`$ jupyter-notebook --ip=＜プライベートIPアドレス＞`

ポートフォワーディングする場合は、以下のコマンドを実行後、ブラウザを起動し、http://localhoot:8888にアクセスします。

`$ ssh -f -N -L 8888（※）:localhost:8888 ubuntu@＜サーバのパブリックIPアドレス＞ -i ＜秘密鍵パス＞`

（※）ローカル側なので任意のポート番号を指定可能（本記事では例として8888を指定）

#### 動作確認
GPUが実際に動いているかは、[TensorFlow](https://www.tensorflow.org/tutorials/)のチュートリアルなどでサンプルコードを動かしながら、GPUの動きをリアルタイムで見れば確認できます。

# おわりに
クラウドサービスが提供するマシンイメージは便利ですが、GPU使用料は安くはなく、簡単に検証もできないので、これからもっと使いやすくなることを期待します。