So führen Sie Tensorflow auf der CPU aus

127

Ich habe die GPU-Version von Tensorflow auf einem Ubuntu 14.04 installiert.

Ich bin auf einem GPU-Server, auf dem Tensorflow auf die verfügbaren GPUs zugreifen kann.

Ich möchte Tensorflow auf den CPUs ausführen.

Normalerweise kann ich env CUDA_VISIBLE_DEVICES=0auf GPU Nr. Laufen. 0.

Wie kann ich stattdessen zwischen den CPUs wählen?

Ich bin nicht daran interessiert, meinen Code mit umzuschreiben with tf.device("/cpu:0"):

Alexander R Johansen
quelle

Antworten:

115

Sie können folgende device_countParameter anwenden tf.Session:

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

Siehe auch Protobuf-Konfigurationsdatei:

tensorflow/core/framework/config.proto

Ivan Aksamentov - Tropfen
quelle
2
Jemand sagte, das Ausführen neuronaler Netze auf CPUs nach der Trainingsphase sei genauso effizient wie das Ausführen auf GPUs - dh nur die Trainingsphrase benötige die GPU wirklich. Wissen Sie, ob dies wahr ist? Vielen Dank!
Crashalot
3
Das funktioniert bei mir nicht (tf1.1). Die Lösung von fabrizioM tut es.
P-Gn
3
Ist es nicht besser, CUDA_VISIBLE_DEVICESUmgebungsvariablen zu verwenden , anstatt die Konfiguration im Code zu ändern?
Nandeesh
3
@ Nandeesh Ich denke, es hängt von Ihren Bedürfnissen ab. Bisher gibt es mindestens 53 Personen, die sich mehr für Umgebungsvariablen interessieren, und 35, die es vorziehen, die Anzahl der Geräte im Code festzulegen. Der Vorteil von first ist die Einfachheit und von other ist die explizitere Kontrolle über (mehrere) Sitzungen innerhalb des Python-Programms selbst (dass Null nicht fest codiert werden muss, sondern eine Variable sein kann).
Ivan Aksamentov - Drop
1
@Crashalot es hängt von der Art des Netzwerks ab. Beispielsweise können RNNs auf CPUs für kleine Stapelgrößen aufgrund ihrer sequentiellen Natur schneller sein. CNNs wird immer noch von einer GPU in Inferenz - Modus profitieren, aber da man sie nur ausführen müssen einmal pro Beispiel eine CPU kann schnell genug sein für viele praktische Zwecke.
Davidmh
172

Sie können die Umgebungsvariable auch auf festlegen

CUDA_VISIBLE_DEVICES=""

ohne den Quellcode ändern zu müssen.

fabrizioM
quelle
3
Jemand sagte, dass das Ausführen neuronaler Netze auf CPUs nach der Trainingsphase genauso leistungsfähig ist wie das Ausführen auf GPUs - dh nur die Trainingsphrase benötigt wirklich die GPU. Wissen Sie, ob dies wahr ist? Vielen Dank!
Crashalot
13
@Crashalot: Das ist nicht wahr. Suchen Sie nach verschiedenen Benchmarks für Interferenzen. Auch dort sind CPUs um eine Größenordnung langsamer.
Thomas
1
@ Thomas danke. Vorschläge, welche Benchmarks zu berücksichtigen sind? hängt wahrscheinlich auch von der Arbeitsbelastung und der Art der neuronalen Netze ab, oder? Anscheinend führt die Google Übersetzer-App einige neuronale Netze direkt auf Smartphones aus, vermutlich auf der CPU und nicht auf der GPU?
Crashalot
@fabrizioM, ein Spielzeugbeispiel wird nützlicher sein.
Girishkumar
7
Das hat bei mir nicht funktioniert. : / setze die Umgebungsvariable, aber Tensorflow verwendet immer noch die GPU. Ich verwende conda virtual env. Macht dies einen Unterschied?
Guilherme de Lazari
101

Wenn die obigen Antworten nicht funktionieren, versuchen Sie:

os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Aravindh Kuppusamy
quelle
4
Danke, das ist viel besser als andere Optionen.
user1098761
Nur zur Veranschaulichung, die erste Option scheint nicht mehr zu funktionieren.
Agcala
Funktioniert auch für tf 2.X bei Verwendung von tf.keras.SequentialModellen.
Nicolas M.
22

Für mich funktioniert nur die Einstellung CUDA_VISIBLE_DEVICESauf genau -1:

Werke:

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

Funktioniert nicht :

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
quelle
4

Verwenden Sie einfach den folgenden Code.

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

In einigen Systemen muss Folgendes angegeben werden:

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

VOR dem Importieren von Tensorflow.

Fabrizio
quelle
0

Sie könnten verwenden tf.config.set_visible_devices. Eine mögliche Funktion, mit der Sie festlegen können, ob und welche GPUs verwendet werden sollen, ist:

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)

Angenommen, Sie befinden sich auf einem System mit 4 GPUs und möchten nur zwei GPUs verwenden, die mit id = 0und die mit id = 2, dann lautet der erste Befehl Ihres Codes unmittelbar nach dem Importieren der Bibliotheken:

set_gpu([0, 2])

In Ihrem Fall können Sie die Funktion mit einer leeren Liste aufrufen, um nur die CPU zu verwenden :

set_gpu([])

Der Vollständigkeit halber können Sie verwenden, wenn Sie vermeiden möchten, dass durch die Laufzeitinitialisierung der gesamte Speicher auf dem Gerät zugewiesen wird tf.config.experimental.set_memory_growth. Schließlich lautet die Funktion zum Verwalten der zu verwendenden Geräte, die den GPU-Speicher dynamisch belegen, wie folgt:

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
quelle
0

Eine andere mögliche Lösung auf Installationsebene wäre die Suche nach der reinen CPU-Variante: https://www.tensorflow.org/install/pip#package-location

In meinem Fall gibt dies jetzt:

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

Wählen Sie einfach die richtige Version. Bonuspunkte für die Verwendung eines Venv wie in dieser Antwort erläutert .

Cadoiz
quelle