Jak uruchomić Tensorflow na CPU

128

Zainstalowałem wersję tensorflow dla GPU na Ubuntu 14.04.

Jestem na serwerze GPU, na którym tensorflow może uzyskać dostęp do dostępnych procesorów graficznych.

Chcę uruchomić tensorflow na procesorach.

Zwykle mogę używać env CUDA_VISIBLE_DEVICES=0do uruchamiania na GPU nr. 0.

Jak zamiast tego mogę wybrać między procesorami?

Nie jestem zainteresowany przepisywaniem mojego kodu with tf.device("/cpu:0"):

Alexander R Johansen
źródło

Odpowiedzi:

116

Możesz zastosować device_countparametr do tf.Session:

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

Zobacz też plik konfiguracyjny protobuf:

tensorflow/core/framework/config.proto

Ivan Aksamentov - Drop
źródło
2
Ktoś powiedział, że uruchamianie sieci neuronowych na procesorach po fazie uczenia jest tak samo wydajne, jak uruchamianie ich na GPU - tj. Tylko fraza szkoleniowa naprawdę potrzebuje GPU. Czy wiesz, czy to prawda? Dzięki!
Crashalot
3
To nie działa dla mnie (tf1.1). Rozwiązanie fabrizioM to robi.
P-Gn
3
Czy nie lepiej jest używać CUDA_VISIBLE_DEVICESzmiennej środowiskowej zamiast zmieniać konfigurację w kodzie?
Nandeesh
3
@Nandeesh Myślę, że to zależy od twoich potrzeb. Jak dotąd jest co najmniej 53 osób, które bardziej interesują się zmiennymi środowiskowymi, a 35 woli ustawiać liczbę urządzeń w kodzie. Zaletą pierwszego jest prostota, a drugim bardziej wyraźna kontrola nad (wieloma) sesjami z poziomu samego programu w Pythonie (że zero nie musi być zakodowane na sztywno, może to być zmienna).
Ivan Aksamentov - Drop
1
@Crashalot to zależy od charakteru sieci. Na przykład sieci RNN mogą być szybsze na procesorach w przypadku małych partii ze względu na ich sekwencyjny charakter. CNN nadal będą korzystać z GPU w trybie wnioskowania, ale ponieważ na przykład wystarczy uruchomić je tylko raz, procesor może być wystarczająco szybki do wielu praktycznych celów.
Davidmh,
174

Możesz również ustawić zmienną środowiskową na

CUDA_VISIBLE_DEVICES=""

bez konieczności modyfikowania kodu źródłowego.

fabrizioM
źródło
3
Ktoś powiedział, że uruchamianie sieci neuronowych na procesorach po fazie uczenia jest równie wydajne, jak uruchamianie ich na GPU - tj. Tylko fraza szkoleniowa naprawdę potrzebuje GPU. Czy wiesz, czy to prawda? Dzięki!
Crashalot
13
@ Crashalot: To nieprawda. Poszukaj różnych wzorców dla zakłóceń, tam również procesory są o rząd wielkości wolniejsze.
Thomas
1
@Thomas thanks. sugestie dotyczące wzorców do rozważenia? prawdopodobnie również zależy od obciążenia pracą i charakteru sieci neuronowych, prawda? najwyraźniej aplikacja tłumacza google uruchamia niektóre sieci neuronowe bezpośrednio na smartfonach, prawdopodobnie na procesorze, a nie na gpu?
Crashalot
@fabrizioM, przykład zabawki będzie bardziej przydatny.
Girishkumar
8
To nie zadziałało dla mnie. : / ustaw zmienną środowiskową, ale tensorflow nadal używa GPU, używam wirtualnego środowiska conda, czy to robi różnicę?
Guilherme de Lazari
102

Jeśli powyższe odpowiedzi nie działają, spróbuj:

os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Aravindh Kuppusamy
źródło
4
Dzięki, to jest znacznie lepsze niż inne opcje.
user1098761
Tak dla przypomnienia, pierwsza opcja wydaje się już nie działać.
agcala,
Działa również dla tf 2.X podczas korzystania z tf.keras.Sequentialmodeli.
Nicolas M.,
22

U mnie działa tylko ustawienie CUDA_VISIBLE_DEVICESna precyzyjne -1:

Pracuje:

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

Czy nie działa:

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
źródło
4

Używając tylko poniższego kodu.

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
蔡 易 翔
źródło
0

W niektórych systemach należy określić:

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

PRZED zaimportowaniem tensorflow.

Fabrizio
źródło
0

Możesz użyć tf.config.set_visible_devices. Jedną z możliwych funkcji, która pozwala ustawić, czy i które GPU mają być używane, to:

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)

Załóżmy, że pracujesz w systemie z 4 procesorami graficznymi i chcesz używać tylko dwóch procesorów graficznych, jednego z id = 0i tego z id = 2, a pierwsze polecenie kodu, natychmiast po zaimportowaniu bibliotek, brzmiałoby:

set_gpu([0, 2])

W twoim przypadku, aby używać tylko procesora, możesz wywołać funkcję z pustą listą :

set_gpu([])

Aby uzyskać kompletność, jeśli chcesz uniknąć sytuacji, w której inicjalizacja środowiska wykonawczego przydzieli całą pamięć na urządzeniu, możesz użyć tf.config.experimental.set_memory_growth. Wreszcie, funkcja zarządzania urządzeniami do wykorzystania, dynamicznie zajmującymi pamięć GPU, staje się:

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
źródło
0

Innym możliwym rozwiązaniem na poziomie instalacji byłoby poszukanie wariantu samego procesora: https://www.tensorflow.org/install/pip#package-location

W moim przypadku daje to teraz:

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

Po prostu wybierz odpowiednią wersję. Dodatkowe punkty za użycie venv, jak wyjaśniono np. W tej odpowiedzi .

Cadoiz
źródło