web-dev-qa-db-fra.com

TensorFlow: InternalError: le lancement de Blas SGEMM a échoué

Lorsque je lance sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}), je reçois InternalError: Blas SGEMM launch failed. Voici la trace complète de l'erreur et de la pile:

InternalErrorTraceback (most recent call last)
<ipython-input-9-a3261a02bdce> in <module>()
      1 batch_xs, batch_ys = mnist.train.next_batch(100)
----> 2 sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in run(self, fetches, feed_dict, options, run_metadata)
    338     try:
    339       result = self._run(None, fetches, feed_dict, options_ptr,
--> 340                          run_metadata_ptr)
    341       if run_metadata:
    342         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _run(self, handle, fetches, feed_dict, options, run_metadata)
    562     try:
    563       results = self._do_run(handle, target_list, unique_fetches,
--> 564                              feed_dict_string, options, run_metadata)
    565     finally:
    566       # The movers are no longer used. Delete them.

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _do_run(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)
    635     if handle is None:
    636       return self._do_call(_run_fn, self._session, feed_dict, fetch_list,
--> 637                            target_list, options, run_metadata)
    638     else:
    639       return self._do_call(_prun_fn, self._session, handle, feed_dict,

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _do_call(self, fn, *args)
    657       # pylint: disable=protected-access
    658       raise errors._make_specific_exception(node_def, op, error_message,
--> 659                                             e.code)
    660       # pylint: enable=protected-access
    661 

InternalError: Blas SGEMM launch failed : a.shape=(100, 784), b.shape=(784, 10), m=100, n=10, k=784
     [[Node: MatMul = MatMul[T=DT_FLOAT, transpose_a=false, transpose_b=false, _device="/job:localhost/replica:0/task:0/gpu:0"](_recv_Placeholder_0/_4, Variable/read)]]
Caused by op u'MatMul', defined at:
  File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/local/lib/python2.7/dist-packages/ipykernel/__main__.py", line 3, in <module>
    app.launch_new_instance()
  File "/usr/local/lib/python2.7/dist-packages/traitlets/config/application.py", line 596, in launch_instance
    app.start()
  File "/usr/local/lib/python2.7/dist-packages/ipykernel/kernelapp.py", line 442, in start
    ioloop.IOLoop.instance().start()
  File "/usr/local/lib/python2.7/dist-packages/zmq/eventloop/ioloop.py", line 162, in start
    super(ZMQIOLoop, self).start()
  File "/usr/local/lib/python2.7/dist-packages/tornado/ioloop.py", line 883, in start
    handler_func(fd_obj, events)
  File "/usr/local/lib/python2.7/dist-packages/tornado/stack_context.py", line 275, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/zmq/eventloop/zmqstream.py", line 440, in _handle_events
    self._handle_recv()
  File "/usr/local/lib/python2.7/dist-packages/zmq/eventloop/zmqstream.py", line 472, in _handle_recv
    self._run_callback(callback, msg)
  File "/usr/local/lib/python2.7/dist-packages/zmq/eventloop/zmqstream.py", line 414, in _run_callback
    callback(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tornado/stack_context.py", line 275, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/ipykernel/kernelbase.py", line 276, in dispatcher
    return self.dispatch_Shell(stream, msg)
  File "/usr/local/lib/python2.7/dist-packages/ipykernel/kernelbase.py", line 228, in dispatch_Shell
    handler(stream, idents, msg)
  File "/usr/local/lib/python2.7/dist-packages/ipykernel/kernelbase.py", line 391, in execute_request
    user_expressions, allow_stdin)
  File "/usr/local/lib/python2.7/dist-packages/ipykernel/ipkernel.py", line 199, in do_execute
    Shell.run_cell(code, store_history=store_history, silent=silent)
  File "/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2723, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2825, in run_ast_nodes
    if self.run_code(code, result):
  File "/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2885, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-4-d7414c4b6213>", line 4, in <module>
    y = tf.nn.softmax(tf.matmul(x, W) + b)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/math_ops.py", line 1036, in matmul
    name=name)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_math_ops.py", line 911, in _mat_mul
    transpose_b=transpose_b, name=name)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/op_def_library.py", line 655, in apply_op
    op_def=op_def)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2154, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1154, in __init__
    self._traceback = _extract_stack()

Pile: EC2 g2.8xlarge machine, Ubuntu 14.04

57
rafaelcosman

Vieille question, mais peut aider les autres. 
Essayez de fermer les sessions interactives actives dans d'autres processus (si IPython Notebook - redémarrez simplement les noyaux). Cela m'a aidé!

De plus, j'utilise ce code pour fermer les sessions locales de ce noyau pendant les expériences:

if 'session' in locals() and session is not None:
    print('Close interactive session')
    session.close()
89
erko

J'ai rencontré ce problème et l'ai résolu en définissant allow_soft_placement=True et gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.3), qui définissent spécifiquement la fraction de mémoire du processeur graphique utilisée. Je suppose que cela a permis d’éviter la mise en concurrence de deux processus tensorflow pour la mémoire du processeur graphique.

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.3)
sess = tf.Session(config=tf.ConfigProto(
  allow_soft_placement=True, log_device_placement=True))
5
Doreen

Mon environnement est Python 3.5, Tensorflow 0.12 et Windows 10 (pas de menu fixe). Je suis en train de former des réseaux de neurones à la fois en CPU et en GPU. Je suis tombé sur la même erreur InternalError: Blas SGEMM launch failed à chaque formation dans le GPU.

Je ne trouvais pas la raison de cette erreur, mais j’ai réussi à exécuter mon code dans le GPU en évitant la fonction tensorflow tensorflow.contrib.slim.one_hot_encoding(). Au lieu de cela, je fais l'opération one-hot-encoding dans numpy (variables d'entrée et de sortie).

Le code suivant reproduit l'erreur et le correctif. C'est une configuration minimale pour apprendre la fonction y = x ** 2 en utilisant la descente de gradient.

import numpy as np
import tensorflow as tf
import tensorflow.contrib.slim as slim

def test_one_hot_encoding_using_tf():

    # This function raises the "InternalError: Blas SGEMM launch failed" when run in the GPU

    # Initialize
    tf.reset_default_graph()
    input_size = 10
    output_size = 100
    input_holder = tf.placeholder(shape=[1], dtype=tf.int32, name='input')
    output_holder = tf.placeholder(shape=[1], dtype=tf.int32, name='output')

    # Define network
    input_oh = slim.one_hot_encoding(input_holder, input_size)
    output_oh = slim.one_hot_encoding(output_holder, output_size)
    W1 = tf.Variable(tf.random_uniform([input_size, output_size], 0, 0.01))
    output_v = tf.matmul(input_oh, W1)
    output_v = tf.reshape(output_v, [-1])

    # Define updates
    loss = tf.reduce_sum(tf.square(output_oh - output_v))
    trainer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
    update_model = trainer.minimize(loss)

    # Optimize
    init = tf.initialize_all_variables()
    steps = 1000

    # Force CPU/GPU
    config = tf.ConfigProto(
        # device_count={'GPU': 0}  # uncomment this line to force CPU
    )

    # Launch the tensorflow graph
    with tf.Session(config=config) as sess:
        sess.run(init)

        for step_i in range(steps):

            # Get sample
            x = np.random.randint(0, 10)
            y = np.power(x, 2).astype('int32')

            # Update
            _, l = sess.run([update_model, loss], feed_dict={input_holder: [x], output_holder: [y]})

        # Check model
        print('Final loss: %f' % l)

def test_one_hot_encoding_no_tf():

    # This function does not raise the "InternalError: Blas SGEMM launch failed" when run in the GPU

    def oh_encoding(label, num_classes):
        return np.identity(num_classes)[label:label + 1].astype('int32')

    # Initialize
    tf.reset_default_graph()
    input_size = 10
    output_size = 100
    input_holder = tf.placeholder(shape=[1, input_size], dtype=tf.float32, name='input')
    output_holder = tf.placeholder(shape=[1, output_size], dtype=tf.float32, name='output')

    # Define network
    W1 = tf.Variable(tf.random_uniform([input_size, output_size], 0, 0.01))
    output_v = tf.matmul(input_holder, W1)
    output_v = tf.reshape(output_v, [-1])

    # Define updates
    loss = tf.reduce_sum(tf.square(output_holder - output_v))
    trainer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
    update_model = trainer.minimize(loss)

    # Optimize
    init = tf.initialize_all_variables()
    steps = 1000

    # Force CPU/GPU
    config = tf.ConfigProto(
        # device_count={'GPU': 0}  # uncomment this line to force CPU
    )

    # Launch the tensorflow graph
    with tf.Session(config=config) as sess:
        sess.run(init)

        for step_i in range(steps):

            # Get sample
            x = np.random.randint(0, 10)
            y = np.power(x, 2).astype('int32')

            # One hot encoding
            x = oh_encoding(x, 10)
            y = oh_encoding(y, 100)

            # Update
            _, l = sess.run([update_model, loss], feed_dict={input_holder: x, output_holder: y})

        # Check model
        print('Final loss: %f' % l)
4
David

J'ai eu cette erreur lors de l'exécution de Tensorflow Distributed. Avez-vous vérifié si l'un des travailleurs signalait des erreurs CUDA_OUT_OF_MEMORY? Si tel est le cas, cela peut avoir à voir avec l'endroit où vous placez vos variables de poids et de biais. Par exemple.

with tf.device("/job:paramserver/task:0/cpu:0"):
   W = weight_variable([input_units, num_hidden_units])       
   b = bias_variable([num_hidden_units])             
4
Ushnish

peut-être que vous n'avez pas libéré votre gpu correctement, si vous utilisez linux, essayez "ps -ef | grep python" pour voir quels travaux utilisent GPU. puis tuez-les

3
sir yang

Dans mon cas, j'avais 2 consoles python ouvertes, toutes deux utilisant keras/tensorflow . En fermant l'ancienne console (oubliée du jour précédent), Tout a commencé à fonctionner correctement.

Il est donc bon de vérifier si vous n’avez pas plusieurs consoles/processus occupant le processeur graphique.

2
Stefan Simik

J'ai fermé toutes les autres sessions Jupyter en cours d'exécution, ce qui a résolu le problème. Je pense que c'était un problème de mémoire GPU.

1
Abdul Karim Khan

Pour moi, j'ai eu ce problème lorsque j'ai essayé d'exécuter plusieurs processus tensorflow (par exemple 2) et que les deux nécessitaient un accès aux ressources du processeur graphique.

Une solution simple consiste à s’assurer qu’un seul processus tensorflow est exécuté à la fois.

Pour plus de détails, vous pouvez voir ici .

Pour être clair, tensorflow essaiera (par défaut) de consommer tout ce qui est disponible GPU. Il ne peut pas être exécuté avec d'autres programmes également actifs. Fermeture. Ressentir libre de rouvrir s'il s'agit en fait d'un autre problème.

1
trdngy

Pour moi, j'ai eu cette erreur en utilisant Keras, et Tensorflow était le backend. C’est parce que l’environnement d’apprentissage approfondi d’Anaconda n’était pas activé correctement. Tensorflow n’a donc pas non plus démarré correctement. J'ai remarqué cela depuis la dernière fois que j'ai activé mon environnement d'apprentissage profond (appelé dl), l'invite a changé dans mon invite Anaconda à ceci:

(dl) C:\Users\georg\Anaconda3\envs\dl\etc\conda\activate.d>set "KERAS_BACKEND=tensorflow"

Bien qu'il n'ait eu que la dl avant cette date. Par conséquent, ce que j’ai fait pour éliminer l’erreur ci-dessus a été de fermer mon carnet de notes jupyter et Anaconda Prompt, puis de le relancer plusieurs fois.

0
George Liu

Redémarrer mes processus Jupyter ne suffisait pas; Je devais redémarrer mon ordinateur.

0
DharmaTurtle

J'ai rencontré cette erreur lors de l'exécution des tests Keras CuDNN en parallèle avec pytest-xdist. La solution consistait à les exécuter en série.

0
Bohumir Zamecnik

Dans mon cas,

D'abord, je cours 

conda propre - tout

nettoyer les archives et les paquets inutilisés.

Ensuite, je redémarre IDE (Pycharm dans ce cas) et cela fonctionne bien. Environnement: anaconda python 3.6, windows 10 64bit. J'installe tensorflow-gpu à l'aide d'une commande fournie sur le site Web anaconda.

0
Duong Trung Nghia

Dans mon cas, il suffit d'ouvrir les ordinateurs portables Jupyter Notebooks sur des serveurs distincts.

Cette erreur ne survient que si j'essaie d'utiliser plusieurs modèles tensorflow/keras sur le même serveur. Peu importe si vous ouvrez un bloc-notes, exécutez-le, fermez-le et essayez-en un autre. S'ils sont en cours de chargement sur le même serveur Jupyter, l'erreur se produit toujours.

0

J'ai rencontré cette erreur après avoir changé le système d'exploitation en Windows 10 récemment, et je ne l'avais jamais rencontré auparavant avec Windows 7. 

L'erreur se produit si je charge mon modèle GPU Tensorflow lorsqu'un autre programme GPU est en cours d'exécution. c'est mon modèle JCuda chargé en serveur de socket, qui n'est pas volumineux. Si je ferme mon ou mes autres programmes GPU, ce modèle Tensorflow peut être chargé avec beaucoup de succès. 

Ce programme JCuda n’est pas grand du tout, il ne s’élève qu’à environ 70 millions d’euros et, en comparaison, ce modèle Tensorflow dépasse les 500 millions d’euros et est bien plus vaste. Mais j'utilise 1080 ti, qui a beaucoup de mémoire. Ce ne serait donc probablement pas un problème de mémoire insuffisante, ni un problème interne délicat de Tensorflow concernant l'OS ou le Cuda. (PS: J'utilise la version 8.0.44 de Cuda et n'ai pas téléchargé de version plus récente.)

0
Tom