如需了解执行创建操作的步骤,请参阅 vhlo_checklist.md
对 VHLO 进行了更改
什么是 VHLO 方言?
VHLO(版本化 StableHLO)方言用于序列化和稳定性。 它通过 对各个程序元素进行版本控制。
VHLO 是一种“仅添加”方言,具有版本化操作、类型和属性, 也就是说,地图项添加到方言后便无法修改 以任何方式影响语义。
对操作、类型或属性所做的任何更改都需要向
方言。例如,如果在 StableHLO 中添加了假设的 my_op
,
0.9.0,但在 0.11.0 中发生了变化,那么 VHLO 中的代码如下所示:
// This represents the StableHLO version of the op from 0.9.0 -> 0.10.0
// Both the lower and the upper bound of versions are inclusive
def VHLO_MyOpV1 : VHLO_Op<"my_op_v1", "0.9.0", "0.10.0"> {
let arguments = (ins
VHLO_AnyType:$operand
);
let results = (outs VHLO_AnyType:$result);
}
// This represents the StableHLO version of the op from 0.11.0 -> current
def VHLO_MyOpV2 : VHLO_Op<"my_op_v2", "0.11.0", "current"> {
let arguments = (ins
VHLO_AnyType:$operand,
VHLO_AnyAttr:$attr // New attribute added to StableHLO in 0.11.0
);
let results = (outs VHLO_AnyType:$result);
}
StableHLO 方言仅包含最新版本的操作。正在运行
例如,v0.11.0 的 StableHLO 方言只有 StableHLO_MyOp
具有 operand
和 attr
的过滤器,而 VHLO 可捕获操作的每个阶段
。
VHLO 有何作用?
拥有版本化方言后,我们就可以定位 StableHLO 操作集。该方法将向前和向后兼容性封装在 操作之间的转换。
向前兼容性:向前兼容性通过将转换 并将操作降级为目标版本。如果 VHLO 计划可以降级到目标版本, 在运行版本的使用方上可反序列化,并可转换为 StableHLO 高于或等于目标版本,因为 VHLO 有 优化。
如果系统中不存在的操作或功能,则此降级转换将失败。 使用旧版操作集。也就是说,向前兼容性 是在提供方(而不是在运行时)发现的。
向后兼容性:向后兼容性是通过升级提供的 将 VHLO 操作转换为最新版本(如果需要),然后将操作转换回 StableHLO。兼容性时间范围内的所有 VHLO 程序均可升级 转换为 StableHLO,这意味着不同版本的使用方可以对同一个 来自先前版本的 VHLO 载荷。
更重要的是,VHLO 在序列化之后进行抽象化处理。这意味着机器学习 框架(生产方)只需以 StableHLO 运算为目标, 后端(使用方)只需支持最新版本,即 StableHLO 操作集。与 VHLO 之间的转换由机械处理 StableHLO 代码库中维护的。
MLIR 字节码格式版本
为了保持向前兼容性,StableHLO 版本设有 关联的 MLIR 字节码格式版本。此外,最新版本的 StableHLO 将使用最新版本的 MLIR 字节码格式。当 MLIR 字节码格式版本已递增,下一版 StableHLO 递增次要版本并更新 Version.cpp 使用最新的 MLIR 字节码格式版本。
如需详细了解 MLIR 字节码格式以及在 StableHLO 中使用它的理由, 请参阅 bytecode.md。