CNNメモリ消費


9

提案されたモデルが、指定された量のメモリを備えたGPUでトレーニングされるのに十分小さいかどうかを推定できるようにしたい

このような単純なCNNアーキテクチャがある場合:

  • Input:50x50x3
  • C1:32個の3x3カーネル、パディング付き(実際には、入力深度を考えると、実際には3x3x3でしょうか?)
  • P1:2x2、ストライド2
  • C2:64 x 3x3カーネル、パディングあり
  • P2:2x2、ストライド2
  • FC:500ニューロン
  • Output:softmax 10クラス
  • 64のミニバッチサイズ

32ビットの浮動小数点値を想定して、トレーニング中にネットワークの各レイヤーのメモリコストをどのように計算しますか?そして、そのようなモデルをトレーニングするために必要な総メモリは?

回答:


6

私はによって仮定しますC1C2など、あなたが、とによる畳み込み層を意味しP1P2あなたの平均プーリング層、およびFC完全に接続手段レイヤーを。

次のように、フォワードパスに必要なメモリを計算できます。

1つの画像

float32値を使用している場合は、上記の@Alexandru Burlacuによって提供されているリンクをたどります。

Input:50x50x3 = 7,500 = 7.5K

C1:50x50x32 = 80,000 = 80K

P1:25x25x32 = 20,000 = 20K

C2:25x25x64 = 40,000 = 40K

P2:12x12x64 = 9,216 = 9.2K <-これは問題です(そして、私の概算は、ここでは非常に波打った推測です)。50、25、「12.5」で作業する代わりに、32の倍数で作業する方が理にかなっています。32の倍数で作業することも、メモリの観点から効率的であると聞きました。これが悪い考えである理由は、2x2プーリングではスペースを適切に分割できないためです。私が間違っている場合は、遠慮なく訂正してください。

FC:1x500 = 500 = 0.5K

Output:1 x 10 = 10 = 0.01K(隣に何もない)

合計メモリ:7.5K + 80K + 20K + 40K + 0.5K = 157.2K * 4バイト= 628.8 KB

これは1つの画像です。

ミニバッチ

64のミニバッチサイズで作業している場合、これらの64を一度にメモリに読み込み、すべての操作を同時に実行して、次のようにすべてをスケールアップします。

Input:64x50x50x3 = 480,000 = 480K = 0.48M

C1:64x50x50x32 = 5,120,000 = 5.12M

P1:64x25x25x32 = 1,280,000 = 1.28M

C2:64x25x25x64 = 2,560,000 = 2.56M

P2:64x12x12x64 = 589,824 = 590K = 0.59M

FC:64x500 = 32,000 = 32K = 0.032M

Output:1x10x64 = 640 = 0.64K = 0.00064M(気にしない、これは小さい)

総メモリ:10M x 4バイト〜40MB(ウェブサイトにも概算値が記載されているため、概算と言っています)

編集:申し訳ありませんが、ウェブサイトを誤って読みました。

ウェブサイトによると、以下を保存する必要があるため、逆方向パスにはこれの約3倍が必要です。

  • 各ニューロンの活性化と関連する勾配-これらは同じサイズです。

  • パラメータと同じサイズの重み(パラメータ)の勾配。

  • 運動量の値(使用している場合)。

  • ある種の雑多な記憶(この部分は理解できません)


重み/パラメータに必要なメモリも考慮する必要がありますか?たとえば、上のレイヤーC1の場合50x50x32、それはレイヤーアクティベーションマップの値になり32x3x3ますが、カーネル自体の学習値()はどうでしょうか。
Simon

はい、cs.stanford.edu /〜quocle / tutorial2.pdfによると、そうです。SGDを使用するbackpropアルゴリズムは、重みの以前の値を必要とします。ただし、最大プーリング(最大プーリングを行っていますか?)を使用すると、接続ごとに勾配を追跡する必要はありません。最大値の由来を追跡し、そのブランチの勾配のみを計算する必要があります。
StatsSorceress

@StatsSorceress、この回答に感謝しますが、私の心に1つの質問が表示されました。たたみ込みレイヤーのサイズが3x3ではなく11x11の場合はどうなりますか?そして、ReLUの後にたたみ込み層が続くとどうなりますか?
saeed masoomi

2

多分このリンクは、任意のニューラルネットワークのメモリ使用量を計算する方法の説明を提供します。リンクの下にあるのは、VGGNetモデルのメモリ使用量の説明です。クリックしてここにビットをスクロールダウン))


1

convNetのトレーニング中に必要な合計メモリは次のとおりです。

  • パラメータのメモリ
  • 中間層の出力用のメモリ
  • 各パラメーターの勾配のメモリー
  • Momentum、RMSprop、Adamsなどのオプティマイザを使用している場合は、追加のメモリが必要です
  • 実装用のその他のメモリ

おおまかな概算は、パラメーターの数x 3 x 4(32ビット浮動小数点を使用している場合)バイトです。

さて、これがパラメーターの数を計算する方法です:

  • 変換レイヤー:(カーネル幅xカーネル高さ)xチャネル数x深さ+深さ(バイアスがある場合のみ深さを追加)
  • FCレイヤー:入力の数*出力の数+出力(出力はバイアスの数を含めるために追加されます)
  • 最大プールレイヤー:パラメーターなし

次に、すべてのパラメーターの数を合計し、前述の式を使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.