Как да се уверите, че фазата на обучение няма да бъде изправена пред OOM?

Въпросът от заглавието е пълен. „Как да се уверя, че фазата на обучение няма да бъде изправена пред 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)

person Mehran    schedule 13.10.2019    source източник


Отговори (1)


Известно е изтичане на памет [1], което се случва, ако тренирате многократно в цикъл. Решението за това е извикване на tf.keras.backend.clear_session() и евентуално gc.collect() от време на време в цикъла.

Поведението обаче изглежда различно в TF 1.15 и 2.0 и това може да не е достатъчно, за да го поправите. Намирам, че tf.keras.backend.clear_session() в моя тренировъчен цикъл на процесора нулира постепенно изтичане на памет, без да навреди на обучението.

[1] https://github.com/tensorflow/tensorflow/issues/30324

person user1318499    schedule 13.10.2019
comment
Благодаря. Ще се опитам да използвам вашата информация, за да видя дали мога да намеря нещо онлайн. Но по отношение на връзката, която предоставихте, тя е в нетърпелив режим. Моят не е. Трябва да спомена, че в стеблото. Освен това нямам никакъв цикъл или нещо подобно, това е просто mdoel.fit повикване. Ще добавя повече информация към публикацията си. Благодаря отново. - person Mehran; 14.10.2019