为什么 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
我有: 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