我正在将最初在Caffe中实现的像素标记(FCN样式)的代码移植到TensorFlow。我使用Slim实现的ResNets(ResNet-101),步长为16px,并进一步使用up-convolutional层对其进行上采样,以实现8px的最终步幅。我有batch_size = 1,因为输入图像是任意大小。问题是训练真的很慢。它在大约3.5分钟内处理100张图像,而我原来的caffe实现在相同的硬件(Tesla K40m)上以30秒的速度完成。这是我的代码的简化版本:
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:245] PoolAllocator: After 1692 get requests, put_count=1316 evicted_count=1000 eviction_rate=0.759878 and unsatisfied allocation rate=0.87234
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:257] Raising pool_size_limit_ from 100 to 110
我只是学习框架,我只在几天内将这些代码放在一起,所以我理解它可能不是最好的。如您所见,我还尝试测量数据准备代码和网络前向传递所需的实际时间。这个时间实际上要小得多,总计100次迭代,与实际运行时间相比只有50秒。我怀疑可能会有一些线程/进程同步,但没有测量,但我觉得很奇怪。 top命令显示大约10个进程,标题与可能由它生成的主进程相同。我也收到这样的警告:
.then(x => ...)
你能否指出我如何加快速度?
感谢。
更新。经过更多的研究后,我发现与队列相比,“馈送”数据可能会很慢,所以我在一个单独的线程中重新实现了队列中的代码:https://gist.github.com/eldar/0ecc058670be340b92e5a1044dc8a089但运行时仍然大致相同。
UPDATE2。看起来我想到速度的问题是什么。我完全卷积训练,我的图像具有任意大小和宽高比。如果我提供固定大小的虚拟随机numpy张量,它的工作速度很快。如果生成10个预定义大小的输入张量,前10次迭代很慢,但随后加速。在TensorFlow中看起来,每次迭代时所有张量的大小调整都不像Caffe那样有效。我将在项目的GitHub上提交一张票。
答案 0 :(得分:2)
通常,TensorFlow resnet实现不应该比caffe慢得多。我只是将caffe / barrista(https://github.com/classner/barrista/tree/master/examples/residual-nets)中的实现与Tensorflow中的示例(https://github.com/tensorflow/models/tree/master/resnet)进行了比较,并且它们在相同速度下完全训练时的差异可以忽略不计。
我确实首先遇到了Tensorflow实现的问题,这使我进入了这个页面。原因是,我构建的github版本不稳定,并且由于中间开发代码非常慢。 git pull
并重新编译解决了这个问题。
但是,如果您要为自己重新实现,请注意BatchNorm更新操作是如何触发的。在张量流示例中,这是在resnet_model.py
,l中完成的。它们被直接添加到“取出”中。 run
操作,因此并行执行并尽快执行。
答案 1 :(得分:2)
问题是由于任意大小的输入图像。 TensorFlow有一些称为自动调整的东西,因此在运行时它们会为每个特定的输入大小分析各种算法,并确定哪个是最佳的。在我的情况下,这发生在每次迭代。
解决方案是设置环境变量TF_CUDNN_USE_AUTOTUNE=0
:
export TF_CUDNN_USE_AUTOTUNE=0
python myscript.py
更多关于这张Github门票:https://github.com/tensorflow/tensorflow/issues/5048