我对 TensorFlow 在只有 CPU 设备且网络仅用于推理的特定情况下的执行模型有一些疑问,例如使用图像识别(https://www.tensorflow.org/tutorials/image_recognition https://www.tensorflow.org/tutorials/image_recognition) 具有多核平台的 C++ 示例。
下面,我将尝试总结一下我所理解的内容,同时提出一些问题。
Session->Run()(文件 direct_session.cc)调用 ExecutorState::RynAsynch,它使用根节点初始化 TensorFlow 就绪队列。
然后,指令
runner_([=]() { Process(tagged_node, scheduled_usec); }); (executor.cc, function ScheduleReady, line 2088)
将节点(以及相关操作)分配给 inter_op 池的线程。
但是,我并不完全理解它是如何工作的。
例如,在 ScheduleReady 尝试分配比 inter_op 池大小更多的操作的情况下,操作如何排队?(先进先出顺序?)
池中的每个线程都有一个操作队列还是有一个共享队列?
我在代码中哪里可以找到这个?
在哪里可以找到池中每个线程的主体?
另一个问题是关于 inline_ready 管理的节点。这些(廉价或死亡)节点的执行与其他节点有何不同?
然后,(仍然,据我理解)执行流程从 ExecutorState::Process 继续,执行操作,区分同步和异步操作。
同步和异步操作在执行方面有何不同?
当操作执行时,PropagateOutputs(调用ActivateNodes)将由于当前节点(前驱)的执行而变得就绪的每个后继节点添加到就绪队列中。
最后,NodeDone() 调用 ScheduleReady() 来处理当前 TensorFlow 就绪队列中的节点。
反之,intra_op线程池如何管理取决于具体的内核吧?内核请求的操作是否可能比intra_op线程池大小更多?
如果是,它们按照哪种顺序排队? (先进先出?)
一旦操作被分配给池中的线程,那么它们的调度就会留给底层操作系统,或者 TensorFlow 会强制执行某种调度策略?
我在这里问是因为我在文档中几乎没有找到有关执行模型这部分的任何内容,如果我错过了一些文档,请指出所有文档。