Я написал пользовательский обратный вызов (BatchHistory
) для регистрации производительности модели для пакета, а не для эпох, как это делает обратный вызов истории по умолчанию.
Я сохраняю объекты BatchHistory в виде файлов рассылки, чтобы позже иметьдоступ к точной истории обучения.Однако я замечаю, что
1) выборки объектов Callback в 10 раз больше, чем когда я выбираю только поле logs
и
2) при извлечении объекта BatchHistory, памяти GPUвыделяется.
Я не понимаю, почему это так.Я посмотрел на source для обратных вызовов, и это в основном простые классы без логики, связанной с моделями keras.Итак, откуда берется выделение памяти GPU и почему файлы Pickle такие большие, независимо от фактических зарегистрированных данных?Должны быть некоторые данные из модели, которая была обучена с обратным вызовом, привязанным к объекту обратного вызова, который обрабатывается этим, вызывая большие файлы выбора.Это тот случай?Если так: почему и где в источнике указан ответственный код.
Это ошибка OOM, которую я получаю при откреплении обратного вызова, когда графический процессор уже используется:
---------------------------------------------------------------------------
ResourceExhaustedError Traceback (most recent call last)
~/anaconda3/envs/neucores/lib/python3.6/site-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args)
1333 try:
-> 1334 return fn(*args)
1335 except errors.OpError as e:
~/anaconda3/envs/neucores/lib/python3.6/site-packages/tensorflow/python/client/session.py in _run_fn(feed_dict, fetch_list, target_list, options, run_metadata)
1318 return self._call_tf_sessionrun(
-> 1319 options, feed_dict, fetch_list, target_list, run_metadata)
1320
~/anaconda3/envs/neucores/lib/python3.6/site-packages/tensorflow/python/client/session.py in _call_tf_sessionrun(self, options, feed_dict, fetch_list, target_list, run_metadata)
1406 self._session, options, feed_dict, fetch_list, target_list,
-> 1407 run_metadata)
1408
ResourceExhaustedError: OOM when allocating tensor with shape[8704,1024] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
[[{{node training/Adam/Variable_30/Assign}} = Assign[T=DT_FLOAT, _grappler_relax_allocator_constraints=true, use_locking=true, validate_shape=true, _device="/job:localhost/replica:0/task:0/device:GPU:0"](training/Adam/Variable_30, training/Adam/zeros_12)]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
И это мой класс Callback.Но я не думаю, что мой код имеет какое-либо отношение к его.Это должно быть о базовом классе.Но, как я уже сказал, в источнике я не могу найти ничего, что могло бы вызвать выделение памяти GPU.
class BatchHistory(Callback):
def __init__(self):
super().__init__()
self.logs = {'loss' : [],
'acc' : [],
'val_acc' : [],
'val_loss' : [],
'epoch_cnt' : 0,
'epoch_ends' : [],
'time_elapsed' : 0 # seconds
}
self.start_time = time.time()
def on_train_begin(self, logs={}):
pass
def on_batch_end(self, batch, logs={}):
self.logs['acc'].append(logs.get('acc'))
self.logs['loss'].append(logs.get('loss'))
self.logs['time_elapsed']=int(time.time()-self.start_time)
def on_epoch_end(self, epochs, logs=None):
self.logs['epoch_cnt']+=1
self.logs['epoch_ends'].append(len(self.logs['loss']))
self.logs['val_acc'].append(logs.get('val_acc'))
self.logs['val_loss'].append(logs.get('val_loss'))