如何在CPU上运行Tensorflow

时间:2016-06-06 14:41:56

标签: python tensorflow

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

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

我想在CPU上运行tensorflow。

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

如何在CPU之间进行选择?

我不想用with tf.device("/cpu:0"):

重写我的代码

11 个答案:

答案 0 :(得分:140)

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

CUDA_VISIBLE_DEVICES=""

无需修改源代码。

答案 1 :(得分:95)

您可以按display: flex

应用$item->set*()参数
device_count

另见protobuf配置文件:

tensorflow/core/framework/config.proto

答案 2 :(得分:54)

如果上述答案无效,请尝试:

os.environ['CUDA_VISIBLE_DEVICES'] = ''

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

答案 3 :(得分:10)

对我来说,仅将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 :(得分:3)

只需使用以下代码。

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

答案 5 :(得分:1)

环境变量解决方案不适用于运行tensorflow 2.3.1的我。我认为通过github线程中的注释,以下解决方案适用于版本> = 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)

答案 6 :(得分:1)

按照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

答案 7 :(得分:0)

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

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

在导入张量流之前。

答案 8 :(得分: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,一个GPU使用id = 0,另一个GPU使用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)

答案 9 :(得分:0)

在安装级别上的另一种可能的解决方案是寻找仅CPU的变体:https://www.tensorflow.org/install/pip#package-location

以我为例,现在给出:

// [[Rcpp::plugins(openmp)]]
// [[Rcpp::export]]
Rcpp::List func1(const arma::vec & x, const arma::vec & y){

    #pragma omp parallel proc_bind(spread) num_threads(2) 
    {
      #pragma omp for  
      for(int i = 0; i < n; i++){    // for-loop 1
        some calculation
      }
    
      #pragma omp for 
      for(int i = 0; i < n; i++){   // for-loop 2
        some calculation
      }
    }

return Rcpp::List::create(Rcpp::Named("variable 1") = v1,
                          Rcpp::Named("variable 2") = v2);
}

只需选择正确的版本。像使用this answer中所述的使用venv的奖励积分。

答案 10 :(得分:0)

对于我来说,对于tensorflow 2.4.0,除非您安装tensorflow-cpu

pip install tensorflow-cpu