Tech Sketch Bucket of Technical Chips by TIS Inc.

AWS GPUインスタンスを利用して高速な機械学習環境を手に入れよう

Pocket

この記事では、AWSのGPUインスタンスの使い方を紹介します。また、GPUインスタンス上で機械学習のフレームワークであるChainerのサンプルコードを実行し、CPUのみの場合と実行時間を比較します。

はじめに

グラフィックボードなどに搭載されているGPUは、画像処理用のプロセッサですが、その処理能力の高さから汎用計算にも利用されるようになってきました。 機械学習の分野においても、並列計算にGPUを利用することで、CPUのみの場合と比べて大幅に学習速度を向上させています。

機械学習を高速化させる方法としてGPUの利用は魅力的ですが、以下のような理由で、なかなか手が出せない方もいるかと思います。

  • ハードウェア依存の環境設定が必要で難易度が高い
  • 高価なため安易に高性能な環境を導入できない

GPU環境の設定は、製品ごとにドライバのバージョンや設定方法が異なり、難易度が高いものです。 万一設定を誤ってうまく動作しなくなった場合は、リカバリも必要になります。 また、GPU自体が高価なこともあり、まずは試してみたいという場合や、利用する頻繁が限られている場合は、どうしても割高になってしまいます。

そこで、簡単にGPU環境を用意する方法として、クラウドを利用する方法が挙げられます。クラウドであれば、環境設定済みのサーバをオンデマンドに利用でき、必要に応じてサーバ台数や性能を変更することができます。

今回は、AWSのGPUインスタンスを使って機械学習の環境を構築してみます。

AWSのGPUインスタンス

AWSでは、現行バージョンとして、NVIDIAの「GRID K20」が搭載されたインスタンスが提供されています。インスタンスの性能は、以下の2つから選択可能です。

インスタンスタイプ GPU vCPU メモリ SSDストレージ 料金(東京リージョン)
g2.2xlarge 1 8 15 GB 60 GB x 1 $0.898 /1h
g2.8xlarge 4 32 60 GB 120 GB x 2 $3.592 /1h

GPUインスタンスは、HVM方式で仮想化されたものであれば、通常のCPUインスタンスと同じマシンイメージ(AMI)を選択して起動できます。 しかし、GPUの機能を利用するためには対応するNVIDIAのドライバをインストールするなど、自分で環境設定を行う必要があります。 そのため、後述のGPUインスタンス用AMIを利用することをおすすめします。

GPUインスタンスの仕様については、公式ドキュメントに詳細が記述されているので確認してみてください。

GPUインスタンス用AMI

GPUインスタンス用として、環境設定済みのAMIがNVIDIAから提供されています。 提供されているOSはAmazon LinuxとWindows Server 2012 R2です。 インスタンス作成時にAWS Marketplaceから検索して利用することができます。

またBitfusionからUbuntuの環境設定済みAMIが提供されています。同時に、ディープラーニングのフレームワークであるCaffeやTensorflowが導入済みのものも公開されています。 BitfusionのAMIを利用する場合は、インスタンス料金に加えて、ソフトウェア利用料が必要になります(北米リージョンのインスタンス料金の5〜10%程度)。詳細については、AWS Marketplaceの情報を確認してください。

NVIDIAのAMI

nvidia_ami

BitfusionのAMI

bitfusion_ami

GPUインスタンスを作成する

それでは、GPUインスタンスを作成してみましょう。 今回は、比較的料金の安い北米リージョンを利用して、g2.2xlargeインスタンスを作成します。 AMIにはNVIDIAのAmazon Linuxを利用します。

作成方法は通常のCPUインスタンスと同様なので、以下のように、AWSのマネジメントコンソールからインスタンスを作成していきます。

リージョンの選択

ec2_1

EC2インスタンスの起動

ec2_2

AMIの選択

ec2_3

インスタンスタイプの選択

ec2_4

インスタンスの詳細設定

ec2_5

次のストレージ設定では注意点があります。

g2.2xlargeインスタンスには、デフォルトで60GBのSSDストレージが付属しますが、このストレージはインスタンス停止時にデータが消去されます。 デフォルトのストレージは/mntディレクトリにマウントされるので、保持しておきたいデータは格納しないように注意が必要です。

一方、このストレージ設定で追加した領域は、インスタンス停止後もデータが保持されます。 インスタンスに保存しておきたいデータが多い場合は、このストレージ設定で必要なディスクサイズを確保しておく必要があります。

ストレージの設定

ec2_6

インスタンス名の設定

ec2_7

セキュリティグループの設定

ec2_8

設定内容の確認

ec2_9

キーペアの設定

ec2_10

起動の確認

ec2_11

インスタンスにアクセスする

インスタンスが起動したらSSHでインスタンスにSSH接続します。Amazon Linuxの場合、ユーザ名はec2-userです。 もしうまく接続できない場合は、セキュリティグループの設定やキーペアに誤りがないか確認してください。

インスタンスにログインしたら、以下のコマンドでGPUの仕様状況を確認できます。

また、CUDAは/opt/nvidia/cudaにインストールされています。 以下のコマンドでインストールされているCUDAのバージョンを確認できます。

GPUインスタンスでChainerを実行する

ここからは、GPUインスタンスにディープラーニングのフレームワークであるChainerをインストールし、サンプルコードを実行してみます。

cuDNNのインストール

cuDNNはNVIDIAが公開しているディープラーニング用のライブラリです。 Chainerではこのライブラリを利用するため、あらかじめインストールしておきます。

cuDNNはNVIDIAのデベロッパーズサイトからダウンロードすることができます。 ライブラリの取得にはユーザ登録が必要なためregisterからへの登録を行い、ログインした状態でDownloadに進みます。 Downloadページではいくつかバージョンが表示されますが、インスタンスのCUDAはVersion 7.5なので、安定版のcuDNN v5とCUDA 7.5の組み合わせを選択します。 バージョンを選択すると、OSごとのライブラリ一覧が表示されるため、cuDNN v5 Library for Linuxをダウンロードします。

cuDNNのダウンロード

cudnn

cuDNNをダウンロードしたらscp等を利用してインスタンスに転送します。 転送が完了したら、インスタンスのコンソールからファイルを解凍し、CUDAがインストールされているPATHにコピーします。

Chianerのインストール

続いてディープラーニングのフレームワークであるChainerをインストールします。

Chainerは、CUDAがインストールされているPATHを指定してpipコマンドからインストールできます。

インストールが完了したらpythonのコンソールを実行して、バージョンを確認しておきます。今回はv1.11.0がインストールされています。

また、CUDAが利用可能かも確認しておきます。pythonのコンソールでcupyをインポートし、特にエラーが表示されなければ問題ありません。

サンプルコードの実行

いよいよ、GPUを使って機械学習を行ってみます。 GithubからChainerのリポジトリを取得し、手書き文字認識のサンプルコードのディレクトリへ移動します。

以下のコマンドでサンプルコードを実行します。 --gpuオプションには、使用するGPUのインデックス番号を指定します。 今回の環境ではGPUは1つだけなので、0番を指定しています。 また、実行時間を計測するために、timeコマンドをつけています。

デフォルトの設定では20回パラメータ更新を繰り返して終了します。 結果、およそ2分で学習が完了し、訓練データに対して99.7%、検証データに対して98%程度の精度で識別ができたようです。

Chainerの実行中にGPUの稼働状況を確認すると、0番のGPUでpythonが実行されていることがわかります。

GPUを使わずに実行した場合

GPUを利用することでどの程度学習が高速化されるのか、参考までにCPUのみで実行した場合と比較してみます。 CPUのみの場合は学習に時間がかかるため、timeコマンドではなく、Chainerの実行前後にdateコマンドを実行し計測しています。

学習が完了したので、結果を確認してみます。

結果、CPUのみ場合では20回のパラメータ更新に9時間12分(552分)かかりました。 GPUを使った場合、単純計算で276倍高速化できたことになります。

今回利用したg2.2xlargeインスタンスは、CPUが8コア、メモリが15GBと決して性能が低いわけではないので、GPUを利用することでいかに並列計算を高速化できるのか、よくわかる結果となりました。

まとめ

この記事では、AWSのGPUインスタンスを利用して高速な機械学習環境を用意する方法を紹介しました。

GPU向けに環境設定されたAMIが提供されているため、これといって苦労すること無くGPU環境を利用することができました。 ただし、利用する機械学習のフレームワークによっては、プリインストールされているソフトウェアとバージョンが合わず、再インストールなどが必要になる場合もあるため注意が必要です。

今回はサンプルコードの実行のみでしたが、GPUを利用した場合、とても高速に機械学習を行うことができました。クラウド環境はオンデマンドで利用できるので、パラメータチューニングなど試行錯誤を繰り返すときや、大規模なデータを学習させたいときに利用すると、非常に効果的ではないでしょうか。

エンジニア採用中!私たちと一緒に働いてみませんか?