【问题标题】:Why is this Python script running faster in the CPU than in the GPU?为什么这个 Python 脚本在 CPU 中比在 GPU 中运行得更快?
【发布时间】: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


【解决方案1】:

根据this paper on somoclu 中的图 5,GPU 速度更快。但是,该论文没有显示广泛的基准测试。我只能建议,对于您的机器,CPU 更强大。但是您可以研究论文以进行更相似的测试以进行比较。

为确保结果的可复制性,我们公开了基准 Amazon Web Services 提供的可用集群 GPU 实例。这 实例类型为 cg1.4xlarge (https://aws.amazon.com/ec2/instance-types/),配备 22 GiB 内存、两个 IntelXeon X5570 四核 CPU 和两个 NVIDIA Tesla M2050 GPU,运行 Ubuntu 12.04。

(16) Somoclu:用于自组织地图的高效并行库,可从: https://www.researchgate.net/publication/236635216_Somoclu_An_Efficient_Parallel_Library_for_Self-Organizing_Maps

您的 CPU 和 GPU 似乎都比 AWS 基准更强大。

【讨论】:

  • 我在我的 PC 上运行了相同的模拟,并得到了与问题相同的结果(CPU 优于 GPU)。唯一可能不一样的是迭代次数,因为据我所知,论文中没有说明。但 mapsize 和输入数据的尺寸是相同的(分别为 50x50 和 1000)。
猜你喜欢
  • 2022-01-19
  • 2019-11-01
  • 1970-01-01
  • 2019-12-11
  • 2019-06-18
  • 1970-01-01
  • 2012-11-24
  • 2022-06-29
相关资源
最近更新 更多