Dlaczego szkolenie na moim GPU trwa tak długo?

10

Detale:

GPU : GTX 1080

Szkolenie : ~ 1,1 miliona zdjęć należących do 10 klas

Walidacja : ~ 150 tysięcy zdjęć należących do 10 klas

Czas na epokę : ~ 10 godzin

Skonfigurowałem CUDA, cuDNN i Tensorflow (również GPU Tensorflow).

Nie sądzę, że mój model jest tak skomplikowany, że zajmuje 10 godzin na epokę. Nawet sprawdziłem, czy mój procesor graficzny jest problemem, ale tak nie było.

Czy czas szkolenia wynika z w pełni połączonych warstw?

Mój model:

model = Sequential()
model.add()
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dense(4096))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))

model.summary()

opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)

model.compile(loss='categorical_crossentropy',
          optimizer=opt,
          metrics=['accuracy']
          )

Ponieważ jest dużo danych, użyłem ImageDataGenerator.

gen = ImageDataGenerator(
 horizontal_flip=True
)

train_gen = gen.flow_from_directory(
        'train/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)

valid_gen = gen.flow_from_directory(
        'validation/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)
Pradyumna Rahul
źródło
2
Głosowałem za przeniesieniem tego do przepełnienia stosu, ale tak naprawdę należy on do wymiany stosu danych naukowych, IMO
generic_user
generic_user: „nauka danych” może wykorzystywać „uczenie maszynowe”, ale nie wszystkie „uczenie maszynowe” dotyczy „nauki danych”. (ML to kolejne narzędzie, tensorflow to kolejna biblioteka; ML może wkrótce (jeśli nie już) być wykorzystywany nawet do prozaicznych zadań, takich jak zarządzanie plikami właściwości preferencji użytkownika.)
Michael
zobacz także powiązane (tl; dr: sprawdź, czy faktycznie działa na gpu, spójrz na statystyki gpu, które tf może zapewnić) stackoverflow.com/questions/42527492/... stackoverflow.com/questions/38559755/…
michael
Wypróbowałem to podejście i stwierdzono, że używany jest mój obecny procesor graficzny. Aby to potwierdzić, użyłem również nvidia-smi do sprawdzenia wykorzystania GPU i waha się ona między 85% -99%.
Pradyumna Rahul

Odpowiedzi:

7

To mniej więcej oczekiwane. Jeśli podzielisz liczbę sekund przez liczbę przetworzonych obrazów, otrzymasz 33 milisekundy na obraz, co wydaje się być odpowiednie dla tak małej sieci. Większe sieci zwykle pobierają od 50 do 200 milisekund na obraz.

Tak, duża gęsta warstwa może negatywnie wpłynąć na wydajność, ponieważ jest to ogromna matryca (256 na 4096) i duże mnożenie macierzy, z którą można się pogodzić przy każdym uruchomieniu sieci.

shimao
źródło
Co sugerujesz, aby poprawić wydajność?
4
1: zwiększ rozmiar partii do 32 lub 64. 2: zmniejsz rozmiar warstwy FC do może 1024 lub 2048 jednostek i sprawdź, czy to pomoże. 3: Wczesne zatrzymanie. Możliwe, że twoja sieć się zbiegła lub zaczęła się przeładowywać przed zakończeniem pierwszej epoki, w takim przypadku powinieneś mniej trenować.
Czy powinienem zmniejszyć liczbę kroków w każdej epoce?
Pradyumna Rahul
@shimao co miałeś na myśli przez „trenuj mniej”? Masz na myśli mniej danych?
StatsSressress 02
3

Jak powiedział shimao, właśnie tego można się spodziewać. Pomimo braku wielu warstw, rozmiar wejściowy 512 x 512 jest dużym obrazem do przemyślenia. Duży czas obliczeń jest prawdopodobnie dłuższy z powodu splotu 64 filtrów na dużym obrazie, zamiast w pełni połączonych warstw.

Sieć, którą zbudowałeś, ma jednak zabawne wąskie gardło informacyjne. Zaczynasz od 64 filtrów na oryginalnym obrazie, zmniejszając się tylko wraz ze zmniejszaniem się rozmiaru obrazu. Gdy obraz przechodzi przez sieć, funkcje, których się uczysz, stają się coraz bardziej abstrakcyjne i złożone. Warstwa Conv2D (32, (3, 3)) zasadniczo ogranicza sieć do uczenia się mapy 32 obiektów o wymiarach 128 x 128.

Większość architektur sieciowych podwaja liczbę funkcji za każdym razem, gdy je łączą, a najnowsze architektury imagenet faktycznie porzucają w pełni połączone warstwy na korzyść średniej puli nad ostateczną mapą obiektów i zasadniczo wykonują regresję logistyczną na wyjściu tej puli.

Spróbuj zacząć od mniejszej liczby filtrów, powiedz 16 w pierwszej warstwie splotu, podwajając za każdym razem, gdy kroczysz lub zbierasz. Zrób to jeszcze kilka razy, aby zwiększyć pole odbioru i zmniejszyć rozmiar mapy obiektów. Zrób to w dół do 64x64 lub 32x32, czyli 128 lub 256 filtrów. Możesz użyć globalnej puli średniej i maksymalnej Keras, aby wyeliminować również w pełni połączone warstwy. To powinno podwoić prędkość sieci, a jednocześnie oczekiwałbym wzrostu dokładności.

mpotma
źródło
Architektura sieci oparta jest na pracy badawczej, którą próbowałem odtworzyć. lirmm.fr/%7Echaumont/publications/…
Pradyumna Rahul