Как запустить 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=""

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


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, как описано, например, в этом ответе .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.