Je construis un modèle de kéras très simple avec Tensorflow. Lorsque je le démarre, il échoue avec une exception OOM, car il essaie d'allouer une tenseur proportionnelle à la taille du jeu de données complète. Qu'est-ce qui peut arriver ici?
formes pertinentes: p>
Remarque: je n'utilise pas de modèle séquentiel car j'aurai besoin de couches non séquentielles plus tard. p>
Tensorflow: 1.12.0; KERAS: 2.1.6-TF P>
Exemple de travail minimum: p>
---------------------------------------------------------------------------
ResourceExhaustedError Traceback (most recent call last)
<ipython-input-40-be75898e307a> in <module>
24 shuffle=True,
25 verbose=1,
---> 26 validation_data=(x_test, x_test)
27 )
~/tf112/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, max_queue_size, workers, use_multiprocessing, **kwargs)
1637 initial_epoch=initial_epoch,
1638 steps_per_epoch=steps_per_epoch,
-> 1639 validation_steps=validation_steps)
1640
1641 def evaluate(self,
~/tf112/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_arrays.py in fit_loop(model, inputs, targets, sample_weights, batch_size, epochs, verbose, callbacks, val_inputs, val_targets, val_sample_weights, shuffle, initial_epoch, steps_per_epoch, validation_steps)
152 callbacks.on_batch_begin(step_index, batch_logs)
153 try:
--> 154 outs = f(ins)
155 except errors.OutOfRangeError:
156 logging.warning('Your dataset iterator ran out of data; '
~/tf112/lib/python3.6/site-packages/tensorflow/python/keras/backend.py in __call__(self, inputs)
2984
2985 fetched = self._callable_fn(*array_vals,
-> 2986 run_metadata=self.run_metadata)
2987 self._call_fetch_callbacks(fetched[-len(self._fetches):])
2988 return fetched[:len(self.outputs)]
~/tf112/lib/python3.6/site-packages/tensorflow/python/client/session.py in __call__(self, *args, **kwargs)
1437 ret = tf_session.TF_SessionRunCallable(
1438 self._session._session, self._handle, args, status,
-> 1439 run_metadata_ptr)
1440 if run_metadata:
1441 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)
~/tf112/lib/python3.6/site-packages/tensorflow/python/framework/errors_impl.py in __exit__(self, type_arg, value_arg, traceback_arg)
526 None, None,
527 compat.as_text(c_api.TF_Message(self.status.status)),
--> 528 c_api.TF_GetCode(self.status.status))
529 # Delete the underlying status object from memory otherwise it stays alive
530 # as there is a reference to status from this from the traceback due to
ResourceExhaustedError: OOM when allocating tensor with shape[60000,256,28,28] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
[[{{node conv2d_95/Conv2D}} = Conv2D[T=DT_FLOAT, data_format="NCHW", dilations=[1, 1, 1, 1], padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/device:GPU:0"](training_15/TFOptimizer/gradients/conv2d_95/Conv2D_grad/Conv2DBackpropFilter-0-TransposeNHWCToNCHW-LayoutOptimizer, conv2d_95/Conv2D/ReadVariableOp)]]
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.
[[{{node loss_24/mul/_1261}} = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_255_loss_24/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
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.
3 Réponses :
hmm je pense que vous avez oublié de définir un lot_size pour être nourri dans votre réseau!
Essayez avec quelque chose comme: p>
Après avoir recréer le problème de l'OOM dans le code de la question, j'ai ajouté Batch_Size = 32 code> comme vous l'avez suggéré, mais l'OMM a finalement eu lieu.
Keras explicitement des Sais que Batch_Size est redondant lorsque les étapes_per_epoch sont présentes. Et il doit y avoir des étapes_per_epoch dans ma configuration
@ Y.SLIVONCHYK fait des étapes_per_epoch correspond à une certaine taille de mini-lots, et si oui, pouvez-vous augmenter les étapes_per_epoch à AVERT OOM?
@inon déchiré, il y a déjà 6000 étapes par époque qui correspondent à la taille du lot 10, tandis que la taille du tenseur est égale à la taille de la DataSet 60000
np.expand_dim en conjonction avec la spécification de la taille du lot (qui est uniquement devenue possible) a résolu le problème
même problème pour moi.
Je vérifie simplement quelques exemples et trouvez que: Si ce code est avant l'ajustement, aucun OOM ne se produit. P> P>
Entraînez-vous par lots que vous devez utiliser la méthode Fit_Generator. Pour ce faire, vous devez d'abord faire des générateurs de données. Vous devez utiliser ImageDatagenerator dus (par exemple) par flow_from_directory. De cette façon, Keras alimentait des données par lots. Vous devez ajuster la taille du lot pour vous assurer que la mémoire de GPU suffit. Habituellement, la taille du lot est d'environ 32 à 64. La taille des lots généralement plus importante est meilleure. P>
Keras Docs: https://keras.io/preprocessing/image/ p>
Vous pouvez vérifier un exemple d'utilisation ici: https://www.kaggle.com/vookshelf/ Skin-lésion-analyseur-tensorflow-js-web-app p>
Essayez de remplacer tf.expand_dims avec np.expand_dims
@Matiasvaldenegro Bonne idée. Pourtant, cela ne s'est pas amélioré
Eh bien, le problème est que si vous utilisez les données réelles à l'aide de fonctions TF, elle ajoutera les données au graphique, ce qui n'est pas ce que vous voulez.
La différence repose dans la définition du modèle. Le remplacement du modèle avec séquentiel () résout le problème. Pourtant, séquentielle ne va pas fonctionner pour moi.
@Matiasvaldenegro np.expand_dim en conjonction avec la spécification de la taille du lot (qui est uniquement devenue possible) a résolu le problème