首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高I/O约束训练速度

提高I/O约束训练速度
EN

Stack Overflow用户
提问于 2020-06-03 16:50:43
回答 1查看 839关注 0票数 3

目前,我面临的问题是如何提高点云对象检测算法的训练速度/效率。

输入数据为8000,100,9 float32张量,每个样本的大小约为27 is。在批处理规模为5的情况下,数据加载成为训练的瓶颈,因为大多数情况下,数据到达前GPU的化率为0%。

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

  1. 在tf.Dataset .map API中使用num_parallel_calls,并使用多线程读取这个大张量。问题是.map封装了一个受全局解释器锁约束的py_fun,因此多线程并不能改善I/O、tf.Dataset、.interleave、API。由于它也是基于多线程的,所以它有与2相同的问题。
  2. 使用TFRecord格式。这甚至比方法1和方法2慢。可能TFRecord会将张量转换为numpy,然后将numpy序列化为字节,然后将这些字节包装到tensorflow结构并写入磁盘。tf.convert_to_tensor().

测量的数据需要很长的时间

任何如何向前推进的建议都将是有益的。谢谢!

跟进评论

  1. 我用的是慢盘吗?数据存储在已安装的磁盘上。可能是个原因。
  2. 能否将数据放入GPU内存中?不幸的是没有。大约有70000个样本。我尝试将一个小数据集缓存到内存中,GPU的利用率为30%~40%,这可能是这个特定网络的最高期望。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-03 17:52:03

一些想法:

  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. 您还可以查看tf.Dataset API的.cache函数。也许您可以尝试加载数据的随机子集,在此基础上训练多个eopchs,同时获取数据的另一个子集(使用tf.prefetch),然后训练多个时代,等等。这个想法可能会影响性能,但在您的情况下可能会奏效。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62178275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档