2

我有: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上的多?

4

2 回答 2

1

小心,没有使用catboost的经验,所以以下是从CUDA的角度

  • 数据传输内核(由主机调用的函数,例如 CPU,由设备(例如 GPU)执行)的启动需要数据从主机传输到设备。请参阅下图以了解数据大小的传输时间。默认情况下,内存是非固定的(使用cudaMalloc())。请参阅https://www.cs.virginia.edu/~mwb7w/cuda_support/pinned_tradeoff.html了解更多信息。在此处输入图像描述

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

于 2019-03-20T08:34:44.850 回答
1

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

于 2020-04-03T17:47:50.957 回答