我面临着提高Tensorflow实现的点云对象检测算法的训练速度/效率的问题。
输入数据为[8000,100,9] float32张量,每个样本的大小约为27MB。批量为5个时,数据加载成为训练的瓶颈,因为在大多数情况下,GPU利用率一直为0%,直到数据到达为止。
我尝试了以下方法来提高数据加载速度。
subscribeOn(asyncScheduler)
API中使用num_parallel_calls
,并使用多个线程来读取此大张量。问题是.map
包装了.map
,该{@ 1}受到全局解释器锁定的约束,因此多线程不能提高I / O效率。py_fun
API。由于它也是基于多线程的,因此它具有与2相同的问题。任何有关前进的建议都会有所帮助。谢谢!
关注评论
答案 0 :(得分:2)
一些想法:
您应该结合使用1,2和3。如果将文件另存为TFRecords
,则可以并行读取它们,这就是它们的目的。然后,您将可以使用num_parallel_calls
和interleave
,因为那样就不必包装py_func
。
.map
不必包装.py_func
,例如,您可以使用tf.keras.utils.get_file
。这样,您还可以避免使用py_func
并有效地使用num_parallel_calls
。我仍然建议使用TFRecords
,它们是为此用例设计的。
另一种选择是使用SSD而不是硬盘来存储数据。
您还可以查看.cache
API的tf.Dataset
函数。也许您可以尝试加载数据的随机子集,对其进行训练,然后在此期间(使用tf.prefetch
获取数据的另一子集,然后在其上训练多个时期,依此类推。这个主意可能会影响性能,但效果可能会很长远,但是对于您的情况却可能有效。