web-dev-qa-db-fra.com

Existe-t-il un moyen de déterminer la quantité de mémoire GPU utilisée par TensorFlow?

Tensorflow a tendance à préallouer la totalité de la mémoire disponible sur ses GPU. Pour le débogage, existe-t-il un moyen de dire combien de mémoire est réellement utilisée?

11
Maarten

(1) Il existe un support limité avec Timeline pour l'enregistrement des allocations de mémoire. Voici un exemple pour son utilisation:

    run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
    run_metadata = tf.RunMetadata()
    summary, _ = sess.run([merged, train_step],
                          feed_dict=feed_dict(True),
                          options=run_options,
                          run_metadata=run_metadata)
    train_writer.add_run_metadata(run_metadata, 'step%03d' % i)
    train_writer.add_summary(summary, i)
    print('Adding run metadata for', i)
    tl = timeline.Timeline(run_metadata.step_stats)
    print(tl.generate_chrome_trace_format(show_memory=True))
    trace_file = tf.gfile.Open(name='timeline', mode='w')
    trace_file.write(tl.generate_chrome_trace_format(show_memory=True))

Vous pouvez essayer ce code avec l'exemple MNIST ( liste des résumés )

Cela générera un fichier de traçage nommé timeline, que vous pourrez ouvrir avec le traçage chrome: //. Notez que cela ne donne qu’une statistique approximative d’utilisation de la mémoire du GPU. Il simule fondamentalement une exécution GPU, mais n’a pas accès à toutes les métadonnées du graphique. Il ne sait pas non plus combien de variables ont été attribuées au GPU.

(2) Pour une mesure très grossière de l'utilisation de la mémoire du GPU, nvidia-smi indique l'utilisation totale de la mémoire du périphérique au moment où vous exécutez la commande.

nvprof peut afficher l'utilisation de la mémoire partagée intégrée et enregistrer l'utilisation au niveau du noyau CUDA, mais n'indique pas l'utilisation de la mémoire globale/du périphérique.

Voici un exemple de commande: nvprof --print-gpu-trace matrixMul

Et plus de détails ici: http://docs.nvidia.com/cuda/profiler-users-guide/#abstract

9
Yao Zhang

Le profileur TensorFlow a amélioré la chronologie de la mémoire, qui repose sur des informations réelles sur l'allocateur de mémoire gpu https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/profiler#visualize-time-and-memory

3
Peter

Il y a du code dans tensorflow.contrib.memory_stats qui aidera avec ceci:

from tensorflow.contrib.memory_stats.python.ops.memory_stats_ops import BytesInUse
with tf.device('/device:GPU:0'):  # Replace with device you are interested in
  bytes_in_use = BytesInUse()
with tf.Session() as sess:
  print(sess.run(bytes_in_use))
2
Steve

Voici une solution pratique qui a bien fonctionné pour moi: 

Désactivez la pré-allocation de mémoire GPU à l'aide de la configuration de session TF: 

config = tf.ConfigProto()  
config.gpu_options.allow_growth=True  
sess = tf.Session(config=config)  

exécutez nvidia-smi -l (ou un autre utilitaire) pour surveiller la consommation de mémoire du processeur graphique.

Parcourez votre code avec le débogueur jusqu'à ce que vous voyiez la consommation de mémoire inattendue du processeur graphique.

0
eitanrich