Memprediksi persyaratan memori CPU dan GPU untuk pelatihan DNN

10

Katakanlah saya memiliki beberapa arsitektur model pembelajaran yang mendalam, serta ukuran mini-batch yang dipilih. Bagaimana saya mendapatkan dari persyaratan memori yang diharapkan untuk melatih model itu?

Sebagai contoh, pertimbangkan model (tidak berulang) dengan input dimensi 1000, 4 lapisan tersembunyi yang sepenuhnya terhubung dari dimensi 100, dan lapisan keluaran tambahan dimensi 10. Ukuran mini-batch adalah 256 contoh. Bagaimana cara menentukan jejak memori (RAM) perkiraan dari proses pelatihan pada CPU dan pada GPU? Jika ada bedanya, anggap saja model tersebut dilatih pada GPU dengan TensorFlow (dengan demikian menggunakan cuDNN).

Whaa
sumber

Jawaban:

3

Jawaban @ik_vision menjelaskan cara memperkirakan ruang memori yang diperlukan untuk menyimpan bobot, tetapi Anda juga perlu menyimpan aktivasi perantara, dan terutama untuk jaringan konvolusional yang bekerja dengan data 3D, ini adalah bagian utama dari memori yang dibutuhkan.

Untuk menganalisis contoh Anda:

  1. Input membutuhkan 1000 elemen
  2. Setelah lapisan 1-4 lapisan Anda memiliki 100 elemen, total 400
    1. Setelah lapisan akhir Anda memiliki 10 elemen

Total untuk 1 sampel, Anda membutuhkan 1410 elemen untuk umpan maju. Selain input, Anda juga memerlukan informasi gradien tentang masing-masing untuk backward pass, yaitu 410 lebih, dengan total 1.820 elemen per sampel . Kalikan dengan ukuran batch untuk mendapatkan 465 920.

Saya mengatakan "elemen", karena ukuran yang diperlukan per elemen tergantung pada tipe data yang digunakan. Untuk presisi tunggal, float32ukurannya 4B dan total memori yang diperlukan untuk menyimpan gumpalan data sekitar 1,8 MB.

Jan Kukacka
sumber
1

Saya melihat dua opsi:

  1. Jaringan diambil dari disk
  2. Jaringan dibuat dengan cepat

Dalam kedua kasus ukuran memori dalam GPU perlu dikalikan dengan ukuran Batch karena sebagian besar jaringan disalin untuk setiap sampel.

Aturan Jempol jika diambil dari Disk: Jika DNN mengambil X MB pada Disk, jaringan akan 2X dalam memori GPU untuk ukuran batch 1.

Jaringan dibuat dengan cepat untuk ukuran batch 1: hitung parameter dan kalikan dengan 4 byte (float32 bit): Menghitung jumlah Parameter Secara Manual: fc1: 1000x100 (bobot) + 100 (bias) fc2: 100x100 (bobot) + 100 (bias) fc3: 100x100 (bobot) + 100 (bias) fc4: 100x100 (bobot) + 100 (bias) output: 100x10 (bobot) + 10 (bias)

Menghitung jumlah Parameter menggunakan Keras: model.count_params ()

ik_vision
sumber
3
Sejauh yang saya tahu, ini memberikan persyaratan memori untuk menyimpan bobot sendiri , tetapi mengabaikan memori yang didedikasikan untuk menyimpan apa pun yang diperlukan secara ketat untuk pelatihan , seperti gradien. Menyimpan gradien diperlukan, katakanlah untuk menerapkan momentum. apakah saya hilang?
Whaa
1
@ Oh, ini benar, untuk latihan normal Anda memerlukan memori untuk menyimpan bobot, aktivasi dalam lintasan maju dan gradien pada lintasan propagasi belakang (3x memori bahkan tanpa momentum).
mjul
@mjul percobaan saya menunjukkan perkiraan 4,5x ik_vision. Saya mengerti alasan di balik 3x tapi saya tidak yakin mengapa dalam praktiknya menggunakan 4,5x. Harus ada overhead Keras / TF lainnya ??
Wes