提高I / O绑定张量流训练速度

时间:2020-06-03 16:50:43

标签: python tensorflow

我面临着提高Tensorflow实现的点云对象检测算法的训练速度/效率的问题。

输入数据为[8000,100,9] float32张量,每个样本的大小约为27MB。批量为5个时,数据加载成为训练的瓶颈,因为在大多数情况下,GPU利用率一直为0%,直到数据到达为止。

我尝试了以下方法来提高数据加载速度。

  1. 在tf.Dataset subscribeOn(asyncScheduler) API中使用num_parallel_calls,并使用多个线程来读取此大张量。问题是.map包装了.map,该{@ 1}受到全局解释器锁定的约束,因此多线程不能提高I / O效率。
  2. 使用tf.Dataset py_fun API。由于它也是基于多线程的,因此它具有与2相同的问题。
  3. 使用TFRecord格式。这甚至比方法1和方法2还要慢。根据{{​​1}}的测量,Numpy to Tensor需要花费很长时间。

任何有关前进的建议都会有所帮助。谢谢!

关注评论

  1. 我正在使用慢速磁盘吗?数据存储在已安装的磁盘上。可能是一个原因。
  2. 数据可以放入GPU内存中吗?抱歉不行。大约有70,000个样本。我尝试将一个小的数据集缓存到RAM中,GPU利用率为30%〜40%,这可能是对此特定网络的最高期望。

1 个答案:

答案 0 :(得分:2)

一些想法:

  1. 您应该结合使用1,2和3。如果将文件另存为TFRecords,则可以并行读取它们,这就是它们的目的。然后,您将可以使用num_parallel_callsinterleave,因为那样就不必包装py_func

  2. .map不必包装.py_func,例如,您可以使用tf.keras.utils.get_file。这样,您还可以避免使用py_func并有效地使用num_parallel_calls。我仍然建议使用TFRecords,它们是为此用例设计的。

  3. 另一种选择是使用SSD而不是硬盘来存储数据。

  4. 您还可以查看.cache API的tf.Dataset函数。也许您可以尝试加载数据的随机子集,对其进行训练,然后在此期间(使用tf.prefetch获取数据的另一子集,然后在其上训练多个时期,依此类推。这个主意可能会影响性能,但效果可能会很长远,但是对于您的情况却可能有效。