web-dev-qa-db-fra.com

Comment déboguer une erreur de segmentation Tensorflow dans model.fit ()?

J'essaie d'exécuter l'exemple Keras MINST en utilisant tensorflow-gpu avec Geforce 2080. Mon environnement est Anaconda sur un système Linux.

J'exécute l'exemple non modifié à partir d'une session python en ligne de commande. Je reçois la sortie suivante:

Using TensorFlow backend.
Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce RTX 2080, pci bus id: 0000:01:00.0, compute capability: 7.5
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
conv2d_1/random_uniform/RandomUniform: (RandomUniform): 
/job:localhost/replica:0/task:0/device:GPU:0
conv2d_1/random_uniform/sub: (Sub): 
/job:localhost/replica:0/task:0/device:GPU:0
conv2d_1/random_uniform/mul: (Mul): 
/job:localhost/replica:0/task:0/device:GPU:0
conv2d_1/random_uniform: (Add): 
/job:localhost/replica:0/task:0/device:GPU:0
[...]

Les dernières lignes que je reçois sont:

training/Adadelta/Const_31: (Const): /job:localhost/replica:0/task:0/device:GPU:0
training/Adadelta/mul_46/x: (Const): /job:localhost/replica:0/task:0/device:GPU:0
training/Adadelta/mul_47/x: (Const): /job:localhost/replica:0/task:0/device:GPU:0
Segmentation fault (core dumped)

Après avoir lu, j'ai supposé que cela pourrait être un problème de mémoire et ajouté ces lignes pour éviter que le GPU ne manque de mémoire:

config = tf.ConfigProto(log_device_placement=True)
config.gpu_options.per_process_gpu_memory_fraction=0.3
K.tensorflow_backend.set_session(tf.Session(config=config))

Vérification à l'aide de l'outil nvidia-smi que le processeur graphique est réellement utilisé (watch -n1 nvidia-smi) Je peux confirmer à partir de la sortie suivante (dans cette exécution, aucun per_process_gpu_memory_fraction n'était défini sur 1):

 enter image description here

Je soupçonne une incompatibilité de version quelque part entre CUDA, Keras et Tensorflow d’être le problème, mais je ne sais pas comment déboguer cela.

Quelles sont les mesures de débogage disponibles pour aller au fond des choses? Quels autres problèmes pourraient être la raison de cette erreur de segmentation?

EDIT: J'ai expérimenté plus loin et remplacer le modèle avec ce code fonctionne bien:

model = keras.Sequential([
    keras.layers.Flatten(input_shape=input_shape),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

Cependant, une fois que je présente une couche de convolution comme si

model = keras.Sequential([
    keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape),
#    keras.layers.Flatten(input_shape=input_shape),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)

])

alors je reçois encore le segfault susmentionné.

Tous les paquets ont été installés via Anaconda. J'ai installé

  • conda 4.5.11
  • python 3.6.6
  • keras-gpu 2.2.4
  • tensorflow 1.12.0
  • tensorflow-gpu 1.12.0
  • cudnn 7.2.1
  • cudatoolkit 9.2

EDIT: J'ai essayé le même code dans un environnement non anaconda et cela fonctionne parfaitement. Je préférerais utiliser anaconda pour éviter que les mises à jour du système ne cassent des objets.

5
Herr von Wurst

Construire le flux tensoriel à partir de la source (r1.13). Erreur de segmentation Conv2D corrigée.

suivre Construire à partir de la source

mon GPU: RTX 2070 Ubuntu 16.04 Python 3.5.2 Pilote NVIDIA 410.78 CUDA - 10.0.130 __. Capacité de calcul: 7.5

Build: tensorflow-1.13.0rc0-cp35-cp35m-linux_x86_64

Téléchargement préconfiguré de https://github.com/tensorflow/tensorflow/issues/22706

4
bhagath

J'ai eu exactement le même problème sur un système très similaire à François, mais en utilisant un RTX2070 sur lequel je pouvais reproduire de manière fiable l'erreur de segmentation lors de l'utilisation de la fonction conv2d exécutée sur le GPU. Mon réglage:

  • Ubuntu: 18.04
  • GPU: RTX 2070
  • CUDA: 10
  • cudnn: 7
  • conda avec python 3.6

Je l'ai finalement résolu par en créant un flux de tensorateur à partir de la source dans un nouvel environnement conda. Pour un guide fantastique, voir par exemple le lien suivant: https://Gist.github.com/Brainiarc7/6d6c3f23ea057775b72c52817759b25c

Ceci est fondamentalement comme n'importe quel autre guide de build-tensorflow-from-source et consistait dans mon cas en les étapes suivantes:

  1. bazel insalubre
  2. cloner tensorflow de git et exécuter ./configure 
  3. exécuter la commande bazel build appropriée (voir le lien pour plus de détails)

Quelques problèmes mineurs sont apparus lors de la construction, l'un d'eux a été résolu en installant 3 paquets manuellement, en utilisant:

pip install keras_applications==1.0.4 --no-deps
pip install keras_preprocessing==1.0.2 --no-deps
pip install h5py==2.8.0

que j’ai trouvé en utilisant cette réponse ici: Erreur lors de la compilation de Tensorflow à partir de la source - Pas de module nommé 'keras_applications'

conv2d fonctionne maintenant comme un charme lorsque vous utilisez le gpu!

Cependant, comme tout cela a pris un temps assez long (la création à partir des sources prend plus d’une heure, sans compter la recherche de la solution sur Internet), je vous recommande de faire une sauvegarde du système après l’avoir fonctionné, par exemple. utilisez timeshift ou tout autre programme que vous aimez.

2
Laurin Herbsthofer

J'ai eu le même problème avec Conv2D avec:

  • Ubuntu 18.04
  • Carte graphique: GeForce RTX 2080
  • CUDA: cuda_10.0.130_410
  • CUDNN: cudnn-10.0-linux-x64-v7.4.2
  • conda avec Python 3.6

Le meilleur conseil était de ce lien: https://github.com/tensorflow/tensorflow/issues/24383

Donc, un correctif devrait venir avec Tensorflow 1.13 . En attendant, utiliser Tensorflow 1.13 nightly build (26 déc. 2018) + en utilisant tensorflow.keras au lieu de keras a résolu le problème.

1
Francois Robert