赞
踩
答:GPU在使用过程的开始,需要进行CUDA初始化(CUDA initialization),CUDA 初始化过程是一个"懒惰"的初始化,这意味着需要完成足够的初始化进程,才能支持所要的操作执行。在首次CUDA初始化时,有些初始化间接花费(cost)并没有进行,这些花费(cost)可以理解为设备和主机内存映射的协调,即内存的调度,这也是cpu和gpu都会有一定的内存(gpu为显存)变化的原因。表现出来的是虽然gpu的核心性能不如cpu,但是加载速度要和cpu持平,这意味着所需的表面上时间可能更短。这些初始化间接操作花费(cost)可能被吸收到操作中,而一些额外的初始化间接花费(cost)可能被吸收到后续操作中。
代码:
if __name__=='__main__': image=cv2.imread('./images/0.jpg') t_all1 = 0 t_start = time.time() model_classify = ModelPipline() t_end = time.time() t_all1 += t_end - t_start print("加载模型时间:{}".format(t_all1)) t_all2 = 0 t_start = time.time() result = model_classify.predict(image) t_end = time.time() t_all2 += t_end - t_start print("第一次推理时间:{}".format(t_all2)) t_all = 0 for i in range(100): # 随机生成图片 image = np.random.randint(0, 255, size=(224, 224, 3), dtype=np.uint8) t_start = time.time() result = model_classify.predict(image) t_end = time.time() t_all += t_end - t_start print("测试随机图片循环一百次时间:{}".format(t_all))
cpu推理速度:
gpu推理速度:
这是为什么后续的推理速度要远远小于第一次推理速度的原因。在首次推理过程中,仍然进行部分额外的初始化间接花费,需要消耗一定的时间,而后续在进行推理的时候,初始化已经完成,不再需要额外的时间消耗。
答:和CPU相比,GPU包含的更多是并行处理,即同时处理多个数据,而在我们的测试中,我们一次只输入一张图片,这时候如果查看显卡占用率(warps单元使用较少)的话,会发现占用率很低,这时候就很难发挥GPU的优势,假如同样100张图片,我们每次输出20张做为一个batch(显卡允许的情况下),这时候在看此时的显卡占用率,会发现它变高了,同时也会发现,运行速度要快了很多,这是因为20张图片是在同一时间进行并行计算的。
综上所述,我们可以发现使用GPU做深度学习的优势所在,在拥有高算力的设备的情况下,出现需要大规模的数据输入的时候,可以通过提高同时输入数据的数量,利用GPU的高并发计算,可以大幅度缩减计算时间,提高计算效率。
涉及到CUDA编程的底层知识,后续需要系统学习。
参考:
CUDA初始化
CUDA第一次计算耗时
GPU利用率
GPu比CPU慢的原因
GPU并行处理
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。