Come eseguire Tensorflow sulla CPU


128

Ho installato la versione GPU di tensorflow su Ubuntu 14.04.

Sono su un server GPU dove tensorflow può accedere alle GPU disponibili.

Voglio eseguire tensorflow sulle CPU.

Normalmente posso usare env CUDA_VISIBLE_DEVICES=0 per eseguire su GPU n. 0.

Come posso invece scegliere tra le CPU?

Non sono interessato a riscrivere il mio codice con with tf.device("/cpu:0"):

Risposte:


116

È possibile applicare il device_countparametro per tf.Session:

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

Vedi anche file di configurazione protobuf:

tensorflow/core/framework/config.proto


2
Qualcuno ha detto che eseguire le reti neurali sulle CPU dopo la fase di addestramento è efficiente quanto eseguirle sulle GPU, ovvero solo la frase di addestramento ha davvero bisogno della GPU. Sai se è vero? Grazie!
Crashalot

3
Questo non funziona per me (tf1.1). La soluzione di fabrizioM fa.
P-Gn

3
Non è meglio usare CUDA_VISIBLE_DEVICESla variabile d'ambiente invece di cambiare la configurazione nel codice?
Nandeesh,

3
@ Nandeesh immagino che dipenda dalle tue esigenze. Finora ci sono almeno 53 persone che si sentono più interessate alle variabili d'ambiente e 35 che preferiscono impostare il numero di dispositivi nel codice. Il vantaggio del primo è la semplicità e dell'altro è il controllo più esplicito su (multiple) sessioni dall'interno del programma python stesso (che zero non è necessario per essere codificato, può essere una variabile).
Ivan Aksamentov - Drop il

1
@Crashalot dipende dalla natura della rete. Ad esempio, gli RNN possono essere più veloci sulle CPU per batch di piccole dimensioni a causa della sua natura sequenziale. Le CNN beneficeranno comunque di una GPU in modalità inferenza, ma poiché è necessario eseguirle solo una volta per esempio, una CPU potrebbe essere abbastanza veloce per molti scopi pratici.
Davidmh

174

Puoi anche impostare la variabile d'ambiente su

CUDA_VISIBLE_DEVICES=""

senza dover modificare il codice sorgente.


3
Qualcuno ha detto che l'esecuzione di reti neurali sulle CPU dopo la fase di addestramento è performante quanto eseguirle su GPU, cioè solo la frase di addestramento ha davvero bisogno della GPU. Sai se è vero? Grazie!
Crashalot

13
@Crashalot: questo non è vero. Cerca vari benchmark per l'interferenza, anche le CPU sono un ordine di grandezza più lente.
Thomas,

1
@ Thomas grazie. suggerimenti su quali benchmark considerare? probabilmente varia anche sul carico di lavoro e sulla natura delle reti neurali, giusto? a quanto pare l'app google translate gira alcune reti neurali direttamente sugli smartphone, presumibilmente sulla cpu e non sulla gpu?
Crashalot

@fabrizioM, un esempio di giocattolo sarà più utile.
Girishkumar

7
Questo non ha funzionato per me. : / imposta la variabile d'ambiente ma tensorflow usa ancora la GPU, sto usando conda virtual env, questo fa una differenza?
Guilherme de Lazari

102

Se le risposte precedenti non funzionano, prova:

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

4
Grazie, questo è molto meglio di altre opzioni.
user1098761

Per la cronaca, la prima opzione sembra non funzionare più.
agcala

Funziona anche per tf 2.X quando si utilizzano tf.keras.Sequentialmodelli.
Nicolas M.

22

Per me, solo l'impostazione CUDA_VISIBLE_DEVICESsu -1funziona con precisione :

Lavori:

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

Does non funzionare:

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

4

Basta usare il codice qui sotto.

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

0

In alcuni sistemi è necessario specificare:

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

PRIMA di importare tensorflow.


0

Potresti usare tf.config.set_visible_devices. Una possibile funzione che consente di impostare se e quali GPU utilizzare è:

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)

Supponiamo di essere su un sistema con 4 GPU e di voler utilizzare solo due GPU, quella con id = 0e quella con id = 2, quindi il primo comando del tuo codice, subito dopo aver importato le librerie, sarebbe:

set_gpu([0, 2])

Nel tuo caso, per utilizzare solo la CPU, puoi richiamare la funzione con una lista vuota :

set_gpu([])

Per completezza, se vuoi evitare che l'inizializzazione del runtime allochi tutta la memoria sul dispositivo, puoi usare tf.config.experimental.set_memory_growth. Infine, la funzione per gestire quali dispositivi utilizzare, occupando dinamicamente la memoria delle GPU, diventa:

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)

0

Un'altra possibile soluzione a livello di installazione sarebbe cercare la variante solo CPU: https://www.tensorflow.org/install/pip#package-location

Nel mio caso, questo dà subito:

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

Basta selezionare la versione corretta. Punti bonus per l'utilizzo di un venv come spiegato ad esempio in questa risposta .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.