Я пытаюсь инкриминировать значение per_process_gpu_memory_fraction
в моем tf.GPUOptions()
и затем изменить сеанс Keras с помощью set_session()
, однако доля памяти фактически никогда не изменяется. После первого запуска цикла while резервируется 319 МБ, как показано в nvidia-smi
, что
a) никогда не освобождается при вызове clear_session()
и
b) не поднимается на следующей итерации цикла while.
import GPUtil
import time
import tensorflow as tf
import numpy as np
from keras.backend.tensorflow_backend import set_session, clear_session, get_session
from tensorflow.python.framework.errors_impl import ResourceExhaustedError, UnknownError
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import to_categorical
def model_trainer():
y_pred = None
errors = 0
total_ram = GPUtil.getGPUs()[0].memoryTotal
total_ram_allowed = GPUtil.getGPUs()[0].memoryTotal * 0.90
mem_amount = 0.005 # intentionally allocated a small amount so it needs to
# increment the mem_amount
x_train = np.empty((10000, 100))
y_train = np.random.randint(0, 9, size=10000)
y_train = to_categorical(y_train, 10)
while y_pred is None:
print("mem", mem_amount)
if total_ram_allowed > total_ram * mem_amount and GPUtil.getGPUs()[0].memoryFree > total_ram * mem_amount:
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=mem_amount)
config = tf.ConfigProto(
intra_op_parallelism_threads=2,
inter_op_parallelism_threads=2,
gpu_options=gpu_options)
sess = tf.Session(config=config)
set_session(sess)
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=1024, activation='relu'))
model.add(Dense(units=1024, activation='relu'))
model.add(Dense(units=1024, activation='relu'))
model.add(Dense(units=1024, activation='relu'))
model.add(Dense(units=1024, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
try:
print(sess)
model.fit(x_train, y_train, epochs=5, batch_size=32)
y_pred = model.predict(x_train)
except (ResourceExhaustedError, UnknownError) as e:
if mem_amount > 1.0:
raise ValueError('model too large for vram')
else:
mem_amount += 0.05
clear_session()
errors += 1
pass
else:
clear_session()
if __name__ == "__main__":
model_trainer()
Загадочная вещь в том, что Керас охотно берет новый сеанс (как показано при вызове get_session()
), но не применяет новый GPUOptions
.
В дополнение к приведенному выше примеру я попытался сделать:
clear_session()
del model
clear_session()
del model
gc.collect()
Ничто из этого не сработало при выпуске VRAM.
Моя общая цель - использовать метод проб и ошибок до тех пор, пока у процесса не будет достаточно VRAM для обучения, так как, кажется, нет хорошего способа выяснить, сколько VRAM необходимо для модели Keras, не просто запустив ее, поэтому что я могу запустить несколько моделей параллельно на одном графическом процессоре. Когда происходит ResourceExhaustedError
, я хочу выпустить VRAM , который хранится в Keras и , а затем повторить попытку с большим количеством VRAM . Есть ли способ сделать это?