为什么 CPU 的学习速度比 GPU 慢

Why is learning at CPU slower than at GPU

我有: GPU:GeForce RTX 2070 8GB。 CPU : AMD Ryzen 7 1700 八核处理器。 内存:32GB。 驱动程序版本:418.43。 CUDA 版本:10.1。 在我的项目中,gpu 也比 cpu 慢。但现在我将使用文档示例。

from catboost import CatBoostClassifier
import time

start_time = time.time()

train_data = [[0,3],
          [4,1],
          [8,1],
          [9,1]]
train_labels = [0,0,1,1]

model = CatBoostClassifier(iterations=1000, task_type = "CPU/GPU")
model.fit(train_data, train_labels, verbose = False)

print(time.time()-start_time)

GPU 训练时间:4.838074445724487

cpu 的训练时间:0.43390488624572754

为什么 gpu 上的训练时间比 cpu 多?

小心,没用过catboost,所以下面是从CUDA的角度来看的

  • 数据传输内核的启动(主机调用的函数,例如CPU,由设备执行,例如GPU)需要数据从主机传输到设备。请参见下图以了解数据大小的传输时间。默认情况下,内存是非固定的(使用 cudaMalloc())。参见 https://www.cs.virginia.edu/~mwb7w/cuda_support/pinned_tradeoff.html to find out more.

  • 内核启动开销 主机每次调用内核时,都会将内核排入设备的工作队列。即对于每次迭代,主机实例化一个内核,并添加到队列中。在引入 CUDA graph(这也指出当内核执行时间短时内核启动开销可能很大)之前,每次内核启动的开销都无法避免。我不知道 catboost 如何处理迭代,但鉴于执行时间之间的差异,它似乎没有解决启动开销(恕我直言)

Catboost 对小型数据集(行<50k 或列<10)使用了一些不同的技术来减少过度拟合,但需要更多时间。尝试使用巨大的数据集进行训练,例如 Epsilon 数据集。见 github https://github.com/catboost/catboost/issues/505