Pracuję w środowisku, w którym zasoby obliczeniowe są współużytkowane, tj. Mamy kilka maszyn serwerowych wyposażonych w kilka procesorów graficznych Nvidia Titan X.
W przypadku modeli o małych i średnich rozmiarach 12 GB Titan X zwykle wystarcza, aby 2-3 osoby mogły jednocześnie trenować na tym samym GPU. Jeśli modele są na tyle małe, że jeden model nie wykorzystuje w pełni wszystkich jednostek obliczeniowych GPU, może to faktycznie spowodować przyspieszenie w porównaniu z uruchomieniem jednego procesu szkoleniowego po drugim. Nawet w przypadkach, gdy równoczesny dostęp do GPU spowalnia indywidualny czas szkolenia, nadal miło jest mieć możliwość jednoczesnego trenowania wielu użytkowników na GPU.
Problem z TensorFlow polega na tym, że domyślnie przy uruchamianiu przydziela pełną ilość dostępnej pamięci GPU. Nawet w przypadku małej dwuwarstwowej sieci neuronowej widzę, że wszystkie 12 GB pamięci GPU jest zużyte.
Czy istnieje sposób, aby TensorFlow przydzielał tylko powiedzmy 4 GB pamięci GPU, jeśli wiadomo, że to wystarczy dla danego modelu?
źródło
MonitoredTrainingSession
https://github.com/tensorflow/tensorflow/issues/1578
źródło
from keras import backend as K
iK.set_session(sess)
ograniczeń pamięciowych uniknąćOto fragment Księgi
Deep Learning with TensorFlow
1) Pozwól na wzrost: (bardziej elastyczny)
Druga metoda to
per_process_gpu_memory_fraction
opcja, która określa ułamek ogólnej ilości pamięci, którąeach
powinien przydzielić widoczny GPU. Uwaga: zwolnienie pamięci nie jest konieczne, może nawet pogorszyć fragmentację pamięci po zakończeniu.2) Przydziel stałą pamięć :
Aby przydzielić
40%
całkowitą pamięć każdego GPU tylko:Uwaga: Jest to przydatne tylko, jeśli naprawdę chcesz powiązać ilość pamięci GPU dostępnej w procesie TensorFlow.
źródło
Zaktualizowano dla TensorFlow 2.0 Alpha i nowszych wersji
Z dokumentów Alpha 2.0 Alpha odpowiedź jest teraz tylko jednym wierszem, zanim cokolwiek zrobisz za pomocą TensorFlow:
źródło
Wszystkie powyższe odpowiedzi zakładają wykonanie z
sess.run()
wywołaniem, które staje się wyjątkiem, a nie regułą w najnowszych wersjach TensorFlow.Podczas korzystania z
tf.Estimator
frameworka (TensorFlow 1.4 i wyżej) sposobem na przekazanie frakcji do niejawnie utworzonegoMonitoredTrainingSession
jest:Podobnie w trybie Eager (TensorFlow 1.5 i nowszy),
Edycja: 11-04-2018 Na przykład, jeśli chcesz użyć
tf.contrib.gan.train
, możesz użyć czegoś podobnego do poniższego:źródło
W przypadku Tensorflow w wersji 2.0 i 2.1 użyj następującego fragmentu kodu :
W poprzednich wersjach dla mnie działał następujący fragment kodu:
źródło
Tensorflow 2.0 Beta i (prawdopodobnie) poza nią
Interfejs API zmienił się ponownie. Można go teraz znaleźć w:
Skróty:
Bibliografia:
Zobacz także: Tensorflow - Użyj procesora graficznego : https://www.tensorflow.org/guide/gpu
dla Tensorflow 2.0 Alpha patrz: ta odpowiedź
źródło
Możesz użyć
w zmiennych środowiskowych.
W kodzie tensorflow :
źródło
Bezwstydna wtyczka: Jeśli zainstalujesz Tensorflow obsługiwany przez GPU, sesja najpierw przydzieli wszystkie GPU, niezależnie od tego, czy ustawisz, aby korzystało tylko z CPU czy GPU. Mogę dodać moją wskazówkę, że nawet jeśli ustawisz wykres tak, aby korzystał tylko z procesora, powinieneś ustawić tę samą konfigurację (zgodnie z odpowiedzią powyżej :)), aby zapobiec niepożądanemu zajęciu GPU.
A w interaktywnym interfejsie, takim jak IPython, powinieneś również ustawić tę konfigurację, w przeciwnym razie przydzieli ona całą pamięć i pozostawi prawie żadną dla innych. Czasami trudno to zauważyć.
źródło
Dla Tensorflow 2.0 to rozwiązanie to pracował dla mnie. (TF-GPU 2.0, Windows 10, GeForce RTX 2070)
źródło
Jeśli używasz Tensorflow 2, spróbuj wykonać następujące czynności:
źródło
Próbowałem trenować unet na zestawie danych wok, ale z powodu ogromnego rozmiaru obrazu pamięć kończy się. wypróbowałem wszystkie powyższe wskazówki, nawet próbowałem z rozmiarem partii == 1, ale bez poprawy. czasami wersja TensorFlow powoduje również problemy z pamięcią. spróbuj za pomocą
źródło
Cóż, jestem nowy w tensorflow, mam Geforce 740m lub coś z GPU z 2 GB pamięci RAM, prowadziłem odręczny przykład odręcznego przykładu dla języka ojczystego z danymi szkoleniowymi zawierającymi 38700 obrazów i 4300 zdjęć testowych i starałem się uzyskać precyzję, przypominać, F1 używając następującego kodu jako sklearn nie dawało mi precyzyjnych wyników. po dodaniu tego do mojego istniejącego kodu zacząłem otrzymywać błędy GPU.
plus mój model był chyba ciężki, otrzymywałem błąd pamięci po 147, 148 epokach, a potem pomyślałem, dlaczego nie tworzyć funkcji dla zadań, więc nie wiem, czy działa w ten sposób w tensrorflow, ale pomyślałem, że jeśli zmienna lokalna jest używane i kiedy poza zakresem może zwolnić pamięć i zdefiniowałem powyższe elementy do szkolenia i testowania w modułach, byłem w stanie osiągnąć 10000 epok bez żadnych problemów, mam nadzieję, że to pomoże ..
źródło
źródło