Tensorflow - 使用时间线进行分析 - 了解限制系统的因素

Posted

技术标签:

【中文标题】Tensorflow - 使用时间线进行分析 - 了解限制系统的因素【英文标题】:Tensorflow - Profiling using timeline - Understand what is limiting the system 【发布时间】:2017-10-05 09:20:20 【问题描述】:

我试图理解为什么每次训练迭代需要大约 1.5 秒。 我使用了here 描述的跟踪方法。我正在使用 TitanX Pascal GPU。我的结果看起来很奇怪,似乎每次操作都比较快,并且系统在操作之间的大部分时间都是空闲的。我怎么能从中理解是什么限制了系统。 然而,似乎当我大幅减少批量大小时,差距会缩小,正如可以在此处看到的那样。

不幸的是,代码非常复杂,我无法发布具有相同问题的小版本

有没有办法从探查器中了解在操作之间的间隙中占用空间的原因是什么?

谢谢!

编辑:

仅在 CPU 上我看不到这种行为:

我正在运行一个

【问题讨论】:

顺便说一句,现在不需要使用时间轴了。查看my answer here,了解如何通过 tensorboard 调试模型。 谢谢,但由于某种原因,我在我的 TB 中看不到节点统计信息... 一些想法:有些事情可能无法反映在时间线中——通过 feed dict 传输数据所花费的时间、grpc 延迟。如果仅在 CPU 上运行,是否也有类似的差距?东西可以等待一些出队操作吗?您还可以插入 tf.Print 节点并查看那里生成的时间戳 谢谢,我会试试 tf.Print 的想法 我累了。插入所有这些 tf.Prints 并准确理解在以下情况下会发生什么有点困难……还有其他选择吗? 【参考方案1】:

这里有一些猜测,但如果没有我可以运行和调试的独立复制品,就很难说。

是否有可能您的 GPU 内存不足?这方面的一个信号是,如果您在训练期间看到 Allocator ... ran out of memory 形式的日志消息。如果您的 GPU 内存用完,那么分配器会后退并等待,希望有更多可用内存。这或许可以解释如果您减小批量大小,操作员间的巨大差距就会消失。

正如 Yaroslav 在上面的评论中所建议的,如果只在 CPU 上运行模型会发生什么?时间线是什么样的?

这是分布式训练作业还是单机作业?如果是分布式作业,单机版本是否表现出相同的行为?

您是多次调用 session.run() 或 eval(),还是每个训练步骤只调用一次?每个 run() 或 eval() 调用都会耗尽 GPU 管道,因此为了提高效率,您通常需要将计算表达为一个大图,只需要一个 run() 调用。 (我怀疑这是你的问题,但为了完整起见,我提到它。)

【讨论】:

1.我没有内存不足。我正在使用大约 10% 的 gpu 内存。 2. 这不仅仅发生在 CPU 上。我在原问题 3 中添加了时间线。这是一个单机作业。 4. 我为每个训练步骤调用 sess.run() 一次。谢谢!

以上是关于Tensorflow - 使用时间线进行分析 - 了解限制系统的因素的主要内容,如果未能解决你的问题,请参考以下文章

语义分割之车道线检测Lanenet(tensorflow版)

Tensorflow 内网服务器离线安装

使用TensorFlow进行中文自然语言处理的情感分析

TensorFlow 中的生存分析

在 VS2010 中使用 Nvidia NSight 进行 CUDA 性能分析 - 时间线上的片段

基于TensorFlow Lite Micro在物联网设备上玩转TinyML之离线语音唤醒