思考、あるいは学習の"性能"
お久しぶりです。堀田です。
他のブログ記事でもたびたび紹介されていますが、弊社では機械学習を用いた案件や展示をいくつか取り組んできました。
数年前のブレイクスルーで持て囃された時期と比較すると落ち着いてきたような印象は受けますが、各所で研究は続けられており様々な手法が提案されています。
しかし、高精度な手法が出てきても要求されるコンピューターの性能がとんでもないものばかりだったり……
例えば、弊社ではオートモーティブワールドにて自己教師あり学習についての展示を行いましたが、自己教師あり学習の代表的な手法であるSimCLRの論文(https://arxiv.org/pdf/2006.10029.pdf)では128 Cloud TPUという機械学習分野に明るくない人にとってはなんかすごそうとしか分からないようなコンピューターが用いられています。
そこで、今回は機械学習にコンピュータースペックがどれくらい必要なのか、簡単に紹介しようと思います。
演算装置
機械学習においてCPUやGPU等といった演算処理装置に要求されるのは、何よりも速さです。
昨今のCPUにみられる予測や最適化といった汎用的な処理のための工夫はそれほど要求されず、TFLOPS等という計算速度の指標がよく用いられます。
CPU
Central Processing Unitの略です。
詳しい説明はWikipediaに譲りますが(CPU - Wikipedia)、色々な計算ができるコンピューターの頭脳です。
色々計算できるので当然機械学習にも使用可能ですが、複雑な計算よりも早い計算を必要とする機械学習分野にとっては何でも屋では力不足のため補助的な役割にとどまります。
機械学習フレームワークやライブラリでは大体CPU実行にも対応していますが、実用的な性能のものはほぼ後述のGPU等が使われています。
GPU
Graphics Processing Unitの略。(Graphics Processing Unit - Wikipedia)
画像処理に特化した計算処理装置です。
CPUに比べ単純な計算を並列実行することに特化しており、画像処理以外に用いられる場合はGPGPUという言い方をしたりもします。
NVIDIAの最近のGPUにはTensor Coreという機械学習向けの計算を高速に行うことのできる演算装置が組み込まれています。
TPU
Tensor Processing Unitの略。(テンソル・プロセッシング・ユニット - Wikipedia)
Googleが開発したものであり、GPUを機械学習の推論用途向けに特化させたものであり、計算精度を8bitまで落としたり描画に必要な処理を省いたりしているらしい。
Google Cloudで利用することができます。1時間あたり8ドル/TPU(Cloud TPU | Google Cloud)なので128TPUだと1時間で1,000ドル超えますね……
メモリ
機械学習にてメモリ使用量が多いのは学習時であり、主な要因は入力データとネットワークの重みパラメータの2つです。
入力データや重みを読み込み保存するためにメインメモリ(RAM)が、計算するためにGPUのメモリ(VRAM)が使用されるため、両方が重要になってきます。
機械学習においては計算を効率よく行うために複数の入力データをまとめてバッチと呼ばれる塊として計算を行うことが多いのですが、このバッチの大きさ(バッチサイズ)を大きくすると入力データとネットワークの重みパラメータもその分計算を行うために用意しなければならないためメモリ使用量が膨れ上がります。
ネットワークの重みがどれほどになるかというと、例えば先に挙げたSimCLRで用いられている50層ResNetでは約2,600万個の重みパラメータを持つため、32ビットの変数を用いると約104MBになります。これがバッチサイズ分積み重なるため、華々しく研究結果として報告されるようなバッチサイズ100とかの学習を実行するのはお手軽にはいきません。
データセットはバッチサイズ分ずつ読み込むのであれば問題になることは少ないのですが、高解像度の画像や動画のデータセットを扱う際は注意が必要です。
迂闊にデータセットを丸ごと読み込むようなコードを書かないようにしましょう……
推論時にメモリを使うかどうかは用途によりけりで、例えばカメラ画像のリアルタイム検知であればバッチでの実行は行わないためメモリはそれほど使用しません。