如何在使用Dataset API的tensorflow GPU培训中最大限度地提高CPU利用率?

如何在使用Dataset API的tensorflow GPU培训中最大限度地提高CPU利用率?,tensorflow,tensorflow-datasets,Tensorflow,Tensorflow Datasets,我正在使用新的dataset api来训练一个简单的前馈DL模型。我对最大化训练速度感兴趣。由于我的网络规模不大,正如预期的那样,我发现GPU的利用率很低。那很好。但我不明白的是,为什么CPU使用率也远未达到100%。我使用的是多cpu/gpu核心机器。目前,当批处理大小=128时,我可以达到140步/秒。如果缓存数据集,我最多可以执行210个步骤(在初始扫描之后)。因此,我希望通过充分的预取,我应该能够在没有缓存的情况下达到相同的速度。但是,使用各种预取和预取到设备参数,我无法获得超过140步

我正在使用新的dataset api来训练一个简单的前馈DL模型。我对最大化训练速度感兴趣。由于我的网络规模不大,正如预期的那样,我发现GPU的利用率很低。那很好。但我不明白的是,为什么CPU使用率也远未达到100%。我使用的是多cpu/gpu核心机器。目前,当批处理大小=128时,我可以达到140步/秒。如果缓存数据集,我最多可以执行210个步骤(在初始扫描之后)。因此,我希望通过充分的预取,我应该能够在没有缓存的情况下达到相同的速度。但是,使用各种预取和预取到设备参数,我无法获得超过140步/秒的速度。我还将num_parallel_调用设置为cpu内核的数量,这将提高大约20%

理想情况下,我希望预取线程位于与输入管道其余部分不相交的cpu内核上,这样它提供的任何好处都是严格相加的。但从cpu使用情况分析来看,我怀疑预取和输入处理发生在每个内核上:

有没有办法更好地控制cpu分配?我尝试过预取(1)、预取(500)和其他几个值(在批处理之后或在数据集构建结束时),以及与预取到设备(gpu设备,批处理大小=无,1500等)结合使用。到目前为止,没有预取的预取(500)设备工作得最好

为什么预取不尝试耗尽我机器上的所有cpu电源?在训练速度方面还有哪些可能的瓶颈

非常感谢

转换将管道并行性和(有界)缓冲添加到输入管道中。因此,增加
buffer_size
可能会增加
Dataset.prefetch()
的输入运行的时间分数(因为缓冲区更可能有可用空间),但不会增加输入运行的速度(以及CPU使用率)

典型的是,为了增加流水线的速度和增加CPU的使用量,您可以通过添加<代码> NUMIORAPILYORACLE=N<代码>来增加数据并行性,也可以考虑使用同时处理多个输入源,避免I/O < /P>上的阻塞。


有关于如何改进输入管道性能的更多详细信息,包括这些建议。

谢谢@mrry!我已经非常彻底地阅读了性能指南。我唯一没有尝试过的是并行交织。但是我检查了我的磁盘IO,它似乎不是瓶颈(例如,如果我同时运行两个培训作业,我每秒总共可以获得比只运行一个作业更多的步骤,即使每个作业都稍微慢一点)。我对num_parallel_调用的理解是,它应该设置为不超过虚拟内核的数量,这就是我所做的。我试着将其设置为更高的值,但没有效果。我将汇报并行交织和数据共享。我发现使用并行交织只会使我的训练速度降低10%左右。这可能是因为我的文件存储在本地,而不是远程HDF等设备上。此外,从顶部看,磁盘io似乎不是瓶颈。我想知道互斥锁是否是cpu使用不足的罪魁祸首:?再次感谢!