概要
ディープラーニングの学習を本格的に進めるためにはNVIDIAのGPUを積んだマシンが現状は不可欠です。そんな中、クラウドサービスやレンタルサーバで学習用のマシンをオンデマンドユースで課金する仕組みもいろいろと話題になっています。本記事では、結局どんな環境で学習すればいいの?という人向けに私の学習環境を紹介したいと思います。
クラウド?自宅サーバ?
AWSやAzure上のGPU積みインスタンスを簡単に調べてみました。例えばAWSのp2.xlargeの場合、 1時間当たり200円程度となります。これだけ見ると安く見えますがディープラーニングの学習(特に画像生成など処理が重いタスク)には一週間かかることもざらにあります。例えば一ヶ月起動していると既に10万近くかかってしまいます。この時点で私は選択肢から外しました。
では他に選択肢はないのか?…まだあります。
Google Colaboratoryというグーグルのサービスではなんと無料でGPUマシンを利用することができます。ただ、90分触ってないとセッションが切れたり、12時間でインスタンスが自動的に落とされるという制約があります。うまいこと学習モデルを外部に保存して、毎回ロードしてやればやりくりできなくはないです。私は勉強したての頃はこれで十分満足していましたが、次第に巨大な学習データをやりくりしたいという欲や小さな手間に不満が出てきてしまいました。
【参考まで】
過去にcolabの90分切れ対策の記事を書きました。しかし、それでも12時間制約があります。
Google Colaboratoryの90分セッション切れ対策
結局GPUマシンを買ってしまうのが安上がり
いつでも好きなだけ使える&カスタムし放題&トータルで考えると安上がりという理由から、結局自宅にマシンを置いてしまうのがいいという結論に至りました。自分で組んでしまえば安上がりですし、自作するのが面倒という人もBTOでゲーミングPCを買えばすぐに家でDeepLearningできる環境が整います。
私のGPUマシンの紹介
私も場合は約13万円でGPUを積んだデスクトップを中古パーツをもとに組み立てることができました。当初はNVIDIA GTX 1080Tiという11GBのメモリを積んだGPUを買う予定で秋葉原のPCパーツ店に向かいました。しかし、Ti版(11GB)を1枚買うのとGTX1080(8GB)無印版を2枚買うのとでどちらも値段がほぼ同じだったので、並列で実験を進められるメリットに魅了されて後者を買うことにしました。写真のど真ん中に刺さっているブッとい2枚の板がそれです。
意味もなく常に光っています。
素敵。
自作PC(ディープラーニング用)のスペック
CPU:Core i7 7700 3.60GHz
メモリ:16GB (8GB x 2; DDR4-2400; W4U2400CM-8G)
SSD:256GB
HDD:2TB
CPUクーラー:LEPA
GPU:Geforce GTX1080 (STRIX-GTX1080-A8G) x 2
マザーボード:ASUS STRIX Z270F GAMING
PCケース:Corsair Crystal 460X RGB
電源:850W Corsair HX850i 80PLUS PLATINUM 850W PC
総額13万3000円(中古パーツメイン)
当初の予算は20万円くらい見ていたのでかなり安上がりで組むことができました。しかも見た目にも少々こだわったのでオサレ。裏側もふたを外すとイカツイ。
GPU2枚刺しのメリットはいかに
Tensorflowでは複数のGPUに処理(GANであればGenerator NetworkとDiscriminator Networkの学習)を分けて指定できるので、1枚で学習するよりも実験を高速に学習することができます。また1枚ずつに分けて2つの実験を同時に回すことができるというメリットも非常に大きいです。
ディープラーニング用途としてはSLI(2枚のGPUの合体技)はあまり大きな意味を成しませんが、ロマンを求めてSLIも設定しました。4Kの映像もサクサク出力できます。
ゲームはほぼやりませんがベンチマークソフトも試してみました。SLIなしGPU一枚でもこの通り非常に高性能で、どんなゲームもヌルサクでプレイできます。
ディープラーニングの環境整備
CuDNNというディープラーニングに最適化されたライブラリを使うことで高速にディープラーニングの学習高速化を行うことができます。特に画像認識でお馴染みのCNNの演算では、im2colによって大きな行列の席に変換することができます。GPUは巨大な行列の積の計算するときに本領を発揮します。
計算をうまいこと分散させて効率的な分散学習ができるという点ではTensorflowのような優れたフレームワークを使うことが望ましいです。実際学習速を突き詰めると、ボトルネックとしてメモリ容量やバス帯域、計算量が原因となるケースがあります。
実装の工夫はどうする?
Tensorflowで計算を行う際、学習のiterationの中で、データの前処理(Preprocess)をCPUで計算処理したあとGPUでネットワークの最適化計算を行うという実装が一般的です。しかし、Preprocessの計算が遅いとボトルネックになってしまい、せっかくのGPUの性能を活かしきれないことがあります。
GPU使用率やメモリ使用量をNVIDIA-smiコマンドで監視しつつボトルネックとなっている箇所を高速化していくということが重要です。Windows環境の場合はHW Monitorで監視することができます。
ボトルネックを突き詰めて、例えばCPUで計算していたPreprocess処理をTensorflow側のGPU処理として実装し直せば今まで一週間もかかっていた学習が1日で終わる!なんてケースも考えられます。
学習に使用するGPUの指定方法
LinuxであればCUDA_VISIBLE_DEVICESで指定することができますが、Windows環境ではこちらのコマンドが動作しませんでした。そこで私はPythonコード上で指定して運用しています。
import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = "0,1"
参考:https://qiita.com/resnant/items/80730ae63b26ce39c2e0
まとめ
- クラウドを中途半端に使うくらいならGPUマシンを買いましょう
- 学習時はマシンのリソース使用率を確認しつつボトルネックを調べよう
- CPUで処理するPreprocess(前処理)がボトルネックになりがち