こんにちは!サーバーサイドエンジニアのJohnです。
インターン生として、fanpの配信周りの開発を行なっています。
今回は、GCP(Google Cloud Platform)にGPUを動かすための環境を作ってみます。だいぶ長い記事になってしまいましたが、お付き合いいただければと思います。
- Google Cloud Platform(GCP)
- プロジェクトの作成
- GPUの割り当て
- インスタンスの作成
- Google Cloud SDKのインストール
- CUDAとNVIDIAドライバのインストール
- cuDNN7.0のインストール
- Kerasを使ってみる
- まとめ
Google Cloud Platform(GCP)
GCPとは、Googleが提供するクラウドコンピューティング向けのプラットフォームです。似たようなサービスにAmazonのAWSや、MicrosoftのAzureがあります。
基本的な構成が最初から準備されているので、自分たちでデータセンターを作ったりしなくてもすぐにコンピューティングリソースを使うことができるようになります。今回はこのGCPを使って、DeepLearningをしてみたいけど自分でGPUマシンを買ったりするのは大変……という人でも学習をぶん回せるような環境を構築します。
※以降、GCPへの登録は済んでいる前提で進めていきます。もしまだ登録していない場合は、こちらから登録できます(GCPのページへ飛びます)。また、GCPでGPUを使うためには有料アカウントへアップグレードする必要があるので注意してください。
プロジェクトの作成
GCPにはプロジェクトという概念があります。GCPで利用する各リソースやAPIは全てプロジェクトと紐づいていて、課金などもプロジェクト単位で行われます。そのため、プロジェクトごとにアカウントを作ったりする必要がなくなります。
まずは今回のプロジェクトを作成しましょう。ページ上部のMyFirstProject
をクリックすることで、プロジェクト管理モーダルが表示されます。今回のプロジェクト名は「DeepLearningWithGCP」とします(筆者が作成した複数のプロジェクトがありますが気にしないでください)。
GPUの割り当て
GCPでGPUを使用するには、GPUの割り当てを行う必要があります。
ナビゲーションメニュー(左上の3本線)からIAMと管理
→ 割り当て
を選択します。さらに、指標:なし
を選択した後に指標:GPUs (all regions)
を選択します。
この状態で
割り当てを編集
をクリックし、割り当て申請を行います。新しい割り当て上限に使いたいGPUの台数、リクエストの説明には簡単に使用用途を書いておきます。100個とかあんまり大きな数を書くとサポート担当者とのやりとりが必要になるので、常識的な数字を入力しましょう。
しばらくすると承認メールが届きます。これで割り当てが完了しました。
インスタンスの作成
プロジェクトを作成したら、今度はインスタンスを作成しましょう。
ナビゲーションメニューからCompute Engine
→ VMインスタンス
と選択すると、次のような画面が表示されます。ここで作成
をクリックすることでインスタンス作成画面へ遷移します。
今回作成するインスタンスの設定は以下の通りです。
リージョン: asia-east1 マシンタイプ:vCPU x 1 GPUの数: 1 GPUのタイプ: NVIDIA Tesla K80 ブートディスク: Ubuntu 16.04 LTS (ストレージ:10GB) サービスアカウント: Compute Engine default service account(デフォルト) アクセススコープ: デフォルトのアクセス権を許可(デフォルト) ファイアウォール: HTTP トラフィックを許可する
GPUに関しては、マシンタイプのカスタマイズ
から選択します。
ここまで設定したら、
作成
をクリックします。しばらくするとインスタンスが作成され、緑色のチェックマークがつくと作成完了です。
Google Cloud SDKのインストール
インスタンスへの接続など、Google Cloud SDKをインストールしておくと便利です。リンク先を参考に、まずこちらをインストールします。
CUDAとNVIDIAドライバのインストール
GPUを設定しましたが、利用するにはドライバが必要になります。また、GPUで学習を並列処理するにはCUDAが必要です。ここでは公式ドキュメントを参考にそれらをインストールします。
まず、インスタンスにSSH接続しましょう。VMインスタンスの画面で、接続
のプルダウンメニューからgcloudコマンドを表示
し、それをコピペすれば接続できます。
無事接続できたら、以下のコマンドで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
これでCUDAとドライバが入りました。一般に、次の設定でGPUのパフォーマンスを最適化できるようなので、やっておきます。
$ sudo nvidia-smi -pm 1 Enabled persistence mode for GPU 00000000:00:04.0. All done.
加えて、今回はK80を使っているので、自動ブーストを無効化します。
$ sudo nvidia-smi --auto-boost-default=DISABLED All done.
cuDNN7.0のインストール
cuDNNはNVIDIA社が提供するDeep Learning向けのライブラリで、ほとんどのDeep Learningライブラリで使われています。利用にはアカウント登録が必要です。
https://developer.nvidia.com/developer-program
ここでdeveloperアカウントを作成して、
https://developer.nvidia.com/rdp/cudnn-download
ここでcuDNNをダウンロードします。今回はubuntu 16.04向けのcuda-9.0 versionをダウンロードしました。三つのファイルありますがすべてダウンロードします。
これをインスタンスにアップロードする必要があるので、GCPストレージを使います。scpコマンドでもいいんですが、どうも遅いらしいです。ナビゲーションメニューからStorage
を選択すると、バケットの作成画面になるので、名前などを適当に入力して、バケットを作成します。場所はインスタンス同様asia-east1
とします。
バケット作成後は、アップロードボタンからファイルをアップロードします。アップロードが完了したらgsutilコマンドでそのままインスタンスへの転送が可能です。
$ gsutil cp gs://{YOUR_BUCKET_NAME}/libcudnn7_7.4.2.24-1+cuda9.0_amd64.deb . $ gsutil cp gs://{YOUR_BUCKET_NAME}/libcudnn7-dev_7.4.2.24-1+cuda9.0_amd64.deb . $ gsutil cp gs://{YOUR_BUCKET_NAME}/libcudnn7-doc_7.4.2.24-1+cuda9.0_amd64.deb .
{YOUR_BUCKET_NAME}には設定したバケットの名前を入れてください。転送が完了したらファイルを展開してインストールします。
$ sudo dpkg -i libcudnn7_7.4.2.24-1+cuda9.0_amd64.deb $ sudo dpkg -i libcudnn7-dev_7.4.2.24-1+cuda9.0_amd64.deb $ sudo dpkg -i libcudnn7-doc_7.4.2.24-1+cuda9.0_amd64.deb
これでひとまず、GPU環境が完成しました。
Kerasを使ってみる
作成した環境で、KerasのチュートリアルであるMNISTの学習をしてみましょう。
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install python3-pip $ pip3 install --upgrade pip $ pip install tensorflow-gpu $ pip install keras $ wget https://raw.githubusercontent.com/keras-team/keras/master/examples/mnist_cnn.py $ python3 mnist_cnn.py
1 epochあたり11秒!筆者のマシン(Mac Book Pro)のCPUでは1 epochあたり2分だったので、GPUすごいですね。
これで、GPUインスタンスでKerasを実行するところまで構築できました。
まとめ
今回はGPUでDeep Learningの学習を回せるようなGPUインスタンスを作成しました。自分でマシンを買うと場所や管理、初期費用など大変ですが、クラウドだと手軽に始めることができますね。これからどんどん学習させちゃいましょう!(GPUインスタンスは結構お高いので、使わないときはインスタンスを停止しておくといいかもしれません)
長々とお付き合いいただきありがとうございました!