在性能指南建议做对CPU,而该GPU的预处理.列出的原因是
这可以防止数据再次从CPU转移到GPU再转发到CPU.
这使得这些任务的GPU可以专注于培训.
我不确定是否理解这两个论点.
为什么预处理会将结果发送回CPU,尤其是 如果所有节点都在GPU上?为什么预处理操作而不是图上的任何其他操作,为什么它们/它们应该是特殊的?
虽然我理解使CPU工作而不是保持闲置的理由,但与训练步骤必须要做的巨大卷积和其他梯度反向传播相比,我会假设随机裁剪,翻转和其他标准预处理步骤输入图像在计算需求方面应该不远,应该在很短的时间内执行.即使我们认为预处理主要是移动的东西(裁剪,翻转),我认为GPU内存应该更快.然而,根据相同的指南,在CPU上进行预处理可以使吞吐量增加6倍.
我当然假设预处理不会导致数据大小的急剧减少(例如,超级采样或裁剪到更小的尺寸),在这种情况下,到设备的传输时间的增益是显而易见的.我认为这些是相当极端的情况,并不构成上述建议的基础.
有人能理解这个吗?
它基于CPU和GPU工作原理的相同逻辑.GPU非常擅长重复并行化任务,而CPU擅长其他计算,这需要更多的处理能力.
例如,考虑一个程序,它接受来自用户的两个整数的输入并运行一个for循环1百万次以对这两个数字求和.
我们如何通过CPU和GPU处理相结合来实现这一目标?
我们做初始数据(两个用户输入整数)在CPU上拦截来自用户的部分然后将两个数字发送到GPU和for循环以对GPU上运行的数字进行求和,因为这是重复的,可并行化但简单的计算部分,哪个GPU更好.[虽然这个例子与tensorflow并不完全相关,但这个概念是所有CPU和GPU处理的核心.关于你的查询:输入图像上的随机裁剪,翻转和其他标准预处理步骤等处理能力可能不是计算密集型的,但GPU在这种类型的中断相关计算中也不擅长.
另外我们需要记住的是,CPU和GPU之间的延迟在这里也起着关键作用.与CPU内不同高速缓存级别之间的数据传输相比,在CPU和GPU之间复制和传输数据的成本很高.
正如Dey,2014 [ 1 ]提到:
当在GPGPU上计算并行程序时,首先将数据从存储器复制到GPU,并在计算之后使用PCI-e总线将数据从GPU写回存储器(参见图1.8).因此,对于每次计算,都必须在设备主机存储器之间复制数据.尽管GPGPU中的计算速度非常快,但由于通过PCI-e进行通信导致设备 - 主机 - 内存之间存在差距,因此会产生性能瓶颈.
出于这个原因,建议:
您在CPU上进行预处理,CPU在其中进行初始计算,准备并将剩余的重复并行化任务发送到GPU以进行进一步处理.
我曾经开发过缓冲机制来增加CPU和GPU之间的数据处理,从而减少CPU和GPU之间延迟的负面影响.看看这篇论文,以便更好地理解这个问题:
有效的数据输入/输出(I/O),用于图形处理单元(GPU)上的有限差分时域(FDTD)计算
现在,回答你的问题:
为什么预处理会将结果发送回CPU,尤其是 如果所有节点都在GPU上?
正如Tensorflow [ 2 ] 的性能指南所引用的那样,
当在GPU上进行预处理时,数据流是CPU - > GPU(预处理) - > CPU - > GPU(训练).数据在CPU和GPU之间来回反弹.
如果您还记得上面提到的CPU-Memory-GPU之间的数据流图,那么在CPU上进行预处理的原因可以提高性能,因为:
在GPU上计算节点之后,数据在存储器上被发回,并且CPU获取该存储器以供进一步处理.GPU没有足够的内存(在GPU本身上)以保留其上的所有数据以用于计算目的.因此,数据的来回是不可避免的.要优化此数据流,您需要在CPU上进行预处理,然后为可并行化任务准备的数据(用于培训目的)将发送到内存和GPU提取预处理数据并对其进行处理.
在性能指南本身中,它还提到通过这样做,并拥有一个高效的输入管道,你不会饿死CPU或GPU或两者,这本身就证明了上述逻辑.同样,在相同的性能文档中,您也会看到提及
如果使用SSD与HDD存储输入数据时训练循环运行得更快,则可能会出现I/O瓶颈.如果是这种情况,则应预先处理输入数据,创建一些大型TFRecord文件.
这再次试图提到相同的CPU-Memory-GPU性能瓶颈,如上所述.
希望这有所帮助,如果您需要更多说明(关于CPU-GPU性能),请不要犹豫,留言!
参考文献:
[ 1 ] Somdip Dey,高效数据输入/输出(I/O),用于图形处理单元(GPU)上的有限差分时域(FDTD)计算,2014
[ 2 ] Tensorflow性能指南:https://www.tensorflow.org/performance/performance_guide