@StatsSorceress TL; DR:
Saya akan melalui kegiatan ini untuk melihat apakah saya dapat menghitung sendiri memori yang dibutuhkan:
Aktivasi: 532.752 * 2 * 4 / (1024 ^ 2) = 4,06 MB
Parameter: 19.072.984 * 4 / (1024 ^ 2) * 3 = 218,27 MB
Lain-lain: 128 * 9.000 * 4 / (1024 ^ 2) = 4,39 MB
Total Memori: (4.06 * 128 ) + 218.27 + 4.39 = 742.34 MB
( Seseorang tolong perbaiki saya jika ini salah. FYI, Anda sudah mengalikannya dengan 128, jadi itu sebabnya saya tidak melipatgandakannya dengan 128 di atas )
Saya akan mengarahkan Anda ke artikel ini dan video terkait . Mereka membantu saya memahami apa yang sedang terjadi jauh lebih baik.
CATATAN: Memori yang diperlukan untuk menggunakan jaringan untuk prediksi jauh lebih sedikit daripada yang dibutuhkan untuk pelatihan karena dua alasan:
- Saat memprediksi, kami hanya mengirim gambar ke depan melalui jaringan dan tidak mundur (jadi kami tidak memperbanyak memori X 3; lihat di bawah)
- Ada satu prediksi per gambar (jadi kami tidak perlu mengalikan memori yang diperlukan untuk satu gambar dengan ukuran batch karena kami tidak menggunakan batch dalam prediksi).
Proses (Memori untuk Melatih)
- Hitung memori yang diperlukan untuk berlatih pada satu gambar
- Lipat gandakan angka ini dengan jumlah gambar dalam kumpulan Anda
( INGAT: Mini-batching mengatakan kami mengambil subset dari data kami, menghitung gradien dan kesalahan untuk setiap gambar di subset, kemudian rata-rata ini dan melangkah maju ke arah rata-rata. Untuk convnets, bobot dan bias dibagi, tetapi jumlah aktivasi dirusak oleh jumlah gambar dalam kumpulan. ).
LANGKAH 1: Memori untuk 1 Gambar
Untuk melatih satu gambar, Anda harus menyimpan memori untuk:
Parameter model:
The bobot dan bias pada setiap lapisan, mereka gradien , dan mereka variabel momentum (jika Adam, Adagrad, RMSProp, dll, pengoptimalan digunakan)
Untuk memperkirakan memori untuk ini, hitung memori yang diperlukan untuk menyimpan bobot dan bias dan kalikan dengan 3 (yaitu "dengan 3" karena kami mengatakan jumlah memori yang dibutuhkan untuk menyimpan bobot dan bias adalah (kira-kira) sama dengan yang diperlukan untuk gradien dan untuk variabel momentum)
PERSAMAAN:
Konvolusi:
bobot (n) = kedalaman (n) * (kernel_width * kernel_height) * kedalaman (n-1)
bias (n) = kedalaman (n)
Lapisan Penuh (Terhubung):
bobot (n) = keluaran (n) * input (n)
bias (n) = keluaran (n)
di mana n adalah lapisan saat ini dan n-1 adalah lapisan sebelumnya, dan output adalah jumlah output dari lapisan FC dan input adalah jumlah input ke lapisan FC (jika lapisan sebelumnya bukan lapisan yang terhubung sepenuhnya, jumlah input sama dengan ukuran layer yang diratakan).
CATATAN: Memori untuk bobot dan bias saja, ditambah memori untuk aktivasi untuk satu gambar (lihat di bawah), adalah jumlah total memori yang Anda butuhkan untuk prediksi (tidak termasuk beberapa overhead untuk memori untuk konvolusi dan beberapa hal lainnya).
- Aktivasi (ini adalah "Gumpalan" di Caffe):
(Saya menggunakan istilah longgar di sini, bersabarlah)
Setiap konvolusi dalam lapisan konvolusi menghasilkan aktivasi " jumlah piksel dalam gambar " (yaitu, Anda melewatkan gambar melalui konvolusi tunggal, Anda mendapatkan peta fitur tunggal yang terdiri dari aktivasi " m ", di mana " m " adalah jumlah piksel dari Anda gambar / input).
Untuk lapisan yang terhubung sepenuhnya, jumlah aktivasi yang Anda hasilkan sama dengan ukuran output Anda.
Konvolusi:
aktivasi (n) = image_width * image_height * image_num_channels
Lapisan Penuh (Terhubung):
aktivasi (n) = keluaran (n)
Perhatikan bahwa input Anda benar-benar hanya gambar di awal jaringan. Setelah berbelit-belit, itu berubah menjadi sesuatu yang lain (peta fitur). Jadi, ganti "image_width", "image_height", dan "image_num_channels" dengan "input_width", "input_height", dan "layer_depth" dengan lebih tepat. (Hanya lebih mudah bagi saya untuk memikirkan konsep ini dalam hal gambar.)
Karena kita juga perlu menyimpan kesalahan untuk aktivasi di setiap lapisan (digunakan pada backward pass), kita mengalikan jumlah aktivasi dengan 2 untuk mendapatkan jumlah entitas yang kita perlukan untuk memberikan ruang di ruang penyimpanan kita. Jumlah aktivasi meningkat dengan jumlah gambar dalam kumpulan, sehingga Anda mengalikan jumlah ini dengan ukuran kumpulan.
LANGKAH 2: Memori untuk Melatih Kelompok
Jumlahkan bobot dan bias (kali 3) dan jumlah aktivasi (kali 2 kali ukuran batch). Kalikan ini dengan 4, dan Anda mendapatkan jumlah byte yang dibutuhkan untuk melatih bets. Anda dapat membagi dengan 1024 ^ 2 untuk mendapatkan jawaban dalam GB.