如何在CPU上运行Tensorflow


128

我已经在Ubuntu 14.04上安装了GPU版本的tensorflow。

我在GPU服务器上,张量流可以访问可用的GPU。

我想在CPU上运行tensorflow。

通常我可以env CUDA_VISIBLE_DEVICES=0在GPU号上运行。0。

我该如何在CPU之间进行选择?

我不喜欢重新编写我的代码 with tf.device("/cpu:0"):

Answers:


115

您可以device_counttf.Session以下方式应用参数:

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

另请参阅protobuf配置文件:

tensorflow/core/framework/config.proto


2
有人说,在训练阶段之后在CPU上运行神经网络的效率与在GPU上运行神经网络的效率相同-即,只有训练短语才真正需要GPU。你知道这是真的吗?谢谢!
Crashalot

3
这对我不起作用(tf1.1)。FabrizioM的解决方案可以做到。
P-Gn

3
使用CUDA_VISIBLE_DEVICES环境变量而不是更改代码中的配置不是更好吗?
Nandeesh

3
@Nandeesh我想这取决于您的需求。到目前为止,至少有53个人更喜欢环境变量,还有35个人更喜欢在代码中设置设备数量。第一个优点是简单,第二个优点是可以从python程序本身对(多个)会话进行更显式的控制(硬编码不必为零,它可以是变量)。
伊万·阿克萨门托夫

1
@Crashalot取决于网络的性质。例如,由于小批量的顺序性,RNN在CPU上可以更快。CNN仍将受益于推理模式下的GPU,但是由于每个示例只需要运行一次,因此CPU 可能足够快,可以用于许多实际用途。
Davidmh'9

174

您还可以将环境变量设置为

CUDA_VISIBLE_DEVICES=""

无需修改源代码。


3
有人说,在训练阶段之后在CPU上运行神经网络的性能与在GPU上运行神经网络的性能相同-即,只有训练短语才真正需要GPU。你知道这是真的吗?谢谢!
Crashalot

13
@Crashalot:这是不正确的。寻找各种干扰基准,CPU在那里也要慢一个数量级。
托马斯

1
@Thomas谢谢。关于考虑哪些基准的建议?可能还取决于神经网络的工作量和性质,对吗?显然,谷歌翻译应用程序直接在智能手机上运行一些神经网络,大概是在CPU而不是GPU上?
Crashalot

@fabrizioM,一个玩具示例会更有用。
Girishkumar

7
这对我不起作用。:/设置环境变量,但是tensorflow仍然使用GPU,我使用的是conda虚拟环境,这有什么区别吗?
Guilherme de Lazari


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个GPU的系统上,你希望只使用两个GPU,在一个具有id = 0和一个有id = 2,那么你的代码的第一个命令,导入库后,将是:

set_gpu([0, 2])

对于您的情况,仅使用CPU,可以使用一个空列表调用该函数

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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.