XlaBuilder 有什么用?

What is XlaBuilder for?

XLA class XlaBuilder 有什么用? The docs 描述其界面,但不提供动机。

文档中的介绍,以及源代码中XlaBuilder上方的注释

// A convenient interface for building up computations.

表明它不过是一个实用程序。然而,这似乎并不能解释它在其他地方的行为。例如,我们可以通过

构造带有 XlaBuilderXlaOp
XlaOp ConstantLiteral(XlaBuilder* builder, const LiteralSlice& literal);

在这里,我不清楚 builder 扮演什么角色(请注意,构建 XlaOp 的函数未记录在已发布的文档中)。此外,当我添加两个 XlaOps(使用 +Add)时,看来操作必须使用相同的构建器构建,否则我会看到

F tensorflow/core/platform/statusor.cc:33] Attempting to fetch value instead of handling error Invalid argument: No XlaOp with handle -1

确实,XlaOp 保留了 XlaBuilder 的句柄。这向我表明 XlaBuilder 具有更根本的意义。

除了标题问题之外,是否有使用多个 XlaBuilder 的用例,或者您通常会为所有内容使用一个全局实例?

XlaBuilder 是用于构建 XLA 计算的 C++ API——从概念上讲,这就像构建一个充满各种操作的函数,您可以在不同的输入上一遍又一遍地执行数据.

在某些背景下,XLA 用作创建可执行 blob 的抽象层,这些 blob 运行 在各种目标加速器(CPU、GPU、TPU、IPU 等)上,从概念上讲是一种与 PeakStream or the line of work that led to ArBB.

等早期系统概念相似的“加速器虚拟机”

XlaBuilder 是一种将操作排入“计算”(类似于函数)的方法,您希望 运行 针对 XLA 可以定位的各种加速器集。此级别的操作通常称为“高级操作”(HLO)。

返回的 XlaOp 表示您刚刚入队的操作的结果。 (Aside/nerdery:这是在“构建器”API 中使用的经典技术,它在幕后以“静态单一赋值”形式表示程序,操作本身和运算的结果可以统一为一个概念!)

XLA 计算与函数非常相似,因此您可以将 XlaBuilder 视为构建函数。 (另外:它们 被称为 “计算”,因为它们所做的不仅仅是一个简单的功能——从概念上讲,它们是协程,可以与外部“主机”世界对话,也可以对话通过网络设施相互联系。)

所以 XlaOps 不能跨 XlaBuilders 使用这一事实在这种情况下可能更有意义——就像在构建一个函数时你不能抓取一样其他函数内部的中间结果,您必须将它们与函数调用/参数组合起来。在 XlaBuilder 中,您可以 Call 另一个构建的计算,这是您可能使用多个构建器的原因。

正如您所注意到的,您可以选择将所有内容内联到一个“大型构建器”中,但程序通常被构造为组合在一起的函数,并最终从一个几个不同的“切入点”。 XLA 目前积极专注于它看到 API 用户使用的入口点,但这是一个类似于内联决策的设计工件,XLA 可以在概念上重用从多个调用者建立/调用的计算,如果它认为这是正确的做。通常将事物排入 XLA 是最自然的,但是对于您从“外部世界”进行描述很方便,并允许 XLA 内联并积极地专门化您在执行它们时建立的“入口点”计算,在 Just-in 中-时间编译时尚