0
votes

Pourquoi Keras Model.fit () utilise-t-il un jeu de données entier en tant que lot et fonctionne de mémoire?

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>

  • Forme de données: [60000, 28, 28, 1] LI>
  • BATCH_SIZE (Automatique): 10, LI>
  • Étapes_PER_EPOCH: 6000 LI>
  • Message d'erreur: OOM lors de l'attribution de tenseur avec forme [60000.256,28,28] et de type flotteur li> ul>

    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.
    


5 commentaires

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


3 Réponses :


-3
votes

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: xxx


5 commentaires

Après avoir recréer le problème de l'OOM dans le code de la question, j'ai ajouté Batch_Size = 32 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



0
votes

même problème pour moi. Je vérifie simplement quelques exemples et trouvez que: xxx

Si ce code est avant l'ajustement, aucun OOM ne se produit.


0 commentaires

1
votes

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.

Keras Docs: https://keras.io/preprocessing/image/

Vous pouvez vérifier un exemple d'utilisation ici: https://www.kaggle.com/vookshelf/ Skin-lésion-analyseur-tensorflow-js-web-app


0 commentaires