最近训练网络时,有个cpu版本的loss,非常耗时,最后把它写成了cuda版,大大减少了训练所需要的开销,一起来对比下:
-
基本情况:
batch_size:1
channel:20
width:300
height:300
累积梯度次数:10
打印step:10
总iter数:25000 - 情况1:
模式:CPU
loss个数:1
一次前向传播则需要遍历1*20*300*300=180w
次,打印一次需要遍历180w*10*10=1亿8000万
次,打印耗时40
秒,训练完需要40*2500/3600≈27
个小时。 - 情况2:
模式:CPU
loss个数:5(深监督)
一次前向传播则需要遍历1*20*300*300=180w
次,打印一次需要遍历180w*10*10=1亿8000万
次,打印耗时86
秒,训练完需要90*2500/3600≈59
个小时。 - 情况3:
模式:GPU
loss个数:1
并行计算,打印耗时28
秒,训练完需要28*2500/3600≈19
个小时。 - 情况4:
模式:GPU
loss个数:5(深监督)
并行计算,打印耗时31
秒,训练完需要32*2500/3600≈21
个小时。
总结
我的CPU比较low,好一点的CPU情况会好很多(测试过我同学的电脑,cpu版:1个loss打印耗时25秒,5个loss时打印耗时47秒,她显卡2080ti)
,我的显卡是1080ti,可以看到并行计算耗时大大减少,尤其是有多个loss时,时间也从近2天半的时间降到不到1天的时间。此外一个好的CPU也是非常非常关键的。
附1:
cpu版5个loss:
gpu版5个loss:
附2:
开辟cuda中一维线性内存:
Dtype* ptr;
CUDA_CHECK(cudaMalloc(&ptr, size_))
释放cuda中内存:
CUDA_CHECK(cudaFree(ptr))
申请好ptr空间可以直接在__global__
的kernel
中使用,例如ptr[i]=1.0
网友评论