如何在 CPU 上运行 TensorFlow

Posted

技术标签:

【中文标题】如何在 CPU 上运行 TensorFlow【英文标题】:How to run Tensorflow on CPU 【发布时间】:2016-10-06 05:33:19 【问题描述】:

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

我在一个 GPU 服务器上,tensorflow 可以访问可用的 GPU。

我想在 CPU 上运行 tensorflow。

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

如何在 CPU 之间进行选择?

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

【问题讨论】:

【参考方案1】:

也可以设置环境变量为

CUDA_VISIBLE_DEVICES=""

无需修改源代码。

【讨论】:

有人说在训练阶段之后在 CPU 上运行神经网络的性能与在 GPU 上运行一样好——也就是说,只有训练短语真正需要 GPU。你知道这是不是真的?谢谢! @Crashalot:这不是真的。寻找各种干扰基准,那里的 CPU 也慢了一个数量级。 @Thomas 谢谢。关于要考虑哪些基准的建议?神经网络的工作量和性质可能也会有所不同,对吧?显然谷歌翻译应用程序直接在智能手机上运行一些神经网络,大概是在 cpu 上而不是 gpu 上? @fabrizioM,一个玩具例子会更有用。 这对我不起作用。 :/ 设置环境变量但是tensorflow仍然使用GPU,我用的是conda virtual env,这有区别吗?【参考方案2】:

如果上述答案不起作用,请尝试:

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

【讨论】:

只是为了记录,第一个选项似乎不再起作用了。 在使用 tf.keras.Sequential 模型时也适用于 tf 2.X。 有没有办法做到这一点,而无需 tensorflow 调用错误消息“CUDA_ERROR_NO_DEVICE:未检测到支持 CUDA 的设备”?【参考方案3】:

您可以根据tf.Session 应用device_count 参数:

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

另见 protobuf 配置文件:

tensorflow/core/framework/config.proto

【讨论】:

有人说在训练阶段之后在 CPU 上运行神经网络与在 GPU 上运行一样高效——也就是说,只有训练短语真正需要 GPU。你知道这是不是真的?谢谢! 这对我不起作用(tf1.1)。 fabrizioM 的解决方案可以。 使用CUDA_VISIBLE_DEVICES环境变量而不是更改代码中的配置不是更好吗? @Nandeesh 我想这取决于您的需求。到目前为止,至少有 53 人更喜欢环境变量,35 人更喜欢在代码中设置设备数量。第一个的优点是简单,另一个是从 python 程序本身内更明确地控制(多个)会话(零不需要硬编码,它可以是一个变量)。 你知道如何适应 tensorflow 2.0,因为没有更多的 session 或 configproto 吗?【参考方案4】:

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

【讨论】:

嗨,对我不起作用...我使用的是 tensorflow-gpu 2.4.1【参考方案5】:

环境变量解决方案不适用于我运行 tensorflow 2.3.1。我假设 github 线程中的 cmets 以下解决方案适用于 >=2.1.0 的版本。

来自tensorflow github:

import tensorflow as tf

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

确保在导入新的 tensorflow 实例后立即执行此操作(如果您正在运行 jupyter notebook,请重新启动内核)。

并检查您是否确实在 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)

【讨论】:

在一个脚本中使用 tensorflow 和 pytorch,这种方法可以帮助我在 tensorflow 上禁用 cuda,但仍然让 pytorch 使用 cuda。我相信这个答案值得更多的投票。 此解决方案的一个潜在优势是它不依赖于明确提及 CUDA 的变量,因此该变量可能保留给特定设备。例如,它适用于我的 Apple Silicon Mac。 最好的解决方案,谢谢(因为我也在硅上:D) 对我来说就像一个魅力。在 Jupyter 笔记本中,只需按照以下步骤操作(基于上述注释) - 重新启动内核 --> 将此行放在 tensorflow 下方: import tf.config.set_visible_devices([], 'GPU') --> 运行脚本 【参考方案6】:

只需使用下面的代码。

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

【讨论】:

【参考方案7】:

在我的情况下,对于 tensorflow 2.4.0,除非您安装 tensorflow-cpu,否则之前的答案都不起作用

pip install tensorflow-cpu

【讨论】:

这适用于 tensorflow 2.5。但是,我认为我的 tensorflow 2.5 的 GPU 在运行命令后在当前环境中不再可用。 **(我试过上面推荐的方法,还是不行) 如何将这个 tensorflow-cpu 与 tf.io.decode_image 一起使用?【参考方案8】:

安装级别的另一种可能的解决方案是寻找the CPU only variant

在我的情况下,现在给出:

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

只需选择正确的版本(在这种情况下,cp38 提示 python 3.8 - 此外,使用 Tensorflow 2.2.0,当前版本截至 2020 年 7 月 12 日)。 p>


使用 venv 的奖励积分如 this answer 中所述。

【讨论】:

【参考方案9】:

根据Tensorflow GPU guide 的建议。

# 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

【讨论】:

【参考方案10】:

1. Fabrizio 的回答对我有用:

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

我必须在导入 tensorflow 之前进行更改。 我正在使用张量流 2.4.0

2. 另一个(低于标准的)解决方案可能是重命名 gpu 计算所需的 cusolver64_10.dll 文件。由于tensorflow找不到dll,所以会自动占用CPU。

它应该在这样的地方: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

在某些系统中,必须指定:

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

在导入 tensorflow 之前。

【讨论】:

以上是关于如何在 CPU 上运行 TensorFlow的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow如何设置只在cpu上运行

代码如何在同步的单核CPU上异步?

我如何重新编译C#程序以在ARM CPU上运行?

linux内核调度算法--CPU时间片如何分配

linux内核调度算法--CPU时间片如何分配 转!

如何监视某一进程的CPU占用率