如何在 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的主要内容,如果未能解决你的问题,请参考以下文章