5
votes

Comment réparer "ResourceExhaustedError: MOO lors de l'allocation du tenseur"

Je veux faire un modèle avec plusieurs entrées. Alors, j'essaye de construire un modèle comme celui-ci.

 ResourceExhaustedError                    Traceback (most recent call
 last) <ipython-input-18-2b79f16d63c0> in <module>()
 ----> 1 history = model.fit([trainimage, train_product_embd],train_label,
 validation_data=([validimage,valid_product_embd],valid_label),
 epochs=10, steps_per_epoch=100, validation_steps=10)

 4 frames
 /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/client/session.py
 in __call__(self, *args, **kwargs)    1470         ret =
 tf_session.TF_SessionRunCallable(self._session._session,    1471      
 self._handle, args,
 -> 1472                                                run_metadata_ptr)    1473         if run_metadata:    1474          
 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)
 
 ResourceExhaustedError: 2 root error(s) found.   (0) Resource
 exhausted: OOM when allocating tensor with shape[800000,32,30,62] and
 type float on /job:localhost/replica:0/task:0/device:GPU:0 by
 allocator GPU_0_bfc     [[{{node conv2d_1/convolution}}]] 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.
 
     [[metrics/acc/Mean_1/_185]] 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.
 
   (1) Resource exhausted: OOM when allocating tensor with
 shape[800000,32,30,62] and type float on
 /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc    
 [[{{node conv2d_1/convolution}}]] 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.
 
 0 successful operations. 0 derived errors ignored.

et le résumé: _

Mais, quand j'essaye de former ce modèle,

history = model.fit([trainimage, train_product_embd],train_label,
    validation_data=([validimage,valid_product_embd],valid_label), epochs=10, 
    steps_per_epoch=100, validation_steps=10)

le problème se produit ....:

# define two sets of inputs
inputA = Input(shape=(32,64,1))
inputB = Input(shape=(32,1024))
 
# CNN
x = layers.Conv2D(32, kernel_size = (3, 3), activation = 'relu')(inputA)
x = layers.Conv2D(32, (3,3), activation='relu')(x)
x = layers.MaxPooling2D(pool_size=(2,2))(x)
x = layers.Dropout(0.2)(x)
x = layers.Flatten()(x)
x = layers.Dense(500, activation = 'relu')(x)
x = layers.Dropout(0.5)(x)
x = layers.Dense(500, activation='relu')(x)
x = Model(inputs=inputA, outputs=x)
 
# DNN
y = layers.Flatten()(inputB)
y = Dense(64, activation="relu")(y)
y = Dense(250, activation="relu")(y)
y = Dense(500, activation="relu")(y)
y = Model(inputs=inputB, outputs=y)
 
# Combine the output of the two models
combined = concatenate([x.output, y.output])
 

# combined outputs
z = Dense(300, activation="relu")(combined)
z = Dense(100, activation="relu")(combined)
z = Dense(1, activation="softmax")(combined)

model = Model(inputs=[x.input, y.input], outputs=z)

model.summary()

opt = Adam(lr=1e-3, decay=1e-3 / 200)
model.compile(loss = 'sparse_categorical_crossentropy', optimizer = opt,
    metrics = ['accuracy'])

Merci d'avoir lu et j'espère m'aider :)


0 commentaires

3 Réponses :


0
votes

D'après [800000,32,30,62] il semble que votre modèle ait mis toutes les données dans un seul lot.

Essayez la taille de lot spécifiée comme

history = model.fit([trainimage, train_product_embd],train_label, validation_data=([validimage,valid_product_embd],valid_label), epochs=10, steps_per_epoch=100, validation_steps=10, batch_size=32)

S'il s'agit toujours de MOO, essayez de réduire la batch_size du batch_size


2 commentaires

OP specificed steps_per_epoch=100 donc je ne pense pas que ce soit le cas. batch_size doit être automatiquement défini sur sample_size/steps_per_epoch .


J'ai d'abord essayé 'batch_size'. Mais, il y avait une erreur: "ValueError: Si vos données sont sous la forme de tenseurs symboliques, vous devez spécifier l'argument steps_per_epoch (au lieu de l'argument batch_size , car les tenseurs symboliques sont censés produire des lots de données d'entrée)." Merci pour votre avis au passage :)



23
votes

OOM signifie «out of memory». Votre GPU manque de mémoire, il ne peut donc pas allouer de mémoire pour ce tenseur. Vous pouvez faire plusieurs choses:

  • Diminuez le nombre de neurones dans vos couches Dense , Conv2D
  • Utilisez un batch_size plus batch_size (ou augmentez steps_per_epoch et validation_steps )
  • Utilisez des images en niveaux de gris (il y aura un canal au lieu de trois)
  • Réduisez le nombre de couches
  • Utilisez plus de couches MaxPooling2D et augmentez la taille de leur pool
  • Utilisez des strides plus importantes dans vos couches Conv2D
  • Réduisez la taille de vos images (vous pouvez utiliser PIL ou cv2 pour cela)
  • Appliquer le décrochage
  • Utilisez une précision de float plus petite, à savoir np.float32 si vous avez accidentellement utilisé np.float64
  • Si vous utilisez un modèle pré-entraîné, figer les premières couches

Il y a des informations plus utiles sur cette erreur:

OOM when allocating tensor with shape[800000,32,30,62]

C'est une forme étrange. Si vous travaillez avec des images, vous devriez normalement avoir 3 ou 1 canaux. En plus de cela, il semble que vous transmettez votre ensemble de données entier à la fois; vous devriez plutôt le transmettre par lots.


2 commentaires

c'est un peu bizarre que j'obtienne la même erreur (après avoir changé le processeur pour la version gpu) juste en faisant séquentiel et en ajoutant les couches, pas même un ajustement ou quoi que ce soit. forme [173056,4096] et type flotteur. est-il normal d'avoir des erreurs d'allocation lorsque vous ne passez même pas des lots?


Oui, car un réseau de neurones n'est qu'une énorme matrice de valeurs flottantes, tout comme les lots d'entrée.



0
votes

Cela m'est arrivé aussi.

Vous pouvez essayer de réduire les paramètres pouvant être entraînés en utilisant une forme d'apprentissage par transfert - essayez de geler les premières couches et utilisez des tailles de lots inférieures.


0 commentaires