Jak zapobiec alokacji całości pamięci GPU przez tensorflow?

Pracuję w środowisku, w którym zasoby obliczeniowe są współdzielone, tj. mamy kilka maszyn serwerowych wyposażonych w kilka kart graficznych NVIDIA Titan X każda.

Dla małych i średnich modeli, 12GB Titan X są zwykle wystarczające dla 2-3 osób, aby uruchomić trening jednocześnie na tym samym GPU. Jeśli modele są na tyle małe, że pojedynczy model nie wykorzystuje w pełni wszystkich jednostek obliczeniowych Titan X, może to spowodować przyspieszenie w porównaniu z uruchomieniem jeden proces szkolenia po drugim. Nawet w przypadkach, gdy jednoczesny dostęp do GPU spowalnia indywidualny czas treningu, nadal miło jest mieć elastyczność posiadania kilku użytkowników uruchomionych na GPU jednocześnie.

Problem z TensorFlow polega na tym, że domyślnie przydziela pełną ilość dostępnej pamięci na GPU po uruchomieniu. Nawet dla małej 2-warstwowej sieci neuronowej widzę, że 12 GB Titan X są zużyte.

Czy jest sposób na zrobić TensorFlow tylko przeznaczyć, powiedzmy, 4GB pamięci GPU, jeśli ktoś wie, że ta ilość jest wystarczająca dla danego modelu?

Author: Misha Brukman, 2015-12-10

5 answers

Możesz ustawić ułamek pamięci GPU, który ma zostać przydzielony podczas konstruowania tf.Session przechodząc przez tf.GPUOptions jako część opcjonalnego argumentu config:

# Assume that you have 12GB of GPU memory and want to allocate ~4GB:
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)

sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

The per_process_gpu_memory_fraction działa jako twarda górna granica ilości pamięci GPU, która będzie używana przez proces na każdym GPU na tym samym komputerze. Obecnie frakcja ta jest stosowana równomiernie do wszystkich GPU na tej samej maszynie; nie ma sposobu, aby ustawić ją na podstawie dla GPU.

 189
Author: mrry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-08 15:00:05
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)

Https://github.com/tensorflow/tensorflow/issues/1578

 123
Author: Sergey Demyanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-26 07:43:45

Oto fragment książki Deep Learning with TensorFlow

W niektórych przypadkach pożądane jest, aby proces przydzielał tylko podzbiór dostępnej pamięci lub zwiększał zużycie pamięci tylko tak, jak jest to potrzebne procesowi. TensorFlow dostarcza dwie opcje konfiguracji w sesji, aby to kontrolować. Pierwszą z nich jest opcja allow_growth, która próbuje przydzielić tylko tyle pamięci GPU na podstawie alokacji czasu pracy, zaczyna przydzielać bardzo mało pamięci, a gdy sesje się uruchamiają rozszerzamy obszar pamięci GPU potrzebny procesowi TensorFlow.

1) umożliwiają wzrost: (bardziej elastyczny)

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config, ...)

Drugą metodą jest opcja per_process_gpu_memory_fraction, która określa ułamek całkowitej ilości pamięci, jaką powinien przydzielić widoczny GPU each. Uwaga: nie jest wymagane zwolnienie pamięci, może nawet pogorszyć fragmentację pamięci po wykonaniu.

2) przydzielanie pamięci stałej :

Przydzielać tylko 40% całkowitej pamięci każdego GPU przez:

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.4
session = tf.Session(config=config, ...)

Uwaga: Jest to przydatne tylko wtedy, gdy naprawdę chcesz powiązać ilość pamięci GPU dostępnej w procesie TensorFlow.

 17
Author: user1767754,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-11 18:57:16

Wszystkie powyższe odpowiedzi zakładają wykonanie wywołania sess.run(), które staje się wyjątkiem, a nie regułą w ostatnich wersjach TensorFlow.

Przy użyciu frameworka tf.Estimator (TensorFlow 1.4 i wyżej) sposobem przekazania ułamka do niejawnie utworzonego MonitoredTrainingSession jest,

opts = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
conf = tf.ConfigProto(gpu_options=opts)
trainingConfig = tf.estimator.RunConfig(session_config=conf, ...)
tf.estimator.Estimator(model_fn=..., 
                       config=trainingConfig)

Podobnie w trybie Eager (TensorFlow 1.5 i wyżej),

opts = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
conf = tf.ConfigProto(gpu_options=opts)
tfe.enable_eager_execution(config=conf)

Edycja: 11-04-2018 Jako przykład, jeśli chcesz użyć tf.contrib.gan.train, możesz użyć czegoś podobnego do poniżej:

tf.contrib.gan.gan_train(........, config=conf)
 8
Author: Urs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 05:56:52

Bezwstydna wtyczka: jeśli zainstalujesz obsługiwany przez GPU przepływ Tensorflow, sesja najpierw przydzieli wszystkie GPU, niezależnie od tego, czy ustawisz na niego tylko CPU czy GPU. Mogę dodać moją wskazówkę, że nawet ustawić Wykres używać CPU tylko należy ustawić tę samą konfigurację (jak odpowiedział powyżej:)), aby zapobiec niechcianej okupacji GPU.

A w interaktywnym interfejsie takim jak IPython powinieneś również ustawić tę konfigurację, w przeciwnym razie przydzieli ona całą pamięć i nie pozostawiła prawie żadnej dla innych. Czasami jest to trudne do Uwaga.

 3
Author: lerner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-15 11:45:30