
大规模训练和部署
TensorFlow
模型
|
599
例如,在图 19-14 中,操作 A、B 和 C 是源操作,因此可以立即对其进行评估。操作 A
和 B 被放置在 CPU 上,因此它们被发送到 CPU 的评估队列,然后被分派到互操作线程
池并立即进行并行评估。操作 A 碰巧有一个多线程内核。它的计算分为三部分,由内操
作线程池以并行方式执行。操作 C 进入 GPU 0 的评估队列,在此示例中,其 GPU 内核
恰好使用 cuDNN,该 cuDNN 管理其自己的内操作线程池并跨多个 GPU 线程并行运行
该操作。假设 C 首先完成。D 和 E 的依赖计数器递减,它们达到零,因此这两个操作都
被推入 GPU 0 的评估队列,并依次执行。请注意即使 D 和 E 都依赖 C,C 只会被评估一
次。假设 B 接下来完成。F 的依赖计数器从 4 减少到 3,并且由于它不是 0,所以它还不
会运行。一旦 A、D 和 E 完成,则 F 的依赖计数器达到 0,则将其推入 CPU 的评估队列
并进行评估。最后,TensorFlow 返回请求的输出。
当 TF 函数修改有状态资源(例如变量)时,TensorFlow 会执行额外的操作:即使语句
之间没有明显的依赖关系,它也可以确保执行顺序与代码中的顺序匹配。例如,如果你
的 TF 函数包含 v.assign_add(1),再跟一条 v.assign(v
*
2),TensorFlow 将确
保按照这些顺序执行这些操作。
你可以通过调用tf.config.threading.set_inter_op_parallelism_ ...