我正在尝试使用3个Tensorflow会话(使用3个线程)实现多线程推理,如下所示:
def test_tf(sess, t_num, y_op, x_inp, input_list, tflag_op):
sess.run(y_op, {x_inp: input_list, tflag_op: False})
for i, each_sess in enumerate(cr_sessions):
t = threading.Thread(target=test_tf, args=(each_sess,i, y_op,
x_inp, input_list, tflag_op))
threads_list.append(t)
t.start()
for t in threads_list:
t.join()我计算了每个线程的持续时间,结果是这样的:
线程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 (因此它可以并行运行)。
有没有人能让我知道我对此的解释是什么?为了让线程真正并行运行(假设它们不是),我错过了什么?
发布于 2019-12-30 22:37:38
这个问题很可能是由于创建线程并等待它们完成的开销造成的。为了测试这一点,我建议增加通过操作的数据量,以增加每个线程的持续时间,以查看对于足够大的数据集,并行运行是否开始变得比顺序运行更快。
顺便说一下,将数据分组并通过单个会话运行可能会更快,因为图操作已经在Tensorflow中并行化了。根据我的经验,使用线程和Tensorflow并不能产生预期的性能。
https://stackoverflow.com/questions/59529417
复制相似问题