将大图像时间发送到 GPU

Posted

技术标签:

【中文标题】将大图像时间发送到 GPU【英文标题】:Sending large images time to the GPU 【发布时间】:2017-11-18 05:20:39 【问题描述】:

我正在使用在 Lua 中实现的 CNN 模型 (AlexNet),使用 Torch 进行图像处理。我正在修改Torch starter code。

我的问题是我正在制作具有 18 个通道而不是 3 个通道的图像来训练模型,并且将这些图像发送到 GPU,它需要大约 20 倍(每批 2.13 秒)比发送图像时多三个通道(每批 0.14 秒)。我还尝试查看将具有 4 个通道的图像发送到 GPU 需要多长时间。我看到频道数一增加到3个频道以上,时间就增加了20倍左右。例如,即使是 4 通道的图像,每批大约需要 2 秒,这比运行 3 通道图像要多 19 倍左右。

我想知道是否有一个错误导致它需要这么长时间,如果没有任何错误,是否有什么方法可以减少这个运行时间?

【问题讨论】:

你在启动代码中修改了什么来增加频道? 我发现视频中七个帧的差异,然后将它们堆叠起来,在这种情况下,我没有使用 3 个通道的图像,而是将 18 个通道的图像作为 CNN 的输入。我已经修改了“donkey_simple.lua”,它在其中获取图像并获取视频中帧的差异并将它们堆叠起来,并且 CNN 的第一层而不是 3 层,在代码中将其更改为 18 个通道和一些张量大小。 “main.lua”的这部分“input:copy(data_im:squeeze())”需要很多时间。而且我发现不是挤的问题。 您是否尝试过减小批处理大小以将包含相同字节数的批处理发送到 gpu? 感谢您的建议,我尝试了您建议的方式。它需要和以前一样的时间。 【参考方案1】:

简答

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

可能的解决方法

您尝试做的事情的本质是在模型中包含以前的帧。如果这是您想要完成的,还有另一种方法。

如果一个训练批次不是随机选择的堆叠图像,而是一个训练批次是常规图像,但都是按时间顺序排列的。

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

让我们探索一下假设。

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

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

[ batch[1:], height, width, channel] - [ batch[:-1], height, width, channel]
and assign it to diffTensor 

然后连接以下张量

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] 

如果你想要 5 个“回顾”

这将实现什么?好吧,如果你向 GPU 发送了 100 张图像,那么这个网络将能够以仅发送 100 张图像的网络价格生成 95 张图像+diff 图像,而你试图发送 95 张 5 层的图像+diff 图像每个你必须支付发送 500 张图片的网络价格。基本上,您可以将网络成本降低几乎 x5

【讨论】:

感谢您的建议,我按照您建议的方式做了,但问题仍然存在,所以我认为将 6 通道的图像发送到 AlexNet 可能需要很多时间。

以上是关于将大图像时间发送到 GPU的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ajax发送大图像或其base64字符串?

如何将数据从 PC 发送到手机 c#

何时使用 openGL 将数据发送到 GPU

将 Uniform 数据正确发送到 GPU

WebGL - 发送数组缓冲区 VS 将图像/画布/位图从 CPU 发送到 GPU

在脸书上张贴大图