为什么在TensorFlow-Federated中只有有限的线程池使用?



TFF的线程库默认情况下从ThreadRun启动一个新线程,可选ThreadPool参数的唯一用途(从TFF 0.42.0开始)是在单个执行器的实现中。为什么会这样呢?

在与一些接近实现的人讨论后,我们得出的理解是:

在TFF中全面使用线程池的问题是,如果使用不当,我们可能会导致死锁。我们需要线程池本身的FIFO调度,以及运行时FIFO兼容的使用(如果你需要计算的结果,你需要知道它将在你开始之前启动)。

在TF执行器中实现线程池的第一次使用时,我们推断自己相信以下语句是正确的:在叶子执行器中(也就是说,只要执行器没有任何子执行器),这种fifo兼容的编程是由有状态执行器接口保证的。也就是说,如果你需要一个值,你知道它已经被创建了(否则执行器将无法解析它),所以只要线程池是FIFO的,它将在执行之前准备好。要么创建函数已经将一个函数推到这个FIFO队列中,要么只是直接创建了这个值,所以你可以毫不费力地将自己推到FIFO队列中。

由于困难,我们并没有真正努力去推理我们如何/是否能够对有孩子的执行者做出类似的声明(这些孩子可能会把工作推到队列上;我敢说,我们目前并没有真正保证如何做到这一点,但我可以想象一个类似的不变的推理一步一步地"向上堆栈")。因此,到目前为止,我们认为在leaf执行器中注入线程池使用是安全的。事实上,我们还没有在XLAExecutor中实现这个功能,仅仅是因为缺乏使用。

最新更新