GCP の GPU を使ってみよう[インスタンス作成編]

あゆた深層学習担当の佐々木です。

深層学習と言えば GPU!GPU と言えば、最近はクラウド上でハイスペックなマシンが使用できるサービスが流行っていますね!!この分野では AWS が有名な印象なのですが、先日2017年2月21日に Google Cloud Platform でも GPU インスタンスの使用が可能になったと!アナウンスがありました。

という訳で今回は GCP で GPU インスタンスの作成を行ってみたので、メモ的な意味で記事を残しておこうと思います。さて、GCP で GPU が使用可能になったと言っても、この記事を書いている今日(2017年3月8日)の時点ではコンソールでポチポチやるだけでは GPU 付きのインスタンスを作成できない仕様になっています。また、GPU 付きのインスタンス作成のためにはいくつか制限事項などもあるので、備忘録として必要な情報をまとめておこうと思います。

尚、本記事では GCP アカウントと、プロジェクトは作成済みであるという前提で、その後必要になる処理を書いていきます。


制限事項

GPU インスタンスの作成には、以下に示すいくつかの制限があります。

  • GPU インスタンス作成前に、quotas で使用可能な GPU を増やしておく必要がある。これには申請が必要だが、無料アカウントではこの申請ができない。そのため、GPU を使用するためには有料アカウントへの切替が必要。
  • CPU の数よりも多くの GPU を積むことはできない。
  • shared-code タイプのインスタンスには GPU を付与できない。
  • プリエンプティブなインスタンスには GPU を付与できない。

Gcloud のインストール

GPU インスタンスは、Web コンソールから GUI で作成することができないため、コマンドを打っていきます。GCP のコマンド操作には gcloud というコマンドラインツールを用います。

Cloud SDK

Gcloud は Cloud SDK の一部として提供されているので、まずはこいつをインストールしていきます。

Cloud SDK は、Mac であればここからインストーラをダウンロードできます。Ubuntu であれば以下のコマンドを叩けばおkです。

# Create an environment variable for the correct distribution
export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"

# Add the Cloud SDK distribution URI as a package source
echo "deb https://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

# Import the Google Cloud Platform public key
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

# Update the package list and install the Cloud SDK
sudo apt-get update && sudo apt-get install google-cloud-sdk  


gcloud の初期設定

Cloud SDK がインストールできたら、次は gcloud の初期設定が必要です。

gcloud init  
Go to the following link in your browser:

https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.co%2  
Fauth%2Fappengine.admin+https%3A%2F%2...


Enter verification code:  

gcloud initすると上記のようにverification codeの入力を求められるので、表示されている URL をブラウザで表示します。そこに verification codeが記載されているのでコピペしましょう。これでお手持ちの Google アカウントと gcloud が紐付きます。
アカウントの認証を終えたら、ターミナルに表示される質問に答える形で、デフォルトで使用するリージョンやプロジェクトの設定を行います。


使用可能なリソース数の確認

gcloud beta compute regions describe [ZONE]  

gcloud の初期化が済んだら、使用可能なリソース数の確認を行います。
上記のコマンドで[ZONE]はリージョンを表す文字列で、us-east1といったものを入れます。ここで、末尾の-dなどを付けるとエラーが出るので注意してください。

上記のコマンドを打つとbetaというコンポーネントのインストールを勧められるので、y で先に進みます。

インストールが終わると各リソースの使用上限数などが表示されます。GPU を表すNVIDIA_K80_GPUSをみるとlimitがゼロになっていますね!この状態では使用可能な GPU の上限がゼロなので、GPU 付きのインスタンスを作成できません。GCP ではデフォルトでこの状態になっているため、GPU インスタンス作成のためにはこの上限を解除する申請が必要になります。


GPU インスタンスの作成

制限解除の方法は後述するとして、とりあえずこの状態で GPU インスタンスを作ろうとしてみましょう!

GPU インスタンスの作成には gcloud の 144.0.0 より新しいものと、コマンドラインツールの beta を用います。

まずは gcloud のバージョンを確認してみましょう。

gcloud version  

ここで、インストールされているものが 144.0.0 よりも古いものであった場合、アップデートが必要です。次のコマンドを打ちましょう!

gcloud components update && gcloud components install beta  



さて、いよいよ GPU インスタンスの作成を行います。
以下のコマンドを打てばおkです。尚、このコマンドは当ブログからコピペするとエラーがでるようです。現象の詳細と対処法は後述します。

gcloud beta compute instances create gpu-instance-1 \  
    --machine-type n1-standard-2 --zone us-east1-d \
    --accelerator type=nvidia-tesla-k80,count=1 \
    --image-family ubuntu-1604-lts --image-project ubuntu-os-cloud \
    --maintenance-policy TERMINATE --restart-on-failure \
    --metadata startup-script='#!/bin/bash
    echo "Checking for CUDA and installing."
    # Check for CUDA and try to install.
    if ! dpkg-query -W cuda; then
      curl -O http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
      dpkg -i ./cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
      apt-get update
      apt-get install cuda -y
    fi'

上記のコマンドで使用する CPU インスタンスの種類、OS、リージョン、GPUの数などを指定しています。OS や GPU の数などは自分の求める条件に応じて摘便変更してください。
それぞれの引数の意味は以下のようになります。

gcloud beta compute instances create [INSTANCE_NAME] \  
    --machine-type [MACHINE_TYPE] --zone [ZONE] \
    --accelerator type=[ACCELERATOR_TYPE],count=[ACCELERATOR_COUNT] \
    --image-family [IMAGE_FAMILY] --image-project [IMAGE_PROJECT] \
    --maintenance-policy TERMINATE --restart-on-failure \
    --metadata startup-script='[STARTUP_SCRIPT]'
  • INSTANCE_NAME
    • インスタンスの名前
  • MACHINE_TYPE
    • 使用するマシンの種類(CPU)
  • ZONE
    • インスタンスを作成するリージョン名
  • ACCELERATOR_TYPE
    • 使用する GPU の種類。
      現在はnvidia-tesla-k80一択
  • ACCELERATOR_COUNT
    • 使用する GPU の数
  • IMAGE_FAMILY
    • OSの種類
  • IMAGE_PROJECT
    • OSの属するカテゴリ
  • STARTUP_SCRIPT
    • インスタンスの起動時に、自動で実行されるスクリプト

上記のコマンドを実行すると、エラーが出ます。GPU 付きのインスタンスを作成しようとしたけれど、割り当ての上限がゼロなので失敗しています。このエラーをとるために、制限解除の申請をしていきましょう!

※ エラー: --machine-type command not found

前述の GPU インスタンス作成コマンドを当ブログからコピペして打つと、以下のようなエラーが出るのではないでしょうか。

--machine-type command not foundと出ていますね!
現象としては、コマンドの1行目と2行目以降が別のコマンドとして実行されているようです。そのため、1行目のgcloud beta compute instances create gpu-instance-1の実行は成功し、コンソールを見ればインスタンスが作成されているはずです。

さて、ここで GPU インスタンス作成コマンドを Atom に貼り付けて見てみましょう! 1行目のラストに謎の赤い■が出現しているのがお分かり頂けるでしょうか。問題の原因はこいつです。これを削除してからコピペすればうまくいくはずです。


割り当ての制限解除

制限解除の申請は Web コンソールのConpute Engine dashboard -> Quotasのページから行えます。
上部にある青いボタンRequest increaseをクリック!

※制限解除の申請は無料アカウントだとできないため、事前にUpgrade Account的なバナーをクリックして有料アカウントにしておきましょう!有料アカウントにアップグレードすると本人確認の手続が必要になるのですが、その方法は後述します。

するとこんなページが出てくるはずです。名前や電話番号などの基本情報を入れます。

ページ中ほどに上記のような記述があります。ここから各リソースとして、使用したい数を入力していきます。リージョンごとに別れているので、自分の使用するリージョンのところまで飛びましょう!

GPU は各リージョンの一番最後にあります。ここに使用したい数を入れてページ最下部のsubmitをクリックすれば完了です。尚、ここで3以上の数を入れると Google サポートの方とメールでいろいろやりとりする必要が出てきます。不当な割当リクエストでないことを確認するためにアレコレしてくださいといった内容のメールが来ます。2個以下であればこのページからの申請のみでサクッといけます。

submitすると割り当てたリソースの使用目的を聞かれるので、For machine learning とか書いておけばいいでしょう。

上記の申請を終えると、数分後に割り当て完了しました!的なメールが届きます。メールが届いたら、確認のために GPU の割り当て上限数を見てみましょう。

gcloud beta compute regions describe [ZONE]  

ちゃんと増えていますね!この状態で再度 GPU インスタンス作成用のコマンドを打てば、うまくいきそうです。
繰り返しになりますが、以下のコマンドを叩きます。

gcloud beta compute instances create gpu-instance-1 \  
    --machine-type n1-standard-2 --zone us-east1-d \
    --accelerator type=nvidia-tesla-k80,count=1 \
    --image-family ubuntu-1604-lts --image-project ubuntu-os-cloud \
    --maintenance-policy TERMINATE --restart-on-failure \
    --metadata startup-script='#!/bin/bash
    echo "Checking for CUDA and installing."
    # Check for CUDA and try to install.
    if ! dpkg-query -W cuda; then
      curl -O http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
      dpkg -i ./cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
      apt-get update
      apt-get install cuda -y
    fi'

GPU インスタンスの作成に成功すれば、上の画像のような出力があるはずです。

Web コンソールでも確認してみましょう。Compute Engine dashboard -> VM instanceを見てみます。先程コマンドで指定した名前のインスタンスが作成されていますね!


GPU インスタンスを起動してみる

作成した GPU インスタンスを起動し、GPU が認識されているか確認します。

nvidia-smi  

Tesra K80 が挿さっているので、ちゃんと作成できているみたいですね!
GPU インスタンスでは作成時にコマンドで指定したスタートアップスクリプトによって CUDA と NVIDIA ドライバが自動でインストールされるので、作成後はすぐに GPU が使える状態になっています。

※CUDA, NVIDIA ドライバのインストールにはしばらくかかるので、インスタンス作成直後に nvidia-smiするとcommand not foundになります。10分くらい待ってからnvidia-smiしたほうがいいかもしれません。


有料アカウントの本人確認

GCP の請求先アカウントを初めて有料アカウントへアップグレードする際には、本人確認が必要です。

有料アカウントへアップグレードしてしばらく使っていると、本人確認してくださいという旨のメールが来るので、本文記載のリンクをクリックして認証を行います。 こんなページが表示されるので、運転免許証などの写真付き身分証明書と、クレジットカードの画像を送ればおkです。


参考文献

[1]https://cloud.google.com/compute/docs/gpus/add-gpus