ニューラルネットワークをトレーニングするためのCPUとGPUの選択


29

GPUの「オーバーヘッド」についての議論を見てきました。「小さな」ネットワークの場合、GPUよりも実際にCPU(またはCPUのネットワーク)でトレーニングする方が速いかもしれません。

「小さい」とはどういう意味ですか?

たとえば、100個の隠れユニットを持つ単一層MLPは「小さい」でしょうか?

「小規模」の定義は、リカレントアーキテクチャに対して変わりますか?

CPUでトレーニングするかGPUでトレーニングするかを決定するときに考慮する必要がある他の基準はありますか?

編集1:

私はブログの記事を見つけました(?おそらく古いそれは2014年からです):

"...ほとんどのネットワークカードはCPUに登録されているメモリでのみ機能するため、2つのノード間のGPUからGPUへの転送は次のようになります。GPU1からCPU 1、ネットワークカード1、ネットワークカード2、CPU 2からGPU 2.つまり、遅いネットワークカードを選択した場合、1台のコンピューターで高速化が行われない可能性があります。高速ネットワークカードでも、クラスターが大きい場合、GPUから比較しても高速化されませんGPUの動作が速すぎるため、ネットワークカードがCPUに対応できません。

これが、GoogleやMicrosoftのような多くの大企業がGPUクラスターではなくCPUを使用して大規模なニューラルネットワークをトレーニングしている理由です。」

そのため、この投稿によると、ある時点でCPUを使用した方が高速だった可能性があります。これはまだ事実ですか?

編集2:はい、そのブログ投稿は次の理由で非常に古くなっている可能性があります。

ノード内のGPUはPCIeバスを介して接続されているため、通信は約6GiB / sで発生する可能性があります。(例:https : //www.youtube.com/watch?v=el1iSlP1uOs、約35分)。スピーカーは、これがGPU1からCPU、GPU2に行くよりも速いことを暗示しています。ネットワークカードがボトルネックではなくなったことを意味します。


彼のブログ投稿でその人は良い点を持ち出します。私は彼の正当化のすべてを理解していませんでした。ただし、Google、Facebook、Twitter、および学界のすべての主要なディープラーニンググループが主にGPUでコードを実行しているという事実は、それが良いアイデアであることを示唆しています。バイアスが
かかって

回答:


28

他の回答の一部とは異なり、私はGPUで常にトレーニングを行うことに対して、何も考えずに強くアドバイスします。これは、データが非常に豊富で(たとえば、多くのピクセル=多くの変数)、モデルも同様に数百万のパラメーターを持っている画像やテキストでの深層学習法の使用によって促進されます。他のドメインの場合、これは当てはまらない可能性があります。

「小さい」とはどういう意味ですか?たとえば、100個の隠れユニットを持つ単一層MLPは「小さい」でしょうか?

はい、それは現代の基準では間違いなく非常に小さいです。トレーニングに最適なGPU(例:NVIDIA 1080またはNVIDIA Titan)がなければ、CPUが高速であることは驚くことではありません。

ニューラルネットワークの複雑さは、隠れ層のユニット数だけでなく、入力フィーチャの数にも依存することに注意してください。非表示レイヤーに100ユニットがあり、データセット内の各観測値に4つの入力フィーチャがある場合、ネットワークは小さくなります(最大400パラメーター)。一部の医療/バイオテクノロジーコンテキストのように、各観測に1Mの入力機能がある場合、ネットワークはパラメーター数の点でかなり大きいです。私の回答の残りの部分では、入力機能がかなり少ないと仮定しています。観察。

CPUとGPUのパフォーマンスを比較する良い例の1つは、強化学習を使用してポーカーボットをトレーニングしたときです。強化学習では、多くの場合、ニューラルネットワークにそれほど多くのレイヤーが必要ないため、パラメーターがほとんどない少数のレイヤーしか必要ないことがわかりました。さらに、入力フィーチャの数は非常に少なかった。最初はGPU(NVIDIA Titan)でトレーニングしましたが、強化学習には多くの反復が必要なため、時間がかかりました。幸いなことに、CPUでトレーニングを行うと、トレーニングが10倍速くなりました!これは、CPUの方がトレーニングに適している場合があるということです。

CPUでトレーニングするかGPUでトレーニングするかを決定するときに考慮する必要がある他の基準はありますか?

GPU上では、バッチサイズを増やすことでGPUメモリ全体を常に満たす必要がありますが、CPUではそうではないことに注意することが重要です。CPUでは、バッチサイズの増加により、時間prが増加します。バッチ。したがって、非常に大きなバッチサイズを使用することが重要な場合(たとえば、非常にノイズの多い信号のため)、GPUを使用することは有益です。私は実際にこれを経験していませんが、通常は小さなバッチサイズが好まれます。


ありがとう@pir!もっと読むことができる特定の参考文献はありますか?
-StatsSorceress

VGGなどのパラメーターの数を簡単に見つけて比較し、ネットワークが小さいことがわかります。
pir

3
それは大企業や研究機関が興味を持っているものではありませんので、私は小さなネットワーク上のCPU / GPUの比較をたくさん見ていない。
PIR

@StatsSorceress自分でテストしたい場合は、単純なKeras MLPをセットアップして、GPU対CPUのパフォーマンスをテストしてみませんか?また、更新された回答wrtを参照してください。ネットワークのサイズ。
pir

5

CPUはブランチの管理者であり、あらゆることを行うことができますが、タスクを委任する以外はあまり得意ではありません。ただし、GPUはマシンに隠れている専用の数学者です。数学の重いプロセスを実行している場合は、GPUを使用する必要があります。常に。

PythonやMATLABなどの機械学習に一般的なプログラミング言語を使用している場合、GPUで操作を実行することをコンピューターに伝えるのは1行のコードです。

また、マシンのすべてのコアを使用するようにしてください。これは、並列コンピューティングを利用することを意味します。特に、操作を独立して実行できるニューラルネットワークの場合、これにより速度が大幅に向上します。


4
GPUとの間でデータを転送するオーバーヘッドにより、並列処理による速度の向上が完全になくなる場合があることがわかりました。GPUに行くのは常に良い考えではありません。
エイドリアンキースター

1
モデルの複雑さに依存します。単純なK-NNをトレーニングしている場合、おそらくそれは価値がありません。ただし、逆行列または多くの結果的な行列演算を必要とするニューラルネットワークを必要とするモデルをトレーニングしている場合は、GPUを選択することをお勧めします。
JahKnows

1
@AdrianKeister同意します。私が答えようとしていたこと。OPが言及しているネットワークでは、これがボトルネックになる可能性があります。
pir

1
私のマシンを使用するGPUでは、100の非表示ユニットが高速です。CPUを高速化するには、非常に少数の隠しユニットが必要です。さらに、私は常にトレーニングをバッチで行う傾向があります。この場合、データが十分に密集していることを考えると、CPUがボトルネックになるとは思えません。
JahKnows

3

最初に、同様の質問からの引用を参照します。

行列演算に関しては、2度考える必要はありません。常にGPUを選択します。ソース

GPUの並列アーキテクチャは、ベクトル演算と行列演算に適しています。 ソース

したがって、これらの質問に目を通すと、ケースに関係なくGPUを使用することを推奨していることがわかります。それは常にいくらかの改善を提供します。

「小さな」ネットワークをCPUでトレーニングする必要があることを読んだことがある理由は、小さなネットワークだけにGPUトレーニングを実装すると、単にCPUでトレーニングするよりも時間がかかるからです-これは、GPUが遅くなるという意味ではありません。

100-隠されたユニットのネットワークがある種類の小さなの、iは小規模ネットワークの相対的なそれを呼びたい、大きな深いネットワークそこに。リカレントアーキテクチャ(ほとんど)は、フィードフォワードネットワークよりもシナプスが多いため、100隠れユニットRNNは100隠れユニットFFNよりも「大きく」なります。


100ユニットの単一の非表示レイヤーを持つMLPがあり、重み共有のために100の非表示ユニットを持つ標準RNNと同じ数のパラメーターを持つMLPがある場合、本当ではありませんか?より多くの「シナプス」-より多くの「アクティベーション」がありますが、同じ数のパラメーターですよね
-StatsSorceress

「重み」共有という用語に慣れていません。これは、アクティベーションの同じ量が、より多くのパラメータので、より多くの接続が...持っている
トーマス・W

重み共有とは、RNNの1つの隠れ層から次の隠れ層までの重み行列が同じであることを意味します。それは同じ「U」行列で、時間をかけて複製されます。また、入力から非表示レイヤーへの重みは、時間全体にわたって同じです。
-StatsSorceress

@StatsSorceress私は行列の操作に慣れていません。はい、隠されたレイヤーから次のレイヤーまでのウェイトマトリックスは同じです。ただし、合計でより多くの接続があります(レイヤーがPREVIOUSレイヤーにも接続できるため)。..私は、私が説明できるかどうかはわかりませんが、より多くの接続層があるとしてRNNはいつもより多くのパラメータを持つことになります
トーマス・W

はい、物理的にもっと多くのパラメーターがあることを理解していますが、それらのパラメーターの多くは同じ値を取ります。つまり、同じ数の入力次元と同じ数の隠された次元を持つMLPとRNNのパラメーターの有効数は同じ。
-StatsSorceress
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.