DNN eğitiminin CPU ve GPU bellek gereksinimlerini tahmin etme


10

Diyelim ki derinlemesine bir öğrenme model mimarisi ve seçilen bir mini-parti boyutu var. Bu modeli eğitmek için beklenen bellek gereksinimlerini nasıl elde edebilirim?

Örnek olarak, boyut 1000 girişi, 100 boyut 4 tam bağlantılı gizli katmanı ve boyut 10 ek çıkış katmanı olan (tekrarlayan olmayan) bir modeli düşünün. Mini seri boyutu 256 örnektir. CPU ve GPU'daki eğitim sürecinin yaklaşık bellek (RAM) kapladığı alanı nasıl belirler? Herhangi bir fark yaratırsa, modelin TensorFlow ile bir GPU'da eğitildiğini varsayalım (böylece cuDNN kullanarak).

Yanıtlar:


3

@İk_vision'un cevabı, ağırlıkların depolanması için gereken bellek alanının nasıl hesaplanacağını açıklar, ancak ara aktivasyonları da saklamanız gerekir ve özellikle 3D verilerle çalışan evrişimsel ağlar için bu, gerekli belleğin ana kısmıdır.

Örneğinizi analiz etmek için:

  1. Girdi 1000 öğeye ihtiyaç duyuyor
  2. 1-4 katmanlarından sonra toplamda 400 elemanınız var.
    1. Son kattan sonra 10 elementiniz var

1 numune için toplamda ileri geçiş için 1410 elemana ihtiyacınız vardır. Giriş dışında, geriye doğru geçiş için her biri hakkında degrade bilgi, yani 410 daha fazla, örnek başına toplam 1820 eleman gerekir . 465 920'yi elde etmek için parti boyutuyla çarpın.

"Elementler" dedim, çünkü element başına gerekli boyut kullanılan veri tipine bağlıdır. Tek hassasiyet float32için 4B'dir ve veri bloblarını depolamak için gereken toplam bellek yaklaşık 1.8 MB olacaktır.


1

İki seçenek görüyorum:

  1. Ağ diskten yüklenir
  2. Ağ anında oluşturulur

Her iki durumda da, ağın çoğu her örnek için kopyalandığından GPU'daki bellek boyutunun Toplu boyutuyla çarpılması gerekir.

Diskten yüklendiyse Başparmak Kuralı: DNN Diskte X MB alırsa, toplu iş boyutu 1 için GPU belleğinde ağ 2X olacaktır.

Ağ, toplu iş boyutu 1 için anında oluşturulur: parametreyi sayın ve 4 baytla (float32 bit) çarpın: Parametre Sayısını Manuel Olarak Sayma: fc1: 1000x100 (ağırlık) + 100 (önyargı) fc2: 100x100 (ağırlık) + 100 (önyargı) fc3: 100x100 (ağırlıklar) + 100 (önyargı) fc4: 100x100 (ağırlıklar) + 100 (önyargı) çıktı: 100x10 (ağırlıklar) + 10 (önyargı)

Keras kullanarak Parametre sayısını sayma: model.count_params ()


3
Anlayabildiğim kadarıyla, bu , ağırlıkların kendilerinin depolanması için bellek gereksinimlerini verir , ancak degradeler gibi eğitim için kesinlikle gerekli olan her şeyi depolamaya adanmış herhangi bir belleği yok sayar . Momentumun uygulanması için degradelerin saklanması gereklidir. kayıp mıyım
Whaa

1
@Bu doğru, normal eğitim için ağırlıkları, ileri geçişteki aktivasyonları ve geri yayılma geçişindeki gradyanları (momentum olmadan bile hafızanın 3 katı) saklamak için belleğe ihtiyacınız var.
mjul

Deneylerim 4.5x ik_vision'un tahminini gösteriyor. 3x'in arkasındaki mantığı anlıyorum ama pratikte neden 4.5x kullandığından emin değilim. Başka Keras / TF yükü olmalı ??
Wes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.