TFJS 中 eager 风格的性能成本是多少?

What is the performance cost of the eager style in TFJS?

论文TENSORFLOW.JS: MACHINE LEARNING FOR THE WEB AND BEYOND指出:

Since an important part of our design goals is to prioritize ease-of-use over performance, TensorFlow.js supports the eager style of differentiation.

一般来说,我们谈论的是哪种性能影响?这取决于模型吗?是否存在完全没有性能差异的情况?

像 TensorFlow v1 (Python) 默认图形模型中的声明式(a.k.a.、延迟执行、图形模式)编程范例的主要性能优势来自以下几个方面:

  • 将整个模型下推到C++层,执行开销大 与 Python 和 Python 等解释或非编译语言相比更低 JavaScript
  • 并行执行模型计算图的独立路径。一个 示例是由许多独立的输入塔组成的模型。这些 塔可以在 CPU 或多个的不同核心上同时执行 同一主机的GPU。
  • 由于整个模型在执行开始之前就已知, C++ 执行引擎可以对 执行一整套优化 模型的计算图。举几个例子:
    • 常量折叠:图的一个子树只包含无状态的, 常量节点上的确定性操作可以折叠成单个常量节点
    • Op fusion:在某些情况下,几个相邻节点(ops)的计算 可以用数学上等效但计算量更大的图代替图 高效节点。
    • Pruning: 一些计算图包含不贡献的节点 最后的输出。图模型执行引擎可以事先看到 并阻止这些节点执行。
  • 即时 (JIT) 编译:图形执行引擎可以采用 整个图形并将其编译为涉及较低级别的较低级别表示 调度开销并且更容易接受 在可用硬件上的高性能执行(例如,CUDA 程序 对于 NVIDIA 或兼容的 GPU,针对 Google TPU 的特殊说明,或 甚至是 WebGL 的着色器程序等)

图模式 TensorFlow 支持上述所有优化。为了 更多详细信息,google 术语 "grappler" 和 "XLA"。

TensorFlow.js采用命令式(a.k.a., eager)范式,主要基于 可用性考虑。这类似于 TensorFlow eager execution, PyTorch 和 NumPy。因此,它不具备上述所有功能 优化机会。

但是,要意识到有一些方法可以从 命令式程序(参见 TensorFlow v2 的 tf.function 装饰器和 JAX)。没有理由TensorFlow.js 不能采用类似的性能提升范例。只是需要还没有 产品团队已经足够清楚地确定该功能的优先级。