Въпросът от заглавието е пълен. „Как да се уверя, че фазата на обучение няма да бъде изправена пред OOM?“
Само някои странични бележки, въз основа на моя опит има два случая на OOM. Единият е, когато необходимата памет за вашия модел и мини-партида е по-голяма от паметта, която имате. В такива случаи фазата на обучение никога няма да започне. И решението да се коригира това е да се използват по-малки партиди. Въпреки че би било чудесно, ако можех да изчисля най-големия размер на партидата, който моят хардуер може да управлява за конкретен модел. Но дори и да не мога да намеря най-големия размер на партидата с първия опит, винаги мога да го намеря с проба и грешка (тъй като процесът се проваля веднага).
Вторият сценарий, с който се сблъсквам с OOM, е когато процесът на обучение започне и той продължава известно време. Може би дори няколко епохи. Но след това по някаква неизвестна причина се сблъсква с OOM. За мен този сценарий е разочароващ. Защото може да се случи по всяко време и никога няма да разберете дали обучението, което тече, някога ще приключи или не. Досега загубих дни време за тренировки, докато си мислех, че всичко върви добре.
Мисля, че са необходими някои пояснения. На първо място, говоря за персонален компютър с GPU. И второ, GPU е предназначен за изчисления и не се използва за дисплей. Поправете ме, ако греша, но вярвам, че това означава, че процесът на обучение изисква различни размери на паметта в различни моменти от време. Как е възможно това? И още веднъж, как мога да се уверя, че моята фаза на обучение няма да бъде изправена пред OOM?
Вземете например това изпълнение:
3150/4073 [======================>.......] - ETA: 53:39 - loss: 0.3323
2019-10-13 21:41:13.096320: W tensorflow/core/common_runtime/bfc_allocator.cc:314] Allocator (GPU_0_bfc) ran out of memory trying to allocate 60.81MiB (rounded to 63766528). Current allocation summary follows.
След три часа обучение TensorFlow поиска повече памет, отколкото моят хардуер може да осигури. Въпросът ми е защо това увеличение на разпределението на паметта е в този момент, а не в началото на процеса?
[АКТУАЛИЗАЦИЯ]
В светлината на известните проблеми с нетърпеливия режим, ще добавя някои пояснения към моя случай. Не кодирам в режим на нетърпение. И ето как изглежда моят код за обучение:
strategy = tf.distribute.OneDeviceStrategy(device="/gpu:0")
training_dataset = tf.data.Dataset.from_tensor_slices(...)
validation_dataset = tf.data.Dataset.from_tensor_slices(...)
with strategy.scope():
model = create_model()
model.compile(optimizer='adam', loss='categorical_crossentropy')
pocket = EarlyStopping(monitor='val_loss', min_delta=0.001,
patience=5, verbose=1,
restore_best_weights = True)
history = model.fit(training_dataset.shuffle(buffer_size=1000).batch(30),
epochs=3,
callbacks=[pocket],
validation_data=validation_dataset.shuffle(buffer_size=1000).batch(30),
workers=3, use_multiprocessing=True)