我正在使用新的数据集api来训练简单的前馈DL模型。我对最大化培训速度感兴趣。由于我的网络规模并不大,因此我看到了GPU利用率低的问题。那也行。但是我不明白的是为什么CPU使用率也远非100%。我正在使用多cpu / gpu核心计算机。目前,我达到了140步/秒,其中batch_size =128。如果我缓存数据集,我可以达到210步(在初始扫描之后)。因此,我希望通过足够的预取,我应该能够达到相同的速度而无需缓存。但是,使用各种prefetching和prefetch_to_device参数,我不能获得超过140步/秒的速度。我还将num_parallel_calls设置为cpu内核数,可提高约20%。
理想情况下,我希望预取线程位于与其余输入管道分离的cpu核心上,因此它提供的任何好处都是严格可加的。但是从cpu的使用情况分析中,我怀疑预取和输入处理发生在每个内核上:
有没有办法更好地控制cpu分配?我尝试过prefetch(1),prefetch(500)和其他几个值(在批处理之后或在数据集构建结束时),以及与prefetch_to_device(gpu_device,batch_size = None,1,500等)结合使用)。到目前为止,不带prefetch_to_device的prefetch(500)效果最佳。
为什么不预取尝试耗尽计算机上的所有CPU电源?训练速度还有哪些其他瓶颈?
非常感谢!
答案 0 :(得分:4)
Dataset.prefetch(buffer_size)
转换为您的输入管道增加了管道并行性和(有界)缓冲。因此,增加buffer_size
可能会增加Dataset.prefetch()
的输入正在运行时的时间比例(因为缓冲区更可能具有可用空间),但是并不会增加缓存的速度。输入运行(因此CPU使用率)。
通常,为了提高流水线速度并增加CPU使用率,您可以通过向任何Dataset.map()
转换中添加num_parallel_calls=N
来添加 data 并行度,并且您可能还考虑使用tf.contrib.data.parallel_interleave()
来同时处理许多输入源并避免阻塞I / O。
tf.data
Performance Guide包含有关如何改善输入管道性能的更多详细信息,包括这些建议。