gpt4 book ai didi

python - 将数据复制到 GPU 时 Theano 性能问题

转载 作者:行者123 更新时间:2023-11-28 18:34:39 25 4
gpt4 key购买 nike

我在尝试使用 theano 和 lasagne 训练深度卷积神经网络时遇到了一些性能问题。我做了一些实验来调查它们来自哪里。我发现的一件事是,将一批图像从主内存加载到 GPU 需要很长时间。这是说明问题的最小示例。它只是计算在批量大小为 1、2、4、8、16 的批量图像上评估 theano 身份函数所需的时间,...我正在处理大小为 448x448 的 RGB 图像。

import numpy as np
import theano
import theano.tensor as T
import time

var = T.ftensor4('inputs')
f = theano.function([var], var)

for batchsize in [2**i for i in range(6)]:
X = np.zeros((batchsize,3,448,448), dtype=np.float32)
print "Batchsize", batchsize
times = []
start = time.time()
for i in range(1000):
f(X)
times.append(time.time()-start)
start = time.time()
print "-> Function evaluation takes:", np.mean(times), "+/-", np.std(times), "sec"

我的结果如下:

Batchsize 1
-> Function evaluation takes: 0.000177580833435 +/- 2.78762612138e-05 sec
Batchsize 2
-> Function evaluation takes: 0.000321553707123 +/- 2.4221262933e-05 sec
Batchsize 4
-> Function evaluation takes: 0.000669012069702 +/- 0.000896798280943 sec
Batchsize 8
-> Function evaluation takes: 0.00137474012375 +/- 0.0032982626882 sec
Batchsize 16
-> Function evaluation takes: 0.176659427643 +/- 0.0330068803715 sec
Batchsize 32
-> Function evaluation takes: 0.356572513342 +/- 0.074931685704 sec

请注意,当批处理大小从 8 增加到 16 时,因子增加了 100。这是正常现象还是我遇到了某种技术问题?如果是这样,你知道它可能来自哪里吗?任何帮助表示赞赏。如果您运行代码片段并报告您看到的内容,这也会有所帮助。

编辑:Daniel Renshaw 指出这可能与主机 GPU 复制无关。问题可能来自哪里的任何其他想法?更多信息:

函数的 theano 调试打印显示

DeepCopyOp [@A] 'inputs'   0
|inputs [@B]

theano 分析的输出:

Function profiling                                                      
==================
Message: theano_test.py:14
Time in 6000 calls to Function.__call__: 3.711728e+03s
Time in Function.fn.__call__: 3.711528e+03s (99.995%)
Time in thunks: 3.711491e+03s (99.994%)
Total compile time: 6.542931e-01s
Number of Apply nodes: 1
Theano Optimizer time: 7.912159e-03s
Theano validate time: 0.000000e+00s
Theano Linker time (includes C, CUDA code generation/compiling): 8.321500e-02s
Import time 2.951717e-02s

Time in all call to theano.grad() 0.000000e+00s
Class
---

<% time> <sum %> <apply time> <time per call> <type> <#call> <#apply> <Class name>
100.0% 100.0% 3711.491s 6.19e-01s C 6000 1 theano.compile.ops.DeepCopyOp
... (remaining 0 Classes account for 0.00%(0.00s) of the runtime)

Ops
---
<% time> <sum %> <apply time> <time per call> <type> <#call> <#apply> <Op name>
100.0% 100.0% 3711.491s 6.19e-01s C 6000 1 DeepCopyOp
... (remaining 0 Ops account for 0.00%(0.00s) of the runtime)

Apply
------
<% time> <sum %> <apply time> <time per call> <#call> <id> <Apply name>
100.0% 100.0% 3711.491s 6.19e-01s 6000 0 DeepCopyOp(inputs)
... (remaining 0 Apply instances account for 0.00%(0.00s) of the runtime)

INFO (theano.gof.compilelock): Waiting for existing lock by process '3642' (I am process '22124')
INFO (theano.gof.compilelock): To manually release the lock, delete /home/bal8rng/.theano/compiledir_Linux-3.16--generic-x86_64-with-debian-jessie-sid-x86_64-2.7.10-64/lock_dir

THEANO_FLAGS:floatX=float32,device=gpu,optimizer_including=conv_meta,mode=FAST_RUN,blas.ldflags="-L/usr/lib/openblas-base -lopenblas",device=gpu3,assert_no_cpu_op=raise

最佳答案

您的计算几乎可以肯定不是在 GPU 上运行!只要您使用标准 configuration flags ,Theano 的优化器足够聪明,可以看到实际上没有执行任何操作,因此它不会在编译计算中添加任何“将数据移至 GPU”和“将数据从 GPU 移回”操作。您可以通过在 f = theano.function([var], var) 行之后添加以下行来看到这一点。

theano.printing.debugprint(f)

如果您想了解将数据移入和移出 GPU 的开销,Theano 的内置 profiling tools 可能更适合您。 .打开分析,然后在输出中查看在 GpuFromHostHostFromGpu 操作上花费了多少时间。当然,这必须通过更有意义的计算来完成,其中数据确实需要四处移动。

但是,奇怪的是您得到了您所做的结果。如果计算确实在 CPU 上运行,我仍然不希望看到随着批处理大小的增加而出现这样的阶跃变化。如果您在 GPU 上实际运行计算时没有继续看到相同的行为,那么您可能对此没什么兴趣。

顺便说一句,运行你的代码(尽管配置中有 device=gpu,但在我的服务器上实际上运行在 CPU 上,如上所述)我没有得到同样巨大的步骤变化;我的时间乘数是 2.6、1.9、4.0、3.9、2.0(即时间增加了 2.6 的倍数,从批量大小 = 1 到批量大小 = 2,等等)

关于python - 将数据复制到 GPU 时 Theano 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33634763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com