sklearn支持gpu_为什么sklearn在CPU上比在GPU上更快?

我比较了使用Python的ano(CPU)、theano(GPU)和scikitlearn(CPU)的处理时间。

但是,我得到了奇怪的结果。

看我画的图。在

处理时间比较:

您可以看到scikit learn的结果,它比atano(GPU)更快。

我检查它的运行时间的程序是从一个有n*40个元素的矩阵计算欧几里德距离矩阵。在

这是代码的一部分。在points = T.fmatrix("points")

edm = T.zeros_like(points)

def get_point_to_points_euclidean_distances(point_id):

euclideans = (T.sqrt((T.sqr(points- points[point_id, : ])).sum(axis=1)))

return euclideans

def get_EDM_CPU(points):

EDM = np.zeros((points.shape[0], points.shape[0])).astype(np.float32)

for row in range(points.shape[0]):

EDM[row, :] = np.sqrt(np.sum((points - points[row, :])**2, axis=1))

return EDM

def get_sk(points):

EDM = sk.pairwise_distances(a, metric='l2')

return EDM

seq = T.arange(T.shape(points)[0])

(result, _) = theano.scan(fn = get_point_to_points_euclidean_distances, \

outputs_info = None , \

sequences = seq)

get_EDM_GPU = theano.function(inputs = [points], outputs = result, allow_input_downcast = True)

我想GPU比sci工具包学习慢的原因可能是转移时间。所以我用nvprof命令分析了GPU。然后我得到了这个。在

^{pr2}$

传输[CUDA memcpy DtoH]执行了两次{ 1.248 [us], 131.38 [ms] }

转移[CUDA memcpy HtoD]进行了5x{ min: 640 [ns], max: 250.36 [us] }

传输时间约为131.639ms(131.88ms+259.73us)。

但是GPU和scikit learn之间的差距大约是700ms(1.8s-1.1s),因此,这个差距是在传输时间上的。在

它只计算对称矩阵的上三角矩阵吗?在

是什么让scikit学得这么快?在

你可能感兴趣的:(sklearn支持gpu)