【发布时间】:2019-02-14 09:21:58
【问题描述】:
我正在使用 Python 的库 somoclu 来训练使用 Python 的自组织地图。该库允许用户在 CPU(Intel Core i7-8700)或 GPU(GeForce GTX 1080 Ti)上执行训练。
我注意到 CPU 运行脚本的速度比 GPU 快,因此我运行了不同数据点数量和地图大小的扫描,以查看 GPU 是否在某个时间点优于 CPU。这是脚本:
import numpy as np
import somoclu
import time
m = 3 # Number of dimensions
points = [5000, 30000, 80000, 150000, 300000] # Number of datapoints
iterMax = 200 # Max number of iterations
mapSize = [4, 32, 64, 128] # Dimensions of SOM
np.random.seed(0)
#%% SOM
for n in points:
for size in mapSize:
y = np.random.rand(n,m) # Input data
# With CPU
t = time.clock() # Start time
som = somoclu.Somoclu(size,
size,
compactsupport = False,
kerneltype = 0)
som.train(y.astype(np.float32), epochs = iterMax)
elapsedTime = time.clock() - t
# With GPU
t = time.clock() # Start time
som = somoclu.Somoclu(size,
size,
compactsupport = False,
kerneltype = 1)
som.train(y.astype(np.float32), epochs = iterMax)
elapsedTime = time.clock() - t
我将时间保存在 CSV 中,这就是我得到的:
CPU GPU
2.7632589999999997 5.935387999999999
60.340638 82.796062
228.292085 305.75625900000006
861.3243 1141.331934
11.692982999999913 24.568256999999903
330.17140100000006 443.82112400000005
1354.677431 1749.3110039999992
5559.308704 6990.034151000002
29.3726179999976 47.36881999999969
913.3250950000001 1163.5942189999987
3703.653313999999 4615.292857
14868.418703000003 18635.051464000004
37.40133600000263 68.64375999999902
1699.020611 2141.047305
6925.692426000009 8645.564134
27887.844171999997 illegal memory access was encountered
如您所见,在每种情况下,CPU 的性能都优于 GPU(此外,在运行具有 150000 个数据点和 64x64 地图的脚本时,GPU 版本会崩溃)。这怎么可能?那么使用 GPU 训练 SOM 有什么优势呢?
编辑:
我在 R 中尝试了相同的库,在这种语言中,GPU 的性能优于 CPU。所以显然只是一个 Python 问题,但我不是编程专家,无法弄清楚发生了什么。我相信内核运行是一样的,所以只是接口发生了变化。让我们看看这是否有助于人们找出为什么在 Python 中 CPU 比 GPU 运行得更快。
【问题讨论】:
-
脚本中涉及的并行度是多少?
-
@abc 我不确定我能否回答这个问题。我只是使用提到的库,我的特定脚本如图所示简单。我相信 somoclu 的函数内部涉及并行性,用户无法控制它。
-
我认为这与这里无关,但
time.clock是对代码进行基准测试的不好方法。如果可以使用timeit,就使用它;如果你做不到,你必须自己做大部分事情(包括使用正确的时钟,很少是clock,禁用GC等)。 -
同时,我对这个库一无所知,但
iterMax=200是一个合理的值,还是一个非常小的值,或者......? -
这就是为什么我说“我认为这与这里无关”。当人们发布问题询问为什么一个函数需要 117ns 而另一个函数需要 141ns 并且他们使用
clock来计时一次迭代时,答案通常只是“不要使用clock”,但是当你在说话时大约 3 秒以上的工作循环,通常不是。但是,做正确的事总比做错的事并认为它可能没问题要好。
标签: python parallel-processing gpu self-organizing-maps