AzureのGPUインスタンスを立てる

Azureのアカウントを持っているのでAzureでもGPUインスタンスを立ててみました。

fast.ai に Azure用GPUインスタンスセットアップのドキュメントスクリプトが用意されていたので基本的には楽チンにセットアップができます。

が一部ハマったのでメモ

install-gpu-azure.sh
# 8行目あたり
# sudo apt-get -y install cuda
sudo apt-get -y install cuda-8-0 # http://forums.fast.ai/t/setup-problems-azure/5879

# 22行目あたり
# pip install theano
pip install theano==0.9.0

CUDA8.0を明示的に指定しないとCUDAの最新版(CUDA9.0)がインストールされて次のエラーが出ちゃいました。

Exception: The nvidia driver version installed with this OS does not give good results for reduction.Installing the nvidia driver available on the same download page as the cuda package will fix the problem: http://developer.nvidia.com/cuda-downloads

Theanoも同様にバージョン指定してやる必要がありました。 バージョンを指定しないと 1.0.0 がインストールされて実行時に次のエラーが出ます。

ValueError: You are tring to use the old GPU back-end. It was removed from Theano. Use device=cuda* now. See https://github.com/Theano/Theano/wiki/Converting-to-the-new-gpu-back-end%28gpuarray%29 for more information.

1.0.0用の設定や修正をすれば動くようになると思いますが触らぬ神に祟りなしということで0.9.0を入れることとしました。

AWSと比べて

スペック比較

Azure (NC6) AWS (p2.xlarge)
vCPU 6 4
RAM (GiB) 56 61
GPU 1 (Tesla K80) 1 (Tesla K80)
Price ¥110.57/hour 0.900 USD/hour

https://azure.microsoft.com/ja-jp/pricing/details/virtual-machines/windows/ https://aws.amazon.com/jp/ec2/instance-types/p2/

ほぼ同等のスペックのはずなのですが学習を実行させるとなぜかAzureが遅かったです。。(後述)

課金体系

ちょっと前まではAWSが時間単位での課金だったので圧倒的にAzureに軍配が上がっていましたが

jp.techcrunch.com

の記事にあるようにAWSが10/2から秒単位での課金になったようです。

Azureは分単位ですが趣味の勉強の範囲では分単位か秒単位かはあまり気になりません。 でも、ビジネスとしてプロダクトで使うときは気にするんだろうなと思います。

CNMEM

http://forums.fast.ai/t/performance-issues-in-azure-800-seconds-for-lesson-1/2815/3 にも書いてあるようになぜか学習にかかる時間が遅い・・・ ╮(•ω•)╭

[global]
device = gpu
floatX = float32
[lib]
cnmem = 0.95

な感じで .theanorc を編集し、CNMEMを有効にするとAWSとほぼ同等の速度になりました。

Lesson1の The punchline: state of the art custom model in 7 lines of code の学習時間の比較
Azure (NC6) AWS (p2.xlarge)
CNMEM disabled 1107 sec 772 sec
CNMEM enabled 95% 686 sec 647 sec

AzureはVMのディスクタイプでSSDを選ぶとGPUインスタンスであるNC6インスタンスが選べず、 GPUを使いたい場合はHDDしか選択できないのですがそのせいなんでしょうか??

毎回IPアドレスが変わる

https://blogs.technet.microsoft.com/mskk-cloudos/2016/04/06/azure-ip/

● パブリックIPアドレスの値を決めることはできない 「パブリックIPアドレス」ではIPアドレスの値そのものを利用者が決めることはできません。

とあるので固定IPは無理のようです。

ただ、DNSを設定することはでき

http://[YourDnsName].eastus.cloudapp.azure.com:8888/というようなURLで jupyter notebookを開けます。

DNSの設定
  1. リソースからパブリックIPアドレスを選択
  2. 左側にある 構成 をクリック
  3. DNSラベルをつける

ディスクサイズが小さい

デフォルトでは30GBになります。 一見、十分そうですがfast.aiの課題をやっているとすぐに枯渇しちゃいます。 dogscatsの次のデータセットのstate-farmをダウンロードして展開しようとしたら既に100%になってしまいました。。

ディスクサイズの増やし方

超簡単です。

  1. リソースからディスクを選ぶ
  2. サイズを変更し、保存する (シャットダウンした状態で)
  3. VMを再起動する

Step by Step: how to resize a Linux VM OS disk in Azure (ARM) – Cloud Solution Architect

CentOSとか他のOSだと作業がいろいろとあるようですがubuntuだとこれだけです。 ubuntu素敵。( •ᴗ•)