2016-07-27 79 views
0

我写了下面的代码,以评估的Python多的效果,而使用TensorFlow:TensorFlow和Python多处理

import tensorflow as tf 
from multiprocessing import Process 

mydevice = "/gpu:0" 

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.01) 

mrange = 1000 

def myfun(): 
    with tf.device(mydevice): 
    mm1 = tf.constant([[float(i) for i in range(mrange)]],dtype='float32') 
    mm2 = tf.constant([[float(i)] for i in range(mrange)],dtype='float32') 

    with tf.device(mydevice): 
     prod = tf.matmul(mm1,mm2) 

    sess = tf.Session(config=tf.ConfigProto(log_device_placement=True,gpu_options=gpu_options)) 
    rest = sess.run(prod) 

    print rest 
    sess.close() 

ll = [] 
for i in range(100): 
    p1 = Process(target=myfun) 
    p1.start() 
    ll.append(p1) 

for item in ll: 
    item.join() 

在我的笔记本电脑的GPU运行这段代码所需的时间:〜6秒

如果我改变了设备CPU:〜6秒

如果我删除多,并调用该函数串行:75秒

可能有人请expla如果我在设备设置为GPU时使用多处理功能会发生什么情况。很明显,将会推出多个CUDA内核,但它们将在GPU中同时运行吗?

这只是一个实验,看看我是否可以在GPU上启动多个RNN。

回答

3

GPU主要用于渲染2D和3D计算机图形。这涉及很多数字处理,可以从并行算法中受益。深度学习还涉及大量并行数字处理,因此加速图形的相同硬件也可加速深度学习。

GPU与CPU的不同之处在于它针对高度并行的数字运算进行了优化。查看任何Nvidia GPU的规格,您将看到一个名为CUDA Cores的指标。这个数字通常在数千个范围内(或者对于较弱的GPU来说为数百个)。单个CUDA内核比标准CPU内核要弱很多,但由于您拥有如此之多的GPU,可以为并行任务大幅度执行CPU。该架构实际上非常复杂,您可以阅读有关如何进入CUDA编程的信息。看看这篇文章。 https://en.wikipedia.org/wiki/General-purpose_computing_on_graphics_processing_units

从你张贴的数字我猜你有一个弱的笔记本电脑的GPU,所以这就是为什么它执行大约相同的CPU。在我的台式机上,我拥有新的GTX 1080,它可以超过20倍的CPU。我感到惊讶的是,当你连续打电话时,你的数字会上升很多,但我认为还有其他的事情发生,因为我甚至不知道如何用tensorflow来做这件事。

0

Fermi及更高版本的GPU支持通过TensorFlow使用的CUDA流执行并发内核。因此,只要CUDA运行时认为有利于独立操作,即使它们位于同一图形中,即可通过单个线程上的单个sess.run调用来启动独立操作。