181 votes

Comment faire fonctionner Tensorflow sur le CPU

J'ai installé la version GPU de tensorflow sur une Ubuntu 14.04.

Je suis sur un serveur GPU où tensorflow peut accéder aux GPU disponibles.

Je veux exécuter tensorflow sur les CPUs.

Normalement, je peux utiliser env CUDA_VISIBLE_DEVICES=0 pour fonctionner sur le GPU no. 0.

Comment puis-je choisir entre les processeurs à la place ?

Je ne suis pas intéressé par la réécriture de mon code avec with tf.device("/cpu:0"):

199voto

fabrizioM Points 11498

Vous pouvez également définir la variable d'environnement

CUDA_VISIBLE_DEVICES=""

sans avoir à modifier le code source.

3 votes

Quelqu'un a dit que l'exécution de réseaux neuronaux sur des CPU après la phase de formation est aussi performante que l'exécution sur des GPU - c'est-à-dire que seule la phase de formation nécessite vraiment le GPU. Savez-vous si cela est vrai ? Merci !

13 votes

@Crashalot : Ce n'est pas vrai. Regardez les différents benchmarks pour les interférences, les CPU sont un ordre de grandeur plus lent là aussi.

1 votes

Merci @Thomas. des suggestions sur les benchmarks à prendre en compte ? cela varie probablement aussi en fonction de la charge de travail et de la nature des réseaux neuronaux, non ? apparemment, l'application google translate fait tourner certains réseaux neuronaux directement sur les smartphones, vraisemblablement sur le cpu et non le gpu ?

144voto

Si les réponses ci-dessus ne fonctionnent pas, essayez :

os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

2 votes

Pour mémoire, la première option ne semble plus fonctionner.

1 votes

Fonctionne également pour tf 2.X en utilisant tf.keras.Sequential modèles.

1 votes

Existe-t-il un moyen de faire cela sans que tensorflow n'invoque le message d'erreur "CUDA_ERROR_NO_DEVICE : no CUDA-capable device is detected" ?

135voto

Drop Points 4965

Vous pouvez demander device_count paramètre par tf.Session :

config = tf.ConfigProto(
        device_count = {'GPU': 0}
    )
sess = tf.Session(config=config)

Voir aussi le fichier de configuration de protobuf :

tensorflow/core/framework/config.proto

3 votes

Quelqu'un a dit que l'exécution de réseaux neuronaux sur des CPU après la phase de formation est aussi efficace que leur exécution sur des GPU - c'est-à-dire que seule la phase de formation nécessite réellement le GPU. Savez-vous si cela est vrai ? Merci !

4 votes

Cela ne fonctionne pas pour moi (tf1.1). La solution de fabrizioM le fait.

3 votes

N'est-il pas préférable d'utiliser CUDA_VISIBLE_DEVICES variable d'environnement au lieu de modifier la configuration dans le code ?

38voto

gisek Points 2220

Pour moi, seul le réglage CUDA_VISIBLE_DEVICES de manière précise -1 travaux :

Travaux :

import os
import tensorflow as tf

os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

if tf.test.gpu_device_name():
    print('GPU found')
else:
    print("No GPU found")

# No GPU found

Fait pas travail :

import os
import tensorflow as tf

os.environ['CUDA_VISIBLE_DEVICES'] = ''    

if tf.test.gpu_device_name():
    print('GPU found')
else:
    print("No GPU found")

# GPU found

37voto

m3h0w Points 1068

La solution des variables d'environnement ne fonctionne pas pour moi avec tensorflow 2.3.1. Je suppose, d'après les commentaires dans le fil de discussion github, que la solution ci-dessous fonctionne pour les versions >=2.1.0.

De tensorflow github :

import tensorflow as tf

# Hide GPU from visible devices
tf.config.set_visible_devices([], 'GPU')

Assurez-vous de le faire juste après l'importation avec une nouvelle instance de tensorflow (si vous utilisez jupyter notebook, redémarrez le noyau).

Et pour vérifier que vous fonctionnez bien sur le CPU :

# To find out which devices your operations and tensors are assigned to
tf.debugging.set_log_device_placement(True)

# Create some tensors and perform an operation
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
c = tf.matmul(a, b)

print(c)

Sortie attendue :

2.3.1
Executing op MatMul in device /job:localhost/replica:0/task:0/device:CPU:0
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X