Tensorflow多线程推理比单线程推理慢

时间:2019-12-30 10:39:48

标签: python multithreading tensorflow deep-learning

我正在尝试通过3个Tensorflow会话(使用3个线程)实现多线程推理,如下所示:

const aside = document.querySelector('aside')
const hr = document.querySelector('hr')

const options = {
  root: null,
}

const obs = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    aside.classList.toggle('scrolled', !entry.isIntersecting)
  })
})

obs.observe(hr);

我计时了每个线程的持续时间,结果如下:

线程0的持续时间:0.478595900000073

线程1持续时间:0.4760909999999967

线程2持续时间:0.47291089999998803

3个线程的总持续时间:0.4847196000000622

然后我将其与只是依次运行推理(以下时间)进行比较:

迭代0持续时间:0.1481448999998065

迭代1持续时间:0.1493705999996564

迭代2持续时间:0.14735560000008263

迭代总持续时间:0.44588549999980387

在我看来,我的多线程推理实际上并未并行运行推理。似乎它只是在完成大部分推论,然后等到所有其他推论都完成之后,才一个接一个地完成它们。我了解在大多数情况下,对于Python,这是因为并非每个线程都释放GIL,但我读过Tensorflow session.run()确实释放了GIL(因此可以并行运行)。

有人能让我知道我对此的解释吗?我实际上缺少使线程并行运行的条件(假设它们不是)?

1 个答案:

答案 0 :(得分:0)

此问题很可能是由于创建线程并等待它们完成所产生的开销。为了测试这一点,我建议增加操作中放入的数据量,以增加每个线程的持续时间,以查看对于足够大的数据集,并行运行是否开始比顺序运行快。

请注意,将数据分组在一起并通过单个会话运行它可能会更快,因为图形操作已经在Tensorflow内部并行化了。以我使用线程和Tensorflow的经验,无法获得预期的性能。