向GPU发送大图像时间

M.e*_*.es 5 optimization lua gpu image-processing torch

我正在使用在Tora中使用Torch进行图像处理的CNN模型(AlexNet)。我正在修改Torch入门代码

我的问题是,我要用18个通道而不是3个通道来制作图像以训练模型,并且将这些图像发送到GPU时,要比使用3个通道发送图像的时间多20倍(每批次2.13 s)(每批0.14s)。我还试图查看将具有4个通道的图像发送到GPU所需的时间。我看到,一旦频道数量增加到3个以上,时间就会增加20倍左右。例如,即使对于具有4个通道的图像,每批也要花费2秒钟的时间,这比运行3个通道的图像大约多19倍。

我想知道是否有一个导致花费这么多时间的错误,是否没有任何错误,是否有办法减少运行时间?

Pan*_*hin 1

简答

这是一个不会消失的问题。这是 CPU 到 GPU 缓冲的带宽问题。您已经将必须通过总线发送的数据量增加了很大一个因素。

可能的解决方法

您想要做的本质是在模型中包含先前的帧。如果这就是您想要实现的目标,那么还有另一种方法可以实现。

如果训练批次不是随机选择的堆叠图像,而是训练批次是常规图像但在时间上都是连续的。

在第二种情况下,您只需发送 3 个通道的图像,但图像不会乱序。

让我们来探讨一下这个假设。

首先,您仍然可以通过更改每个批次的开始时间和结束时间来创建随机采样,并随机选择要选择的视频。

其次,您可以使用 [batch,height,weight,channel] 张量在 GPU 上生成一个新张量,即

[ batch[1:], height, width, channel] - [ batch[:-1], height, width, channel]
and assign it to diffTensor 
Run Code Online (Sandbox Code Playgroud)

然后连接以下张量

origTensor [ batch[5:-0], height, width, channel] 
diffTensor [ batch[5:-0], height, width, channel] 
diffTensor [ batch[4:-1], height, width, channel] 
diffTensor [ batch[3:-2], height, width, channel] 
diffTensor [ batch[2:-3], height, width, channel] 
diffTensor [ batch[1:-4], height, width, channel] 
diffTensor [ batch[0:-5], height, width, channel] 
Run Code Online (Sandbox Code Playgroud)

如果你想要5次“回顾”

这会达到什么目的呢?好吧,如果您向 GPU 发送 100 个图像,那么该网络将能够以仅发送 100 个图像的网络价格生成 95 个图像+diff 图像,而就好像您尝试发送 5 层的 95 个图像+diff 图像一样每次您都必须支付发送 500 张图像的网络费用。基本上您可以将网络成本降低 5 倍