0

我正在尝试使用 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(因此它可以并行运行)。

有谁能让我知道我对此的解释是什么?我实际上缺少什么让线程并行运行(假设它们不是)?

4

1 回答 1

0

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

附带说明一下,将数据组合在一起并通过单个会话运行它可能会更快,因为图形操作已经在 Tensorflow 内部并行化。根据我使用线程和 Tensorflow 的经验,不会产生预期的性能。

于 2019-12-30T14:37:38.107 回答