Как запустить Tensorflow на CPU

128

Я установил версию tensorflow для графического процессора на Ubuntu 14.04.

Я нахожусь на сервере графического процессора, где тензорный поток может получить доступ к доступным графическим процессорам.

Я хочу запустить тензорный поток на процессорах.

Обычно я могу использовать env CUDA_VISIBLE_DEVICES=0для работы на графическом процессоре нет. 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
Кто-то сказал, что запуск нейронных сетей на процессорах после фазы обучения так же эффективен, как и запуск их на графических процессорах, то есть только для обучающей фразы действительно нужен графический процессор. Вы знаете, правда ли это? Спасибо!
Crashalot 07
3
У меня это не работает (tf1.1). Решение фабрициоМ делает.
P-Gn
3
Не лучше ли использовать CUDA_VISIBLE_DEVICESпеременную окружения вместо изменения конфигурации в коде?
Nandeesh
3
@Nandeesh Думаю, это зависит от ваших потребностей. На данный момент есть как минимум 53 человека, которые больше разбираются в переменных среды, и 35 человек, которые предпочитают указывать количество устройств в коде. Преимущество первого - простота, а другого - более явный контроль над (множественными) сеансами из самой программы Python (этот ноль не обязательно жестко задавать, это может быть переменная).
Иван Аксаментов - Drop
1
@Crashalot это зависит от характера сети. Например, RNN могут быть быстрее на ЦП для небольших пакетов из-за своей последовательной природы. CNN по-прежнему выиграют от использования графического процессора в режиме вывода, но поскольку вам нужно запустить их только один раз для каждого примера, процессор может быть достаточно быстрым для многих практических целей.
Davidmh
174

Вы также можете установить для переменной среды значение

CUDA_VISIBLE_DEVICES=""

без изменения исходного кода.

fabrizioM
источник
3
Кто-то сказал, что запуск нейронных сетей на процессорах после фазы обучения так же эффективен, как и запуск их на графических процессорах, то есть только для обучающей фразы действительно нужен графический процессор. Вы знаете, правда ли это? Спасибо!
Crashalot 07
13
@Crashalot: Это неправда. Поищите различные тесты на предмет помех, CPU там тоже на порядок медленнее.
Thomas
1
@ Томас, спасибо. предложения по каким критериям рассматривать? вероятно, также зависит от нагрузки и характера нейронных сетей, не так ли? очевидно, что приложение Google Translate запускает некоторые нейронные сети непосредственно на смартфонах, предположительно на процессоре, а не на графическом процессоре?
Crashalot
@fabrizioM, полезнее будет игрушечный пример.
Girishkumar 08
8
У меня это не сработало. : / установить переменную среды, но тензорный поток по-прежнему использует графический процессор, я использую виртуальную среду conda, имеет ли это значение?
Гильерме де Лазари
102

Если приведенные выше ответы не работают, попробуйте:

os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Аравинд Куппусами
источник
4
Спасибо, это намного лучше, чем другие варианты.
user1098761
Кстати, первый вариант, похоже, больше не работает.
agcala 05
Также работает с 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"

ПЕРЕД импортом tensorflow.

Фабрицио
источник
0

Вы могли бы использовать tf.config.set_visible_devices. Одна из возможных функций, которая позволяет вам установить, какие графические процессоры использовать, и

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. Наконец, функция управления используемыми устройствами, динамически занимающая память графического процессора, становится следующей:

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

Просто выберите правильную версию. Бонусные баллы за использование Venv, как описано, например, в этом ответе .

Cadoiz
источник