Prognozowanie wymagań procesora i pamięci GPU podczas szkolenia DNN

10

Powiedzmy, że mam trochę architektury modelowania dogłębnego uczenia się, a także wybrany rozmiar mini-partii. Jak czerpać z tych oczekiwanych wymagań dotyczących pamięci na potrzeby szkolenia tego modelu?

Jako przykład weźmy pod uwagę (jednorazowy) model z wejściem o wymiarze 1000, 4 w pełni połączone ukryte warstwy o wymiarze 100 oraz dodatkową warstwę wyjściową o wymiarze 10. Rozmiar mini-partii wynosi 256 przykładów. Jak określa się przybliżony ślad pamięci (RAM) procesu uczenia się na procesorze i na GPU? Jeśli robi to jakąkolwiek różnicę, załóżmy, że model jest trenowany na GPU z TensorFlow (wykorzystując w ten sposób cuDNN).


źródło

Odpowiedzi:

3

Odpowiedź @ik_vision opisuje, jak oszacować przestrzeń pamięci potrzebną do przechowywania odważników, ale musisz także przechowywać pośrednie aktywacje, a zwłaszcza w przypadku sieci splotowych pracujących z danymi 3D, jest to główna część potrzebnej pamięci.

Aby przeanalizować swój przykład:

  1. Dane wejściowe wymagają 1000 elementów
  2. Po warstwach 1-4 warstwa masz 100 elementów, w sumie 400
    1. Po ostatniej warstwie masz 10 elementów

W sumie na 1 próbkę potrzebujesz 1410 elementów do przejścia do przodu. Oprócz danych wejściowych potrzebujesz również informacji o gradiencie dla każdego z nich do przejścia wstecz, czyli o 410 więcej, w sumie 1820 elementów na próbkę . Pomnóż przez rozmiar partii, aby uzyskać 465 920.

Powiedziałem „elementy”, ponieważ wymagany rozmiar na element zależy od zastosowanego typu danych. Dla pojedynczej precyzji float32jest to 4B, a całkowita pamięć potrzebna do przechowywania obiektów blob danych wyniesie około 1,8 MB.

Jan Kukacka
źródło
1

Widzę dwie opcje:

  1. Sieć jest ładowana z dysku
  2. Sieć tworzona jest na bieżąco

W obu przypadkach rozmiar pamięci w GPU należy pomnożyć przez rozmiar partii, ponieważ większość sieci jest kopiowana dla każdej próbki.

Zasada kciuka, jeśli zostanie załadowana z dysku: jeśli DNN zajmie X MB na dysku, sieć będzie 2X w pamięci GPU dla wielkości partii 1.

Sieć jest tworzona w locie dla wielkości partii 1: policz parametr i pomnóż przez 4 bajty (float32 bit): ręcznie licząc liczbę parametrów: fc1: 1000x100 (wagi) + 100 (odchylenia) fc2: 100x100 (wagi) + 100 (stronniczości) fc3: 100x100 (ciężarki) + 100 (stronniczości) fc4: 100x100 (ciężarki) + 100 (stronniczości) wyjście: 100x10 (ciężary) + 10 (stronniczości)

Zliczanie liczby parametrów za pomocą Keras: model.count_params ()

ik_vision
źródło
3
O ile mi wiadomo, daje to wymagania dotyczące pamięci do przechowywania samych ciężarów , ale ignoruje każdą pamięć przeznaczoną do przechowywania wszystkiego, co jest ściśle wymagane do treningu , na przykład gradientów. Przechowywanie gradientów jest wymagane, powiedzmy do wdrożenia pędu. czy ja tęsknię
Whaa,
1
@ Whaa jest to poprawne, do normalnego treningu potrzebujesz pamięci do przechowywania ciężarów, aktywacji w przebiegu do przodu i gradientów w przebiegu do propagacji wstecznej (3x pamięć nawet bez pędu).
mjul,
@mjul moje eksperymenty pokazują szacunki 4,5x ik_vision. Rozumiem uzasadnienie 3x, ale nie jestem pewien, dlaczego w praktyce używa 4,5x. Musi istnieć inny narzut Keras / TF?
Wes