我有: 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.838074444524487
CPU培训时间:0.43390488624572754
为什么在gpu上的训练时间比在cpu上的训练时间长?
答案 0 :(得分:1)
请注意,没有Catboost经验,因此以下内容是从CUDA角度来看的
数据传输内核的启动(由主机(例如CPU)调用的功能,由设备(例如GPU)执行的功能)要求将数据从主机传输到设备。请参见下图,以了解有关数据大小的传输时间。默认情况下,内存是非固定的(使用 cudaMalloc())。有关更多信息,请参见https://www.cs.virginia.edu/~mwb7w/cuda_support/pinned_tradeoff.html。
内核启动开销。每次主机调用内核时,主机都会将内核排队到设备的工作队列中。即,对于每次迭代,主机实例化内核,并将其添加到队列中。在引入CUDA graph之前(这还指出,当内核执行时间短时,内核启动开销可能会很大),无法避免每次内核启动的开销。我不知道 catboost 如何处理迭代,但是鉴于执行时间之间的差异,看来并没有解决启动开销(IMHO)
答案 1 :(得分:1)
Catboost对小型数据集(行<50k或列<10)使用了一些不同的技术,可减少过拟合的情况,但会花费更多时间。尝试使用巨大的数据集进行训练,例如Epsilon数据集。参见github https://github.com/catboost/catboost/issues/505