我正在尝试使用 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(因此它可以并行运行)。
有谁能让我知道我对此的解释是什么?我实际上缺少什么让线程并行运行(假设它们不是)?