パソコン実験工房PC Watch出張所 - Supported by パソコン工房

ディープラーニング向けPC構成をじっくり吟味してみた

 特定用途において、コストパフォーマンスに優れたPCとはどのようなものか、そしてそれを取り巻く周辺機器の必要性を、専門家やライター、および実際にPCを製造するパソコン工房、PC Watchがともに検討。実際にPCを製品化していくとともに、周辺機器およびその活用を幅広く紹介するこのコーナー。

 2017年5月に、パソコン工房のスタッフとともに、GPUを駆使した汎用演算のサービスやソリューションを展開する国内有数の企業、株式会社フィックスターズを訪れ、ディープラーニング向けに最適なPCの構成を訪ねてきた。

 そしてその後、実際にパソコン工房に、ディープラーニング向けPCを用意していただき、その性能の検証を、ディープラーニングに詳しいフィックスターズの青野博之氏と青木亮氏のお二方に検証していただいた。今回、お二方より、詳しく検証した結果を執筆していただくことができたので掲載する。


 今回、パソコン工房様には4台のPCを用意していただいた。前編では各種パーツとも性能が良ければ良いほどよい、という結論であったが、一方で目的やレベルに応じて、できるだけ安価なモデルもそろえたいという事情があるため、パーツの差を敢えて作るような構成でPCを組んでいただいた。おもな仕様は下表のとおりだ。

テストモデルAテストモデルBテストモデルCテストモデルD
CPUCore i5-7400 (3~3.5GHz/4コア/4スレッド/6MBキャッシュ/TDP65W)Core i7-6800K (3.4~3.6GHz/6コア/12スレッド/15MBキャッシュ/TDP 140W)Core i7-7800X(3.5~4GHz/6コア/12スレッド/8.25MBキャッシュ/TDP 140W)
メインメモリDDR4-2400 4GB×2(デュアルチャンネル/計8GB)DDR4-2400 8GB×4(クアッドチャンネル/計32GB)DDR4-2400 16GB×8(クアッドチャンネル/計128GB)DDR4-2400 16GB×8(クアッドチャンネル/計128GB)
ストレージ1TB 3.5インチ SATA HDD500GB SATA SSD
GPUGeForce GTX 1060 6GB GDDR5GeForce GTX 1080 Ti 11GB GDDR5X ×2GeForce GTX 1060 6GB GDDR5
チップセットZ270チップセットX99チップセットX299チップセット
電源500W 80PLUS Silver認証 ATX電源700W 80PLUS Bronze認証 ATX電源1,000W 80PLUS Platinum認証 ATX電源1,200W 80PLUS Platinum認証 ATX電源
左から、テストモデルA、テストモデルB、テストモデルC、テストモデルD(検証機のため、実際に販売されるモデルとケースが異なります)

 当初、テストモデルA、テストモデルB、テストモデルCの3台での検証を予定していたが、検証期間中に、新たにX299チップセットおよび、Core i7-7800Xがリリースされたため、急遽テストモデルDも追加しての検証となった。

 テストモデルDはGPU非搭載の状態でお借りしたので、どのGPUを載せるのか自由度があったのだが、CPUとGPUの性能差を比較するさい、AのCPUであるCore i5-7400との比較を行ないたかったため、GeForce GTX 1060 6GB GDDR5を選択した。

 今回いずれのPCもUbuntu 16.04をプリインストールしていただいた状態でお借りしたため、電源を入れてすぐに作業に入ることができた。検証は基本的にSSHを使いリモートで行なった(実際の販売時はOSなしの本体となるため、OSのインストールを別途行なう必要があります)。

検証方法の紹介

 まず今回実施した検証方法の概要とその目的を紹介したい。大目的は、「ディープラーニングに適したPCを企画すること」であるので、「どういった構成のPCがディープラーニングに適しているか」という問題解くべく、検証目的と方法を考案してみた。

#検証の目的演算装置前処理データセットネットワーク評価指標
1GPUの必要性を確認するCPU(全コア)なしMNISTMLP※1学習のスループット
GPU(1枚)
CPU(全コア)あり
GPU(1枚)
2CPUの性能差による影響をみるCPU(1~6コア)なしMNISTMLP※1学習のスループット
CPU(1~6コア)あり
3メインメモリの容量差による影響をみるCPU(全コア)なしCifar100VGG16学習のスループット
最大メモリ格納画像数
4ストレージ性能差による影響をみるCPU(全コア)なしCifar100VGG16学習のスループット
5GPU性能差による影響をみるGPU(1枚)なしCifar100ResNet50,101,152学習のスループット
最大実行バッチサイズ
GPU(2枚 データ並列)
GPU(2枚 モデル並列)

※1 MLP(Multi Layer Perceptron)

 はじめに、ディープラーニングおいてそもそもGPUが必要なのかどうかを改めて確認し、その上で、CPU、メインメモリ、ストレージ、そしてGPUについて、それぞれ負荷をかけ、パーツの差異によってどの程度性能差が現れるか確認し、よりコストをかけるべきパーツを確認するというシナリオだ。

 また、今回の検証ではディープラーニングの“学習”に焦点を当てている。前編で述べたように、ディープラーニングは学習と推論の2フェーズから成るが、学習の方がマシンスペックを必要とするためだ。加えて、環境セットアップの簡略化、均一化を図るため、Dockerを使用した。

ディープラーニングフレームワークについて

 今回、ディープラーニングフレームワークとして、Chainerを使用することとした。理由は社内での利用実績が多かったことや、導入が比較的簡単である点、初学者でもわかりやすい点が挙げられる。よって、今回の結果はChainerに依存した結果であることにもご留意頂きたい。

前処理について

 機械学習では訓練時に使用するデータの数が少ないと、訓練データにモデルを過剰に合わせ込んでしまう過学習という現象が見られる。過学習を避けるため、訓練データに特殊な処理を施して少し変形させ、訓練データの数を水増しするという方法が良くとられている。これをデータ拡張と呼ぶが、今回はこのデータ拡張が行われる場合を再現するため、一部の検証において入力画像に対して3x3のGaussianフィルタとSobelフィルタをかけるという前処理を行なった。

データセットについて

 データセットとは、学習に必要となるデータと、そのデータが何を表しているかという正解ラベルをセットにしたものだ。今回検証に使用したデータセットの詳細は下表のとおりである。

ネットワークについて

 前編で触れたとおり、ディープラーニングでは多層のニューラルネットワークを使って学習を行なうが、そのときのネットワークの構成によって学習時や推論時の処理量が変化する。今回はMLP、VGG16、ResNetという3種類のネットワークを用いて検証を行なった。なお、ResNetはネットワークの層数が異なるResNet50、ResNet101、ResNet152という3つのネットワークを使って検証している。処理量としてはMLP < VGG16 < ResNetの順に大きくなる。

評価指標について

 ディープラーニングでは訓練画像に対して推論を行ない、推論結果と正解との誤差をネットワークの“重み”に反映するまでを1イテレーションとしてカウントする。今回は単位時間あたりに処理できたイテレーション数をスループットとして計測した(以降、単にスループットと表記したものは、単位時間あたりに処理できたイテレーション数を指すものとする)。

 また、学習を行なうさいは、すべての訓練画像に対して誤差を計算して重みを更新するのではなく、訓練画像を決められた枚数の集合に分けて、その集合の単位で重みを更新するという手法がとられる。このサンプル集合のことを“ミニバッチ”と呼び、ミニバッチのサイズをちょうどよい大きさに調整することで学習が収束するまでの時間を短縮することができる。訓練時に計算できる最大のミニバッチサイズはGPUのメモリ容量に依存するため、各GPUでどの程度のミニバッチサイズまで計算を行なうことができるかについても検証を行なった。

※時間の都合により、X299はCPUの性能差を見る検証1,2のみ実施した。
※今回、CPUのHyper Threading機能が有効であるとDockerでの挙動が安定しなかったため、Hyper Threading機能は無効化して計測している。
※今回、検証プログラムでは、基本的にchainer.iterators.SerialIteratorを使用している。

検証の様子
Gitlab CI、Docker、ShellScriptなどを用いて検証を実施している。社内のGitリポジトリに変更をPushすると、Gitlab CIによって各モデル上で自動的に検証プログラムが実行される
検証プログラムはDockerを使い、都度仮想環境を立ち上げ、実際の学習が仮想環境内で実行される。実行結果はGitlab上にアーカイブされる。

 それでは、それぞれの検証について詳しくみていきたい。

検証1:GPUの必要性を確認する

 まずディープラーニングについてあまり知識のない方向けに、改めてGPUの必要性を示そうと考え、CPUとGPUで性能差を比較することとした。

 ハードウェア環境としては、A、B、C、Dの4つのテストモデルを使用し、それぞれでChainerに付属するMNISTサンプルプログラム(/example/mnist/train_mnist.py)をCPU (各モデルのCPUコアをすべて使用)とGPU (各モデル1枚のみ)でそれぞれ実行し、スループットを計測した。

 今回使用したMNISTは手書きの数字の画像データセットであり、MNISTサンプルプログラムはその手書き文字を認識するネットワークを学習するサンプルプログラムである。MNISTを採用したのは、使用されているMLPネットワークが軽量で、CPUでの検証が短時間で終わるためである。
検証の結果は下図のようになった。

 グラフのとおり、CPUに比べ、GPUの方が圧倒的に高速に処理可能であることが見て取れる。使用するCPUやGPUなどにもよるが、今回の実験では、じつに6~11倍もの差が現れた。やはり、ディープラーニングの学習を効率的に行なうには、GPUは重要なパーツであることがわかる。

 モデル間での性能を比べてみると、CPUのみを使用して学習した結果では、D、C、Bがほぼ同等、次いでAの順で高速であった。これはCPUを使った学習がマルチスレッドで計算されるため、おもにコア数が効いた結果と思われる。

 一方で、GPUを使用して学習した結果では、B、Cの性能がD、Aの性能より低い結果となった。詳しく調べてみないと確かなことは言えないが、おそらくDとAに搭載されている世代の新しいCPUのシングルスレッド性能が高いからと思われる。

 これは、GPUを使用した学習といっても、画像の読み込みなどのCPUでしかできない処理や、GPUに向いていない処理などはCPUで実行されるため、そうした処理が最新のCPUだとより速く完了するからという推測によるものだ。

 このように、検証1の結果、CPUよりもGPUの方が単位時間あたりにより多くの学習を行なえることが示された。ディープラーニングの学習では、ネットワークそのものの構造や、ネットワークの初期値、重みの更新方法、ミニバッチサイズなどのさまざまなパラメータを変更しながら何度も学習を行なうことが多いため、より速く学習を行なえるGPUは非常に有益だと言える。そのため、ディープラーニング用PCとしてGPUを搭載することは必須といってよいだろう。

検証2:CPUの性能差による影響をみる

 検証1によって、ディープラーニングを実践するに当たりGPUが大切であることは理解いただけたと思う。では、とにかくGPUの性能だけ高めればよいかというと、じつはそういうわけでもない。もちろん性能の良いGPUを載せた方がスループットは上がるが、ディープラーニングの学習においては、過学習を避けるため学習の前処理として、よくデータを水増し(データ拡張)しながら学習を行なうことがある。こうした前処理は主にCPUで実行するため、前処理の計算量によっては、CPUの処理能力も重要になってくる。

 検証2では、こうした状況を再現し、CPUの性能差がどの程度前処理を含んだ学習に影響するかを確認する。今回は、検証1で使用したプログラムをベースとし、前処理として入力画像に対して3x3のGaussianフィルタとSobelフィルタをかける処理を追加した。そして検証1と同様に、CPUとGPUで実行し、スループットを計測した。加えて、各CPUのコア数を1~6と変化させ、どのようにスループット変わるのか、スケーラビリティについても検証した。

 まず、検証1と同様にCPUとGPUでそれぞれ学習させたさいのスループットが下図である。

 前処理が加わったことで、全体的に性能は低下しているが、GPUのスループットの方がやはり高い。しかし検証1と比べるとCPUとGPUの差は縮まっており、その差は約2.2~3倍となった。

 また、グラフからわかるように、今回はDがCPU、GPUの両方で一番良い結果となった。これは前処理が加わったことで、CPUでの計算負荷が増加し、より一層CPUの性能差が顕著に現れることとなったからと思われる。

 さて、CPUのみで学習したさいのスケーラビリティの方はどうだろうか。前処理の有無も踏まえて見てみよう。今回はDockerの機能を使用してCPUの割り当てを制限することで擬似的にスケーラビリティを検証した。

 上図は縦軸がスループット、横軸が使用したコア数となっている。AのCPUは物理4コアであるため、コア数が5、6の箇所はブランクとなっている。一方、B、C、DのCPUは物理6コアである。各モデルとも、最大コア数におけるスループットは前述した検証と条件が同じであるため、結果がほぼ一致している。

 こちらもだいたいの傾向は、これまでの検証と同じである。前処理がない場合では、B、C、Dがほぼ同性能となり、前処理がある場合では、最新のDが強い。ただし、前処理がない場合では、コア数に応じてスループットがスケールしているが、前処理がある場合では、前処理が並列処理されていないためか、前処理がない場合ほどコア数に応じた性能向上は見られなかった。

 このように、検証2の結果、CPUのみで学習をする上では、コア数も一定の意味があることや、並列化されていない前処理を行なうのであれば、シングルスレッド性能が高い最新世代のCPUを使用した方が良い性能であることがわかった。しかし、実際は検証1で示されたように、基本的にGPUを使用した学習となるため、CPUにコストをかけるよりは、GPUにコストをかけた方が、最終的なコストパフォーマンスは高いと言えそうだ。

 また経験者向けに補足しておくと、検証2でchainer.iterators.SerialIteratorの代わりに、chainer.iterators.MultiprocessIteratorを使用すれば、CPUでの前処理とGPUでの学習処理が並列に処理されるため、GPUの処理時間よりもCPUの前処理時間が短い場合においては、うまくCPU処理時間を隠蔽できる。結果として、CPUの性能がボトルネックでは無くなることもあるのでご留意頂きたい。

検証3:メインメモリの容量差による影響をみる

 検証3では、メインメモリの容量差による影響を確認しようと思う。なぜメインメモリ速度差による影響ではなく、容量差による影響を調べたのかと疑問に思う読者の方もいらっしゃると思うので念のため理由を説明しておく。

 モデル仕様表のとおり、今回のモデルに搭載されているメインメモリはすべてDDR4-2400規格に対応したものであるが、メモリモジュールの型番がモデル間で異なるため、CL値やバンク数まで同じではなく、単純な比較ができない。また、CPUのキャッシュ等を含めたメモリ階層の影響も多く受けるため、比較が難しいという点もあり、今回はわかりやすい容量差のみを検証した。

 検証1、2で使用したMLPネットワークは比較的軽量なネットワークであり、GPUでの学習負荷もあまり高くなく、CPUの性能差も割と現れていた。検証3では、メインメモリの速度差、しいては、I/O周りの速度差の影響を抑えたいため、GPUの負荷を上げ、CPUやメインメモリの速度差を無視できるような状況を作り出すこととした。

 このような状況を作り出すには、より学習負荷の高いネットワークモデルが必要となることに加え、今回はメインメモリの容量に負荷をかけるため、入力データの容量もある程度大きいものが望ましい。そこで検証3では、Chainerのcifarサンプルプログラム(/example/cifar /train_cifar.py)をCifar100データセットと共に使用することとした。

 Cifarサンプルサンプルプログラムは、データセットからVGG16ネットワークを用いて画像を分類するネットワークを学習させるものである。検証では、Cifar100データセットのサイズを2倍/4倍/8倍……と大きくできるようにプログラムを若干改良した。検証の結果を下図に示す。

 上図は縦軸がスループット、横軸が入力データのスケールファクタとなっている。スケールファクタが、2、4、8、と増えると、入力データの容量が、2倍、4倍、8倍となることを表している。また、グラフが途中で切れているものがあるが、これはAがスケールファクタ8まで、Bがスケールファクタ32まで、Cがスケールファクタ256まで実行できたということを表している。

 グラフからは、同じGPU(GeForce GTX 1060)を搭載しているAとBがほぼ同スループットに、GeForce GTX 1080 Tiを搭載しているCが一番高いスループットを発揮しており、検証1、2に比べてGPUへの負荷が大きくなったことがわかる。これは入力データ量が大きくなるほどGPUでの処理時間が増加し、CPUでの処理時間(性能)が影響しにくくなるからである。また、スケールファクタ1よりも2以降の方でスループットが上昇しているため、スケールファクタ1ではGPUにまだ余裕があったことが伺える。

 次に最大入力データサイズとメインメモリサイズの関係についてみてみよう。

 上図は、モデルごとの最大入力データサイズとメインメモリ容量を重ねたグラフである。今回使用したcifar100データセットはスケールファクタ1のとき、約700MiBであるので、Aは約5.47GiB、Bは約21.88GiB、Cは約175GiBまでの入力データまでをメインメモリ上に展開した状態で学習を完了できたということを示している。

 各モデルのメインメモリサイズはそれぞれ、8GiB、32GiB、128GiBであるので、Cのみ、物理容量を超えて処理を実行していたことを表しており、後ほど調べてみたところ、スワップ領域を使用して実行したいたことがわかった。

 A、Bはというと、物理容量を超えるスケールファクタではGPUコードをコンパイルするフェーズでメモリアロケーションに失敗し、実行が停止していた。これはスケールファクタが256のケースのCでも同じ状況であるはずだが、Cのみ実行できた理由は不明だ。

 ちなみに、A、BでGPUを使わ、CPUのみで学習を試みたところ、物理容量を超えても学習は行なうことができた。そのとき、同様にスワップ領域を使用していた。

 このように、検証3ではメインメモリに展開する入力データを増やしていったときに、物理容量を超える入力データが展開されると、GPUを用いた学習が開始できない可能性が示された。よってディープラーニング向けのPCを選定する上では、入力データ量に応じてメインメモリを選ぶ必要があると言えそうだ。

 とはいえ、これは入力データをメインメモリに全て展開する必要がある場合に限ったものだ。じつは、今回使用したcifarサンプルプログラムはミニバッチ単位で学習を行なうため、適切にプログラムを実装すれば、ミニバッチ分の入力データのみをメインメモリに展開するだけで、学習が可能である。

 しかし、現在のサンプルプログラムではミニバッチサイズに関係なく、プログラムのはじめに入力データを全てメインメモリに展開するため、今回のような結果となった。手間はかかるが、うまくプログラミングすれば、ミニバッチ分のデータ量を都度展開することも可能であると考えられるため、ミニバッチ分のデータが展開できるメインメモリを選ぶことで、こうした状況は回避できると思われる。

検証4:ストレージの性能差による影響をみる

 検証4では、ディープラーニングにおいて、HDDを選べば良いのか、SSDを選べば良いのかを見極めるため、敢えて入力データをHDDおよびSSDから必要になったタイミングで読み込ませ、性能に対してどのような影響があるのかを検証した。基本的には検証3で使用したciferサンプルプログラムをベースとし、予めcifar100データセットをストレージに保存しておき、学習時に都度データを読み込むchainer.datasets.LabeledImageDatasetクラスを使用して実装した。

 検証では、ストレージ以外のスペックがほぼ同じである、BとCを使い、条件を揃えるため、CPUのみで学習を行なった(GPUがモデル間で異なるため)。結果は下図である。

 ご覧のとおりであるが、結果はさほど差がない結果となった。スループットはインメモリと比べると126~130分の1程度にまで下がってしまっている。この検証では、入力データの読み込みをシーケンシャルに実行するchainer.iterators.SerialIteratorを使用したが、データの読み込みを並列に実行するchainer.iterators.MultiprocessIteratorを使用しても結果はほとんど変化がなかった。これは、CPUで前処理と学習を同時に行なっているため、うまく処理を隠蔽できなかったからと考えられる。

 このように、検証4の結果ChainerのcifarサンプルプログラムにおいてはHDDとSSDの性能差による影響はあまりないことがわかった。今回使用したプログラムでは、cifar100データセットをデフォルトのミニバッチサイズで学習するように処理させたが、cifar100データセットの各データは32x32ピクセルのカラー画像であるため、ストレージには細かなI/Oがランダムに発生するはずである。ランダムI/Oであれば、SSDの方にかなり分あるのだが、結果からはそこまで差が見られないため、今回の手法で正しくHDDとSSDに対して負荷をかけられているか不安が残る結果となってしまった。

 残念ながら時間も足りず追加の検証も間に合わなかったが、仮に今回の結果が入力データのサイズ不足であったとすれば、1つの入力データがとても大きい場合、例えばフルHD画像のようなものを使って学習させるケースなら、よりストレージに対して負荷がかかり、SSDの優位性が示せるかもしれない。

 とはいえ、ディープラーニングによる学習ではデータの入出力よりも演算がネックになるケースが多いと思われるため、演算の裏で同時にストレージにアクセスするようにプログラミングできれば、ストレージ性能の影響はあまり受けずに済む可能性も十分ある。

 結論としては、ストレージを選定するさい、性能は通常のPCと同様に考えれば良いと思う。つまり、ディープラーニング以外の普段の作業などの体感速度を上げたければSSDを選べば良いだろうし、速度よりもコストや容量を取るのであればHDDを選ぶという形だ。資金に余裕があればハイブリッド構成も良いと思う。ただし、ディープラーニングで使用するオープンデータの中には、数百GiBのものもあるため、総合するとディープラーニングに特化したPCとしてはHDDも有力な選択肢となるだろう。

検証5:GPUの性能差による影響をみる

 検証1の結果、GPUによる学習の高速化効果が高いことは示されたが、GPU間での差はどのくらいあるのだろうか。検証5では、これまでの中でも最も複雑なResNetネットワークモデルを使い、GPUに対してより負荷がかかる条件下において、ミニバッチサイズ変えつつ、スループットがどのように変化するのか確認する。まずは下記条件下でA、B、Cの3モデル間の性能を比較する。

・使用するGPUの数は1枚
・ネットワークモデル:ResNet50,101, 152の3モデル
・エポック数:5
・ミニバッチサイズ:デフォルトの32から2倍ずつ増やしていく

 ここで簡単にミニバッチサイズ、ネットワークモデルとGPUメモリサイズに関して解説しておこう。ディープラーニングでは、ミニバッチサイズが大きくなるとネットワーク自体が大きくなるため、必要なGPUメモリが増加する。また、ネットワークモデルに関しても、ResNet50より101が、101より152が層が深いため、必要なGPUメモリが増加する。よって、ミニバッチサイズが大きく、かつ層も深いネットワークがよりGPUメモリを消費するということである。

 検証の結果は下図のようになった。

 上図は、縦軸がミニバッチサイズとネットワークモデルを、横軸がスループットを表している。A、Bでは、ミニバッチサイズが32のとき、ResNet50とResNet101が実行できたがそれ以外のケースではGPUメモリが不足したため、実行ができなかった。

 一方Cは、ミニバッチサイズが32のとき、ResNet50、101、152の全てのモデルを実行でき、さらにミニバッチサイズが64のとき、ResNet50、101まで実行が可能であったが、CもResNet152では、ミニバッチサイズが64でGPUメモリ不足となり実行することはできなかった。また、A、BとCでスループットを比較すると、いずれも約2.3倍の差があることがわかった。

 上記の結果からは、やはりGPUの性能が高いほどスループットが高く、より大規模なネットワークモデルも実行できるため、そういったユースケースを考えているユーザは性能がよいGPUを使うべきだということが言えそうだ。

 さて、次はGPUが2枚搭載されているCのみを用いて、ディープラーニングの並列処理を行なっていこうと思う。ディープラーニングにける並列処理は大きく2つに分けられる。1つはデータ並列、もう1つはモデル並列である。

 データ並列とは、下図のように複数のGPUに配置した同一のネットワークモデルに対して、異なるミニバッチデータを入力として推論を実行し、得られた2つの誤差の平均をとるなどをして学習を進める手法である。

引用:https://www.tensorflow.org/images/Parallelism.png

 一方モデル並列とは、下図のように1つのネットワークモデルを複数のGPUに分割して処理を実行する手法である。

引用:https://static.googleusercontent.com/media/research.google.com/ja//archive/large_deep_networks_nips2012.pdf

 まずはデータ並列での性能を下記条件下で比較する。

・使用するGPUの数は2枚(Cのみ)
・データ並列による分散処理
・ネットワークモデル:ResNet50,101, 152の3モデル
・エポック数:5
・ミニバッチサイズ:デフォルトの32から2倍ずつ増やしていく

 結果は下図である。

 上図は縦軸がミニバッチサイズ、横軸がスループットである。比較のため、GPU 1枚の時の結果も含んでいる。データ並列処理では、2枚分のGPUメモリを使えるため、GPU 1枚の時よりメモリを消費するケースにおいても実行が可能となった。また、ResNet50,101のスループットは、GPU 1枚のときよりも約1.04~1.26倍ほど向上した。一方ResNet152においては、スループットがGPU 1枚のときよりも0.88倍ほどに低下していた。

 最後にモデル並列での性能を下記条件下で比較する。

・使用するGPUの数は2枚(Cのみ)
・モデル並列による分散処理
・ネットワークモデル:ResNet50,101, 152の3モデル
・エポック数:5
・ミニバッチサイズ:デフォルトの32から2倍ずつ増やしていく

モデルについては下図のような分割を行なっている。

引用:http://book.paddlepaddle.org/03.image_classification/

 結果は下図である。

 モデル並列処理では、データ並列同様、GPU1枚の時よりメモリ消費が増加するケースでも実行が可能となった。しかし、スループットがGPU1枚の時よりも約0.91~0.97倍ほどとなり、性能が低下する結果となった。これはGPU1枚の時やデータ並列の時よりも多く、CPUとGPU間でやりとりが発生するからと考えられる。

 検証5の結果をまとめると、GPUについてはやはり単体性能が高い方がディープラーニングの学習において高いスループットを得られることがわかった。また、GPUのメモリサイズに関しても容量が多いほうが、より大きなネットワークを学習できることもわかった。

 よって、GPUに関しては完全に予算次第ということになる。しっかりディープラーニングを学んでいきたいユーザーには、今回使用したGeForce GTX 1080 Tiクラスのものが必要だとは思うが、初学者向けという意味では、GeForce GTX 1060 6GB GDDR5でも十分ディープラーニングのいろはを体験できると感じた。

 また、複数GPUを使うことで、より大規模なネットワークモデルの学習が行なえるということも示された。これは言い換えると、1枚ではGPUのメモリサイズが足りないため実行できなかったモデルも、複数GPUなら実行できるということである。この結果から、時間がかかるかもしれないが、コストが安いGPUを複数枚使用することで、大規模なネットワークモデルも学習できる可能性があると言える。

改めて構成を考えてみた

 これまでの考察を踏まえると、今回の検証で使用した各モデルの仕様も悪くはない。とは言え、CPUよりもGPUの方に比重があるディープラーニング向けPCの場合、よりGPUに重きを置いた仕様が適していると感じた。具体的には使用するGPUの枚数に軸足を置き、そこから仕様を考えるということだ。改めて考えたみた仕様表が下記である。

【GPUが2枚以下のケース】
エントリーモデルアドバンスモデルプロモデル
CPU・「メインストリーム向け」インテルCoreプロセッサー
・[オプション]その他CPU
メインメモリ8GB×2(デュアルチャンネル/計16GB)8GB×4(デュアルチャンネル/計32GB)16GB×4(デュアルチャンネル/計64GB)
ストレージ・1TB 3.5インチ SATA HDD
・[オプション] 500GB SATA SSD
・[オプション] 1TB 3.5インチ SATA HDD x 2
・[オプション] HDD+SSDなど
GPU・GeForce GTX 1060 6GB GDDR5(ミドルレンジグラフィックカード)
・[オプション]その他GPU
※枚数が選べる
・GeForce GTX 1070 8GB GDDR5(ハイエンドグラフィックカード)
・[オプション]その他GPU
※枚数が選べる
・GeForce GTX 1080 Ti 11GB GDDR5X(ハイエンドグラフィックカード)
・[オプション]その他GPU
※枚数が選べる
チップセットメインストリーム向け チップセット
電源・500W ATX電源
・[オプション]その他
・700W ATX電源
・[オプション]その他
【GPUが3枚以上のケース】
エントリーモデルアドバンスモデルプロモデル
CPU・「ハイエンドデスクトップ向け」インテルCoreシリーズプロセッサー(メモリ搭載容量、PCI-Expressレーン数の多いもの)
・[オプション]その他上位CPU
メインメモリ8GB×4
(クアッドチャンネル/計32GB)
16GB×4
(クアッドチャンネル/計64GB)
16GB×8
(クアッドチャンネル/計128GB)
ストレージ・1TB 3.5インチ SATA HDD
・[オプション] 500GB SATA SSD
・[オプション] 1TB 3.5インチ SATA HDD x 2
・[オプション] HDD+SSDなど
GPU・GeForce GTX 1060 6GB GDDR5(ミドルレンジグラフィックカード)
・[オプション]その他GPU
※枚数が選べる
・GeForce GTX 1070 8GB GDDR5(ハイエンドグラフィックカード)
・[オプション]その他GPU
※枚数が選べる
・GeForce GTX 1080 Ti 11GB GDDR5X(ハイエンドグラフィックカード)
・[オプション]その他GPU
※枚数が選べる
チップセット(CPUに合わせて変更)
・ハイエンドデスクトップ向け チップセット
電源・700W ATX電源
・[オプション]その他
・850W ATX電源
・[オプション]その他

 まず、GPUの枚数に応じたCPUとチップセットの組み合わせを考えた。GPUの性能が重要であるディープラーニング向けPCの場合、無理にコア数が多いCPUを積まなくてもよいので、LGA1151系CPUを使った方がコストも抑えられてよいのでは、ということだ。

 ただし、LGA1151系CPUは、CPU及びチップセットにてサポートされているPCIe のレーン数の関係で、搭載できるGPUは2枚が限界である。しかし、逆にGPU 2枚までであればLGA1151系CPUで十分と言うことだ。

 一方で3枚以上のGPUが必要なユーザーには、LGA2011-v3、LGA2066系のハイエンドCPUとチップセットを使うことで、GPUが4枚まで搭載可能なPCを実現する。GPUの枚数を多くしたいと言うことは、より深いネットワークやよりワイドなネットワークを実装したいという事になるため、メインメモリの容量もそれに応じて16~128GiBまで対応させてみた。

 ストレージに関しては、GPUの枚数にはあまり関係がないと思うので、通常のBTOのように目的に合わせて自由に選択できる形式が良いと思う。

 とくにディープラーニングにおいては、前準備として多くのファイル操作(オフラインでのデータ拡張処理など)を行なうことが想定されるため、仮にHDDを選ぶのであれば、2台搭載すると良いと思う。1台でデータ操作を行なうと、読み込みと書き込みが同じHDDとなるため、I/Oがランダムになり、HDDでは時間がかかってしまうためだ(SSDであればその心配はないと思うが、バイト当たりのコストは高くなる)。

 データ操作を行なう元のデータを一方のHDDに、データ操作を行なった結果をもう一方のHDDに格納することで、シーケンシャルにアクセスができるため、作業効率が上がると予想される。

 肝心のGPUに関しては、モデルごとに仮にGeForce GTX 1060、GeForce GTX 1070、GeForce GTX 1080 Tiとしてみたが、初期設定はこれとしても、実際に購入するさいはより柔軟にグレードや枚数を選べるような設定にして頂くと購入するユーザは嬉しいと思う。

まとめ

 時間の関係もあり、細かな検証ができなかったが、何とかディープラーニング向けPCとしての方向性は定まったのではないかと思う。実際どのグレードのGPUを使うかどうかは、なるべく単位時間当たりの学習回数を多くしたいのか、さまざまな規模のネットワーク試して見たいのかによって変わってくると思うが、ディープラーニングのトレンドとして、ネットワークはより複雑になっているため、将来を考えると、より演算能力が高く、メモリ量が多いGPUが期待される。

 今後そういったGPUが出てくることで、さらに快適なディープラーニング環境が手に入ると思われるため、予算が少ないユーザは安いGPUを選び、自身のステップアップに応じて同じ型番のGPUを増設し、新しいGPUが出たタイミングでリプレースするというやり方もアリなのではないだろうか。

 今回の検証結果をベースに、最終的に販売する構成については下記モデルでの展開となった。

 検証中にCPU世代交代があったため、X99の代わりにX299をベースとしたモデル、Z270の代わりにH110モデルをベースとしたモデル、検証確認次第、追って最新の構成をこれらの後継として追加でリリースされ続ける予定だ。

 H110モデルはメモリスロットが2本までとなり最大メモリ搭載容量が32GBまでとなるが、コストが抑えられるため、エントリーモデルとしては最適だろう。

 アドバンスモデルでは、メモリ最大搭載容量とグラフィックカード搭載数がアドバンテージとなるラインナップだ。グラフィックカードを標準で2枚搭載する構成はオプションで対応、純粋なパフォーマンス追求としてアドバンスモデルではグラフィックカードにGeForce GTX 1080 Tiを標準搭載とした。

 いずれのモデルもOSなしとなるので、Linuxなど用途に応じたOSをインストールして使用することができる。もちろんオプションでWindows 10も選択可能だ。

【DeepLearning向けパソコン】
エントリーモデルスタンダードモデルAスタンダードモデルBスタンダードモデルCアドバンスモデル
OSなし
CPUCore i5-7400 (3.0-3.5GHz/4コア/4スレッド/6MBキャッシュ/TDP65W)Core i7-7700 (3.6-4.2GHz/4コア/8スレッド/8MBキャッシュ/TDP65W)Core i7-6850K(3.6-4.0GHz/6コア/12スレッド/15MBキャッシュ/TDP140W)Core i7-7800X (3.5-4.0GHz/6コア/12スレッド/8.25MBキャッシュ/TDP140W)Core i9-7900X (3.3-4.3GHz/10コア/20スレッド/13.75MBキャッシュ/TDP140W)
メインメモリDDR4-2400 8GB×2(デュアルチャンネル/計16GB)DDR4-2400 4GB×4(クアッドチャネル/計16GBDDR4-2400 8GB×4(クアッドチャンネル/計32GB)DDR4-2400 16GB×4(クアッドチャンネル/計64GB)
ストレージ1TB 3.5インチ SATA HDD
GPUGeForce GTX 1060 6GB GDDR5GeForce GTX 1080 Ti 11GB GDDR5X
チップセットH110チップセットX99 チップセットX299チップセット
電源500W 80PLUS SILVER認証 ATX電源700W 80PLUS BRONZE認証 ATX電源
製品情報SENSE-M022-i5-RN-DL [DeepLearning]SENSE-M022-i7K-RN-DL [DeepLearning]SENSE-RA09-i7BK-RN-DL [DeepLearning]SENSE-R029-i7SX-RN-DL [DeepLearning]SENSE-R029-i9SX-XN-DL [DeepLearning]