Zeals TECH BLOG

チャットボットでネットにおもてなし革命を起こす、チャットコマース『Zeals』を開発する株式会社Zealsの技術やエンジニア文化について発信します。現在本ブログは更新されておりません。新ブログ: https://medium.com/zeals-tech-blog

GCPでDeep LearningのためのGPU環境を構築する

f:id:zeals-engineer:20190108094205p:plain

こんにちは!サーバーサイドエンジニアのJohnです。

インターン生として、fanpの配信周りの開発を行なっています。

今回は、GCP(Google Cloud Platform)にGPUを動かすための環境を作ってみます。だいぶ長い記事になってしまいましたが、お付き合いいただければと思います。

Google Cloud Platform(GCP)

GCPとは、Googleが提供するクラウドコンピューティング向けのプラットフォームです。似たようなサービスにAmazonのAWSや、MicrosoftのAzureがあります。

基本的な構成が最初から準備されているので、自分たちでデータセンターを作ったりしなくてもすぐにコンピューティングリソースを使うことができるようになります。今回はこのGCPを使って、DeepLearningをしてみたいけど自分でGPUマシンを買ったりするのは大変……という人でも学習をぶん回せるような環境を構築します。

※以降、GCPへの登録は済んでいる前提で進めていきます。もしまだ登録していない場合は、こちらから登録できます(GCPのページへ飛びます)。また、GCPでGPUを使うためには有料アカウントへアップグレードする必要があるので注意してください。

プロジェクトの作成

GCPにはプロジェクトという概念があります。GCPで利用する各リソースやAPIは全てプロジェクトと紐づいていて、課金などもプロジェクト単位で行われます。そのため、プロジェクトごとにアカウントを作ったりする必要がなくなります。

まずは今回のプロジェクトを作成しましょう。ページ上部のMyFirstProjectをクリックすることで、プロジェクト管理モーダルが表示されます。今回のプロジェクト名は「DeepLearningWithGCP」とします(筆者が作成した複数のプロジェクトがありますが気にしないでください)。

f:id:zeals-engineer:20190106221208j:plain

GPUの割り当て

GCPでGPUを使用するには、GPUの割り当てを行う必要があります。

ナビゲーションメニュー(左上の3本線)からIAMと管理割り当てを選択します。さらに、指標:なしを選択した後に指標:GPUs (all regions)を選択します。 f:id:zeals-engineer:20190106233839j:plain この状態で割り当てを編集をクリックし、割り当て申請を行います。新しい割り当て上限に使いたいGPUの台数、リクエストの説明には簡単に使用用途を書いておきます。100個とかあんまり大きな数を書くとサポート担当者とのやりとりが必要になるので、常識的な数字を入力しましょう。 f:id:zeals-engineer:20190106233923j:plain しばらくすると承認メールが届きます。これで割り当てが完了しました。

インスタンスの作成

プロジェクトを作成したら、今度はインスタンスを作成しましょう。

ナビゲーションメニューからCompute EngineVMインスタンスと選択すると、次のような画面が表示されます。ここで作成をクリックすることでインスタンス作成画面へ遷移します。 f:id:zeals-engineer:20190106221557j:plain

今回作成するインスタンスの設定は以下の通りです。

リージョン: asia-east1
マシンタイプ:vCPU x 1
GPUの数: 1
GPUのタイプ: NVIDIA Tesla K80
ブートディスク: Ubuntu 16.04 LTS (ストレージ:10GB)
サービスアカウント: Compute Engine default service account(デフォルト)
アクセススコープ: デフォルトのアクセス権を許可(デフォルト)
ファイアウォール: HTTP トラフィックを許可する

GPUに関しては、マシンタイプのカスタマイズから選択します。 f:id:zeals-engineer:20190106234231j:plain ここまで設定したら、作成をクリックします。しばらくするとインスタンスが作成され、緑色のチェックマークがつくと作成完了です。 f:id:zeals-engineer:20190107033339j:plain

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

f:id:zeals-engineer:20190107033059j:plain 1 epochあたり11秒!筆者のマシン(Mac Book Pro)のCPUでは1 epochあたり2分だったので、GPUすごいですね。

これで、GPUインスタンスでKerasを実行するところまで構築できました。

まとめ

今回はGPUでDeep Learningの学習を回せるようなGPUインスタンスを作成しました。自分でマシンを買うと場所や管理、初期費用など大変ですが、クラウドだと手軽に始めることができますね。これからどんどん学習させちゃいましょう!(GPUインスタンスは結構お高いので、使わないときはインスタンスを停止しておくといいかもしれません)

長々とお付き合いいただきありがとうございました!