Як запустити Tensorflow на процесорі


128

Я встановив GPU версію tensorflow на Ubuntu 14.04.

Я перебуваю на сервері GPU, де tensorflow може отримати доступ до наявних GPU.

Я хочу запустити tensorflow на процесорах.

Зазвичай я можу використовувати env CUDA_VISIBLE_DEVICES=0для запуску на GPU ні. 0.

Як я можу замість цього вибрати між процесорами?

Я не втручаюся в переписування свого коду with tf.device("/cpu:0"):

Відповіді:


116

Ви можете застосувати device_countпараметр для tf.Session:

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

Дивіться також конфігураційний файл protobuf:

tensorflow/core/framework/config.proto


2
Хтось сказав, що запуск нейронних мереж на процесорах після тренувального етапу є настільки ж ефективним, як і запуск їх на графічних процесорах - тобто, лише тренувальна фраза дійсно потребує GPU. Чи знаєте ви, чи це правда? Дякую!
Crashalot

3
Це не працює для мене (tf1.1). Розчин фабризіоМ робить.
P-Gn

3
Чи не краще використовувати CUDA_VISIBLE_DEVICESзмінну середовища, а не змінювати конфігурацію в коді?
Нандееш

3
@Nandeesh Я думаю, це залежить від ваших потреб. Наразі є щонайменше 53 людини, які більше відчувають змінні середовища і 35, які вважають за краще встановлювати кількість пристроїв у коді. Перевагою першого є простота, а інша - більш чіткий контроль над (декількома) сеансами всередині самої програми python (що нуль не потрібно жорстко кодувати, він може бути змінною).
Іван Аксаментов - Крап

1
@Crashalot це залежить від характеру мережі. Наприклад, RNN можуть бути швидшими на процесорах для невеликих розмірів партії через свою послідовну природу. CNN все одно отримає користь від GPU в режимі виводу, але оскільки вам потрібно запускати їх лише один раз на приклад, процесор може бути досить швидким для багатьох практичних цілей.
Davidmh

174

Ви також можете встановити змінну середовища на

CUDA_VISIBLE_DEVICES=""

не змінюючи вихідний код.


3
Хтось сказав, що запуск нейронних мереж на процесорах після тренувального етапу є настільки ж ефективним, як і запуск їх на графічних процесорах. Чи знаєте ви, чи це правда? Дякую!
Crashalot

13
@Crashalot: Це неправда. Шукайте різні орієнтири для втручання, процесори там на порядок повільніші.
Томас

1
@Thomas спасибі пропозиції, які орієнтири слід врахувати? ймовірно, також залежить від завантаженості та характеру нейронних мереж, правда? очевидно, додаток google translate запускає деякі нейронні мережі безпосередньо на смартфонах, імовірно, на процесорі, а не на gpu?
Crashalot

@fabrizioM, приклад іграшки буде кориснішим.
Гіришкумар

7
Це для мене не вийшло. : / встановити змінну середовища, але tensorflow все ще використовує GPU, я використовую conda virtual env, чи це робить різницю?
Гільгерме де Лазарі

102

Якщо наведені вище відповіді не спрацюють, спробуйте:

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

4
Дякую, це набагато краще, ніж інші варіанти.
користувач1098761

Що стосується запису, перший варіант, здається, вже не працює.
agcala

Працює також для tf 2.X при використанні tf.keras.Sequentialмоделей.
Ніколас М.

22

Для мене, тільки установка CUDA_VISIBLE_DEVICESточно -1працює:

Працює:

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

Хто НЕ працює:

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

Просто використовуючи наведений нижче код.

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

0

У деяких системах потрібно вказати:

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

ПЕРЕД Імпорт тенсорфлоу.


0

Ви можете використовувати tf.config.set_visible_devices. Однією з можливих функцій, яка дозволяє встановити, чи і які GPU використовувати:

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)

Припустимо, ви перебуваєте в системі з 4 графічними процесорами, і ви хочете використовувати лише два графічні процесори, один з id = 0і один з id = 2, тоді першою командою вашого коду, відразу після імпорту бібліотеки, буде:

set_gpu([0, 2])

У вашому випадку, щоб використовувати лише центральний процесор, ви можете викликати функцію з порожнього списку :

set_gpu([])

Для повноти, якщо ви хочете уникнути, що ініціалізація виконання буде виділяти всю пам'ять на пристрої, ви можете використовувати tf.config.experimental.set_memory_growth. Нарешті, функцією управління, якими пристроями користуватися, динамічно займаючи пам'ять GPU, стає:

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

Іншим можливим рішенням на рівні встановлення буде пошук варіанту лише для процесора: https://www.tensorflow.org/install/pip#package-location

У моєму випадку це дає зараз:

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

Просто виберіть правильну версію. Бонусні бали за використання ВЕНВ, як пояснено, наприклад, у цій відповіді .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.