XIR 包含运算符 (Op)、张量 (Tensor)、图 (Graph) 和子图 (Subgraph) 库,可清晰灵活地呈现计算图。XIR 具有内存中格式和文件格式,支持不同用法。内存中格式 XIR 为图对象,文件格式为 xmodel。图对象可序列化为 XMODEL,而 XMODEL 亦可反序列化为图对象。
在 OP 中,有一组精确定义的运算符,可涵盖常用深度学习框架(如 TensorFlow、PyTorch 和 Caffe1,以及所有内置 DPU 运算符。这样不仅能增强表达式的功能,还能达成核的主要目标之一,即消除这些框架之间的差异,并为用户和开发者提供统一的表示法。
XIR 还可提供名为 PyXIR 的 Python API,以便在 Python 环境内为 Python 用户提供对 XIR 的完整访问权,例如,协同开发以及将用户的 Python 项目与当前基于 XIR 的工具进行集成,而无需执行大量工作来修复不同语言之间的差异。
xir::Graph
图 (Graph) 是 XIR 的核心组件。它包含多个重要的 API,例如,xir::Graph::serialize
、xir::Graph::deserialize
和 xir::Graph::topological_sort
。
图就像是容器,可保存运算符作为其顶点,并利用“生产者 - 使用者”关系作为边缘。
xir::Op
XIR 中的运算符是 XIR 中的运算符定义的实例或者是从 XIR 扩展的运算符定义的实例。所有运算符实例都只能由图根据预定义的内置/扩展运算符定义库来进行创建或添加。运算符定义主要包含输入实参和内部固有属性。
除了预定义的内部固有属性外,运算符实例也能通过应用 xir::Op::set_attr
API 来携带更多外部非固有属性。每个运算符实例都只能包含单个输出张量,但可包含多个扇出运算符。
xir::Tensor
张量是 XIR 中的另一个重要的类。不同于其它框架的张量定义,XIR 的张量只是它表示的数据块的一种描述法。真正的数据块则排除在张量外。
张量的关键属性为数据类型和形状。
xir::Subgraph
XIR 的子图是类树层级,将一组运算符分割为多个不重叠的集合。图的整个运算符集合可视作为根。子图可嵌套,但不得重叠。嵌套的内部子图必须为外部子图的子集。