如何在 CPU 上运行 Tensorflow

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

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

我要在 CPU 上运行张量流。

通常我可以使用 env CUDA_VISIBLE_DEVICES=0运行在图形处理器号0。

如何在 CPU 之间进行选择?

我没有兴趣用 with tf.device("/cpu:0"):重写我的代码

241458 次浏览

您可以对每个 tf.Session应用 device_count参数:

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

另请参阅 Protobuf 配置文件:

tensorflow/core/framework/config.proto

你也可以把环境变量设定为

CUDA_VISIBLE_DEVICES=""

而不必修改源代码。

如果上面的答案不起作用,试试:

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

只是使用下面的代码。

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

对我来说,只有将 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

在某些系统中,人们必须具体说明:

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

在输入张量流之前。

你可以使用 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)

在安装级别上的另一个可能的解决方案是寻找 中央处理器的唯一变体

就我而言,这种情况现在就给出了答案:

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

只需选择正确的版本(在这种情况下,cp38提示 python 3.8-此外,使用 张量流2.2.0,当前版本为7月12日’20)。


使用像 这个答案中解释的 来吧的加分。

环境变量解决方案不适合我运行张量流程 abc 0。通过 github 线程中的注释,我假设下面的解决方案适用于 > = 2.1.0版本。

来自 张量流,张量流,张量流:

import tensorflow as tf


# Hide GPU from visible devices
tf.config.set_visible_devices([], 'GPU')

确保在导入带有 new tensorflow 实例的文件后立即执行此操作(如果您正在运行 jupyter 笔记本,请重新启动内核)。

为了检查你是否真的在 CPU 上运行:

# To find out which devices your operations and tensors are assigned to
tf.debugging.set_log_device_placement(True)


# Create some tensors and perform an operation
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
c = tf.matmul(a, b)


print(c)

预期产出:

2.3.1
Executing op MatMul in device /job:localhost/replica:0/task:0/device:CPU:0
tf.Tensor(
[[22. 28.]
[49. 64.]], shape=(2, 2), dtype=float32)

在我的例子中,对于张量流2.4.0,除非安装 tensorflow-cpu,否则前面的答案都不起作用

pip install tensorflow-cpu

根据 张量流图形处理器指南的建议。

# Place tensors on the CPU
with tf.device('/CPU:0'):
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
# Any additional tf code placed in this block will be executed on the CPU


法布里奇奥的回答对我很有效:

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

我必须在输入张量流之前做出改变。 我使用张量流2.4.0

2. 另一个(低于标准)解决方案可能是重命名 gpu 计算所需的 Cusolver64 _ 10. dll文件。由于张量流无法找到 dll,它将自动使用 CPU。

应该放在这样的地方: C: Program Files NVIDIA 图形处理器计算工具包 CUDA v11.2 bin

# this works on tensorflow 2.8, windows 10, jupyterlab Version 3.3.2
# this is the very FIRST lines of code


import tensorflow as tf


tf.config.set_visible_devices([], 'GPU')


# if tf.test.gpu_device_name(): # this lies and tells you about all devices
if tf.config.experimental.list_logical_devices('GPU'):
print('GPU found')
else:
print("No GPU found")

我花了太多时间想弄明白。 大多数尝试都会让进程部分地在 CPU 上运行,并且仍然加载到 GPU 内存中? ? 奇怪..。

首先运行上面的代码,然后再运行其他代码。

我能够增加我的隐藏后来从6k 到12k。 它现在正在运行,只使用中央处理器。 每个时代所花费的时间大约是 GPU 上的10倍。 从大约每个纪元3分钟到每个纪元35分钟多一点。 这是一个可以接受的权衡。培训时间与型号大小。