Comment exécuter Tensorflow sur le processeur

128

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

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

Je veux exécuter tensorflow sur les processeurs.

Normalement, je peux utiliser env CUDA_VISIBLE_DEVICES=0pour exécuter sur GPU no. 0.

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

Je ne suis pas intéressé à réécrire mon code avec with tf.device("/cpu:0"):

Alexander R Johansen
la source

Réponses:

116

Vous pouvez appliquer le device_countparamètre par tf.Session:

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

Voir aussi le fichier de configuration protobuf:

tensorflow/core/framework/config.proto

Ivan Aksamentov - Drop
la source
2
Quelqu'un a dit qu'exécuter des réseaux neuronaux sur des CPU après la phase d'entraînement est aussi efficace que les exécuter sur des GPU - c'est-à-dire que seule la phrase d'entraînement a vraiment besoin du GPU. Savez-vous si c'est vrai? Merci!
Crashalot
3
Cela ne fonctionne pas pour moi (tf1.1). La solution de fabrizioM le fait.
P-Gn
3
N'est-il pas préférable d'utiliser CUDA_VISIBLE_DEVICESla variable d'environnement au lieu de changer la configuration dans le code?
Nandeesh
3
@Nandeesh Je suppose que cela dépend de vos besoins. Jusqu'à présent, il y a au moins 53 personnes qui se sentent plus dans les variables d'environnement et 35 qui préfèrent définir le nombre d'appareils dans le code. L'avantage du premier est la simplicité et d'un autre est un contrôle plus explicite sur (plusieurs) sessions à partir du programme python lui-même (ce zéro n'est pas nécessaire pour être codé en dur, cela peut être une variable).
Ivan Aksamentov - Drop le
1
@Crashalot cela dépend de la nature du réseau. Par exemple, les RNN peuvent être plus rapides sur les processeurs pour de petites tailles de lots en raison de leur nature séquentielle. Les CNN bénéficieront toujours d'un GPU en mode inférence, mais comme vous n'avez besoin de les exécuter qu'une fois par exemple, un processeur peut être assez rapide pour de nombreuses raisons pratiques.
Davidmh le
174

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

CUDA_VISIBLE_DEVICES=""

sans avoir à modifier le code source.

fabrizioM
la source
3
Quelqu'un a dit qu'exécuter des réseaux neuronaux sur des CPU après la phase d'entraînement est aussi performant que les exécuter sur des GPU - c'est-à-dire que seule la phrase d'entraînement a vraiment besoin du GPU. Savez-vous si c'est vrai? Merci!
Crashalot
13
@Crashalot: Ce n'est pas vrai. Recherchez divers points de repère pour les interférences, les processeurs sont également un ordre de grandeur plus lents.
Thomas
1
@Thomas merci. des suggestions sur les points de repère à considérer? varie probablement aussi en fonction de la charge de travail et de la nature des réseaux neuronaux, non? apparemment, l'application google translate exécute des réseaux neuronaux directement sur les smartphones, probablement sur le processeur et non sur le GPU?
Crashalot
@fabrizioM, un exemple de jouet sera plus utile.
Girishkumar
7
Cela n'a pas fonctionné pour moi. : / définit la variable d'environnement mais tensorflow utilise toujours le GPU, j'utilise conda virtual env, cela fait-il une différence?
Guilherme de Lazari
102

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

os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Aravindh Kuppusamy
la source
4
Merci, c'est bien mieux que les autres options.
user1098761
Pour mémoire, la première option ne semble plus fonctionner.
agcala
Fonctionne également pour tf 2.X lors de l'utilisation de tf.keras.Sequentialmodèles.
Nicolas M. le
22

Pour moi, seul le réglage CUDA_VISIBLE_DEVICESsur -1fonctionne précisément :

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

Ne fonctionne pas :

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
Andrzej Gis
la source
4

En utilisant simplement le code ci-dessous.

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
蔡 易 翔
la source
0

Dans certains systèmes, il faut spécifier:

import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]=""  # or even "-1"

AVANT d'importer tensorflow.

Fabrizio
la source
0

Vous pourriez utiliser tf.config.set_visible_devices. Une fonction possible qui vous permet de définir si et quels GPU utiliser est:

import tensorflow as tf

def set_gpu(gpu_ids_list):
    gpus = tf.config.list_physical_devices('GPU')
    if gpus:
        try:
            gpus_used = [gpus[i] for i in gpu_ids_list]
            tf.config.set_visible_devices(gpus_used, 'GPU')
            logical_gpus = tf.config.experimental.list_logical_devices('GPU')
            print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPU")
        except RuntimeError as e:
            # Visible devices must be set before GPUs have been initialized
            print(e)

Supposons que vous soyez sur un système avec 4 GPU et que vous ne souhaitiez utiliser que deux GPU, celui avec id = 0et celui avec id = 2, alors la première commande de votre code, immédiatement après l'importation des bibliothèques, serait:

set_gpu([0, 2])

Dans votre cas, pour n'utiliser que le CPU, vous pouvez appeler la fonction avec une liste vide :

set_gpu([])

Par souci d'exhaustivité, si vous souhaitez éviter que l'initialisation du runtime n'alloue toute la mémoire du périphérique, vous pouvez utiliser tf.config.experimental.set_memory_growth. Enfin, la fonction de gestion des appareils à utiliser, occupant dynamiquement la mémoire des GPU, devient:

import tensorflow as tf

def set_gpu(gpu_ids_list):
    gpus = tf.config.list_physical_devices('GPU')
    if gpus:
        try:
            gpus_used = [gpus[i] for i in gpu_ids_list]
            tf.config.set_visible_devices(gpus_used, 'GPU')
            for gpu in gpus_used:
                tf.config.experimental.set_memory_growth(gpu, True)
            logical_gpus = tf.config.experimental.list_logical_devices('GPU')
            print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPU")
        except RuntimeError as e:
            # Visible devices must be set before GPUs have been initialized
            print(e)
Roberto Amoroso
la source
0

Une autre solution possible au niveau de l'installation serait de rechercher la variante CPU uniquement: https://www.tensorflow.org/install/pip#package-location

Dans mon cas, cela donne maintenant:

pip3 install https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow_cpu-2.2.0-cp38-cp38-win_amd64.whl

Sélectionnez simplement la bonne version. Points bonus pour l'utilisation d'un venv comme expliqué par exemple dans cette réponse .

Cadoiz
la source