我正在尝试通过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(因此可以并行运行)。
有人能让我知道我对此的解释吗?我实际上缺少使线程并行运行的条件(假设它们不是)?
答案 0 :(得分:0)
此问题很可能是由于创建线程并等待它们完成所产生的开销。为了测试这一点,我建议增加操作中放入的数据量,以增加每个线程的持续时间,以查看对于足够大的数据集,并行运行是否开始比顺序运行快。
请注意,将数据分组在一起并通过单个会话运行它可能会更快,因为图形操作已经在Tensorflow内部并行化了。以我使用线程和Tensorflow的经验,无法获得预期的性能。