深層学習環境ごとの簡易ベンチマーク

これまで簡単な深層学習について紹介してきました。
正直内容は超初級編ですが、これから更に難しい内容に挑戦していきたいという方もいるかもしれません。

実際に自分で深層学習を利用した機械学習を行っていきたいという時に、どのような環境で作業を行っていくべきかを決めていく必要があると思います。
それなりに費用が掛かる場合もあります。

場合によっては結構な金額が掛かってしまいますので、私の経験が少しでも参考になるよう、簡単ではありますがベンチマークを行ってみました。

  

簡易ベンチマーク(MNIST手書き数字認識)

今回もベンチマークには以前紹介したMNIST手書き数字認識を使用します。

以前の記事

コードは以下の通りです。

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation,MaxPooling2D,Conv2D,Flatten
from keras.optimizers import Adam 
from keras.utils import np_utils
import time
import numpy as np
import os

 
#モデルを作成する関数
def build_model():
    model = Sequential()
    model.add(Conv2D(16,(3,3),input_shape = (28,28,1)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size = (2,2)))

    model.add(Conv2D(32,(3,3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size = (2,2)))

    model.add(Flatten())
 
    model.add(Dense(64))
    model.add(Activation('relu'))
    model.add(Dropout(0.2))
 
    model.add(Dense(10))
    model.add(Activation('softmax'))
 

    model.compile(
    loss='categorical_crossentropy',
    optimizer=Adam(),
    metrics=['accuracy'])
 
    return model
 
#ここから実際に実行
if __name__ == "__main__":
    
   
    #学習用データの読み込みと下準備(MNIST:手書きデータ)
    (X_train, y_train), (X_test, y_test) = mnist.load_data()
    X_train = X_train.reshape(60000, 28,28,1).astype('float32')
    X_test = X_test.reshape(10000, 28,28,1).astype('float32')
    X_train /= 255
    X_test /= 255
 
    y_train = np_utils.to_categorical(y_train, 10)
    y_test = np_utils.to_categorical(y_test, 10)
 
    #モデルを作成、モデルの内容を表示させる。
    model = build_model()
    model.summary()
    
    #学習を実行
    time_start = time.time()
    model.fit(X_train, y_train,batch_size=128,epochs=20,
    validation_data=(X_test, y_test)
    )

    #(学習にかかった時間を表示) 
    time_end = time.time()
    print("time:",(time_end - time_start))
 
    # モデルの評価を行う
    score = model.evaluate(X_test, y_test, verbose=1)
 
    print('loss=', score[0])
    print('accuracy=', score[1])

学習にかかった時間を表示するようになっていますので、これをそのまま使用して各環境での学習時間を比較します。

  

簡易ベンチマーク環境

今回使用した環境は以下の通りです。

1.NVIDIA GeForce RTX 2080 Ti
  家庭用向け高性能グラフィックボード。
  (Amazonで15万ぐらい?’20/9時点)

2.Intel Core i9-9900KF(3.60GHz)
    + 64GBRAM(DDR4-2666 16GB×4デュアルチャンネル)
  家庭向けPC用CPU。(そこそこ高性能)
  KFのFはグラフィック機能なしという意味らしい。(グラボ積んでるため)
  (Amazonで5万くらい。’20/9時点)
  メモリについてはよく分かりません。(Amazonで2.5万くらい。’20/9時点)

3.Google Colaboratory
  以前の記事でも紹介したGoogleが行っているWebクラウドサービス。
  無料で利用できるが使用上の制限がある。
  TPU、GPU、CPUのインスタンスが選択できるのでそれぞれ比較します。

4.Surface Laptop(初代) Core i5 8GBRAMモデル
  CPUはCore i5 -7200U 2.5GHz。
  Surface Laptopとして15万前後のモデル。
  (平均的なノートPCと思ってもらえばよいです。)
  現在はLaptop3などが発売されているのでやや型落ち。(’20/9時点)

ローカル環境(条件1,2,4)ではJupyterNotebookを使用しています。
基本的にはKeras-tensorflowを使用しています。(コードの通り)
keras 2.3.1
tensorflow 2.1.0

  

簡易ベンチマーク結果

環境実行時間[s]
1.RTX 2080 Ti33.36
2.core i9110.35
3-1.Google Colaboratory(TPU)127.96
3-2.Google Colaboratory(GPU)40.79
3-3.Google Colaboratory(CPU)478.93
4.Surface Laptop759.60

結果はこのような感じでした。

一番遅いSurface Laptopと一番早いRTX 2080 Tiを比較すると計算に要する時間は20倍以上違います。
複雑なモデルになると計算時間はGPUを使用して数週間などという場合もありますので、流石にそのような応用編に普通のノートPCを使用するのは無理そうです。

そのほかに印象的なのはGPUを使用しないCore i9が意外と健闘している点です。
メモリまで含めても値段にメリットがあるので候補としてアリな気がします。
またRTX 2080 Tiは搭載RAMが11GBなので、扱えるモデルサイズやバッチサイズに制限が掛かる場合があるため、RAM容量が多いという点もメリットになる場合があります。

もう一点気になるのはGoogle ColaboratoryでTPUを使用した場合の計算結果がGPU使用時よりも長くなっている点です。

これについてもう少し調べてみました。

  

Google Colaboratory(TPU)の実行速度検証

少し調べたところによるとTPUによる計算はバッチサイズが大きいときに有利になりやすい傾向だそうです。

また、以前の記事でも書きましたがkerasではなくtensorflow.keras(tensorflowが用意しているkeras同等機能)を使用すると実行速度に改善が見られました。

(具体的には コードの最初にあるimport 文のkeras をtensorflow.kerasに書き換えます。keras.utilsは実装されていないようですので書き換えずそのまま使用します。)

以前の記事

これらを比較すると以下のようになりました。

環境実行時間[s]
keras使用 batch_size = 128127.96
keras使用 batch_size = 102491.28
tensorflow.keras使用 batch_size = 102437.77

とりあえずGoogle ColaboratoryでGPUを使用した場合よりも早くすることはできました…が、わざわざTPUを使用するメリットが見られません。

深層学習で盛んにTPUやGPUなどが使用される理由は、これらのデバイスが深層学習で多く利用される演算について有利なためです。

使用するモデルによって必要となる演算の種類、量などは異なります。
他サイトでは急激に早くなったというような記述もありますので、それぞれ得手不得手があることは考慮しておかなければいけないようです。

  

PyTorchとの比較

PyTorchとの比較も少ししてみました。
(GPU が稼働中だったのでSurface Laptopでの簡易比較になります。)

使用ライブラリ実行時間[s]
keras(tensorflow)759.60
pytorch1111.56

コーディングの差などあるので単純には比較できないと思いますが、PyTorchではkerasの1.5倍程度の時間が掛かりました。

これだけ見るとtensorflowを使用するのが良さそうです。

また最新研究についてもtensorflowを使用している場合が多く、その内容をそのまま流用できる点もtensorflowの利点です。

  

感想(まとめ)

いくつかの環境での比較を行ってみた感想ですが、Core i9が健闘しているのが意外でした。

私は購入後に後悔するのが嫌で、家庭向けではそこそこの性能であるRTX 2080 Tiを選択しましたが、値段に対する性能で考えるとローカルマシンを使用する場合はもう少し低いグレードでも良いかもしれません。

ただし前述した通り深層学習で扱えるモデルサイズやバッチサイズはRAM容量により制限を受ける場合があります。
GPUはグレードが上がるとRAM容量も増えるようですので、そこを考慮して良いグレードのものを買うのも選択肢の一つだと思います。

RAM容量だけ多いものや、これ以上RAM容量が多いものとなるとワークステーション用のモデルになるようです。
(家庭用も次世代モデルRTX 3080 Tiでは性能、RAM容量ともに向上しているようです。)

 

クラウドサービスを使用する場合、Google Colaboratoryは使用に制限があるので、こちらを騙し騙し使っていくか、有料のクラウドサービスを利用していくことになると思います。

有料サービスとしては有名なところではGoogleやAmazon、Microsoft等のサービスがあります。

料金は使用するマシン性能等によりピンキリのようですが、少し聞いたところでは標準的なマシンで1時間当たり100~150円程度のようです。

  

個人的お勧め:そこそこの性能のローカルマシンを用意する

複雑なモデルを新たに扱う場合、当然トライアンドエラーの連続で、1週間計算させ続けて分かったことは”失敗だった”ということも良くあります。

そのようなモデルを扱う場合、PCを買っておいたほうが精神衛生上良いと思います。

また、”失敗だった”という情報は実際はとても大事ですので、どんどん計算を試し、フィードバックを得るのが良いと思います。

このとき1時間当たり~円という風に考えると失敗するのがもったいなく感じてしまいます。

これらの理由から私は自分のローカルマシンを購入することをお勧めします。
性能については財布や自分のやる気と相談してちょうど良いものを購入するのが良いと思います。

逆に、試しに深層学習を体験してみたい、やることが決まっていてその通りに計算をした結果が欲しい、という場合にはクラウドサービスを利用したほうがお得なのではないかと思います。

常に最新のマシンを利用できるのもクラウドサービスの利点だと思います。
(本当に最新のものはかなり高いかもしれませんが・・・)

  

以上、簡単ですが手持ちの各環境でベンチマーク比較を行ってみました。

最近深層学習の勉強が進んでいないので次回内容については未定です。
(今やっている内容が少し纏まってきたらまた書きたいと思います。)

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です