Konsumsi memori CNN


10

Saya ingin dapat memperkirakan apakah model yang diusulkan cukup kecil untuk dilatih pada GPU dengan jumlah memori tertentu

Jika saya memiliki arsitektur CNN sederhana seperti ini:

  • Input: 50x50x3
  • C1: 32 3x3 kernel, dengan padding (saya kira pada kenyataannya theyre sebenarnya 3x3x3 diberikan kedalaman input?)
  • P1: 2x2 dengan langkah 2
  • C2: 64 3x3 kernel, dengan bantalan
  • P2: 2x2 dengan langkah 2
  • FC: 500 neuron
  • Output: softmax 10 kelas
  • Ukuran batch mini 64

Dengan asumsi nilai floating point 32bit, bagaimana Anda menghitung biaya memori setiap lapisan jaringan selama pelatihan? dan kemudian total memori yang dibutuhkan untuk melatih model seperti itu?

Jawaban:


7

Saya akan berasumsi dengan C1,, C2dll, maksud Anda lapisan konvolusional, dan P1, P2maksud Anda lapisan gabungan, dan FCberarti lapisan yang terhubung sepenuhnya.

Kami dapat menghitung memori yang diperlukan untuk umpan maju seperti ini:

Satu gambar

Jika Anda bekerja dengan nilai float32, kemudian ikuti tautan yang disediakan di atas oleh @Alexandru Burlacu yang Anda miliki:

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 <- Ini adalah masalah (dan perkiraan saya adalah perkiraan yang sangat bergelombang di sini). Daripada bekerja dengan 50, 25, '12 .5 ', akan lebih masuk akal untuk bekerja dengan kelipatan 32. Saya pernah mendengar bekerja dengan kelipatan 32 juga lebih efisien dari sudut pandang memori. Alasan ini adalah ide yang buruk adalah 2x2 pooling tidak membagi ruang dengan benar, sejauh yang saya tahu. Jangan ragu untuk mengoreksi saya jika saya salah.

FC: 1x500 = 500 = 0,5K

Output: 1 x 10 = 10 = 0,01 K (hampir tidak ada)

Total memori: 7.5K + 80K + 20K + 40K + 0.5K = 157.2K * 4 byte = 628.8 KB

Itu untuk satu gambar.

Minibatch

Jika Anda bekerja dengan ukuran minibatch 64, maka Anda membaca 64 ini sekaligus ke dalam memori dan melakukan operasi secara bersamaan, meningkatkan semuanya seperti ini:

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 (kami tidak peduli, ini kecil)

Total memori: 10M x 4 byte ~ 40MB (saya katakan perkiraan karena situs web juga mengatakan nilai perkiraan)

EDIT: Saya salah membaca situs webnya, maaf.

Menurut situs web, backward pass membutuhkan sekitar tiga kali lipat ini, karena kebutuhan untuk menyimpan:

  • aktivasi dan gradien terkait untuk setiap neuron - ini memiliki ukuran yang sama;

  • gradien bobot (parameter) yang ukurannya sama dengan parameter;

  • nilai momentum, jika Anda menggunakannya;

  • semacam memori lain-lain (saya tidak mengerti bagian ini)


Apakah kita juga perlu mempertimbangkan memori yang diperlukan untuk bobot / parameter? Sebagai contoh, untuk layer C1Anda di atas Anda memiliki 50x50x32tetapi itu hanya akan menjadi nilai-nilai untuk peta aktivasi lapisan, bagaimana dengan nilai-nilai yang dipelajari ( 32x3x3) dalam kernel itu sendiri?
Simon

Ya, benar, menurut cs.stanford.edu/~quocle/tutorial2.pdf . Algoritma backprop menggunakan SGD membutuhkan nilai bobot sebelumnya. Tetapi dengan max pooling (apakah Anda melakukan max pooling?), Anda tidak perlu melacak gradien sehubungan dengan setiap koneksi. Anda perlu melacak dari mana koneksi nilai maks berasal, dan hanya menghitung gradien untuk cabang itu.
StatsSorceress

@StSorceressess, terima kasih atas jawaban ini tetapi satu pertanyaan muncul di benak saya, apa yang terjadi jika ukuran lapisan konvolusi adalah 11x11, bukan 3x3? dan apa yang terjadi jika ReLU diikuti oleh lapisan konvolusional?
saeed masoomi

2

Mungkin tautan ini akan memberi Anda penjelasan tentang cara menghitung penggunaan memori jaringan saraf arbitrer. Di bawah tautan dijelaskan penggunaan memori model VGGNet. Klik di sini dan gulirkan sedikit ke bawah))


1

Saat melatih convNet, total memori yang dibutuhkan meliputi:

  • Memori untuk parameter
  • Memori untuk output lapisan menengah
  • Memori untuk gradien setiap parameter
  • Memori tambahan diperlukan jika Anda menggunakan pengoptimal seperti Momentum, RMSprop, Adams dll
  • Memori lain-lain untuk implementasi

Perkiraan kasar yang baik adalah jumlah parameter x 3 x 4 (jika Anda menggunakan float 32-bit) byte

Nah, sekarang ini bagaimana Anda menghitung jumlah parameter:

  • Lapisan konv: (lebar kernel x tinggi kernel) x jumlah saluran x kedalaman + kedalaman (tambahkan kedalaman hanya jika ada bias)
  • Lapisan FC: numb input * numb output + output (output ditambahkan untuk memasukkan jumlah bias)
  • Max pool layer: tidak ada parameter

Sekarang jumlahkan semua parameter dan gunakan rumus yang saya sebutkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.