整体项目架构
InfiniTensor_v2.0 是一个多硬件后端可扩展的张量计算框架,核心设计模式是“计算图抽象 + 符号表达式推导 + 算子/内核分离”.
| 层级 | 核心组件 | 主要职责 |
|---|---|---|
| 1. 基础数据层 | Tensor, DType, Shape |
定义张量的基本属性、数据类型、存储布局和符号化形状描述。 |
| 2. 符号表达式层 | Expr, ShapeExpr, StrideExpr |
支持动态形状推导。通过符号化表示维度,实现在计算前确定张量步长与偏移。 |
| 3. 算子抽象层 | Operator, OpType |
定义算子基类及具体算子(如 ElementWise, Gemm)。负责形状推导和前驱后继关系维护。 |
| 4. 计算图管理层 | Graph, GraphBuilder |
维护张量和算子的拓扑结构,提供拓扑排序、图验证及用户友好的图构建接口。 |
| 5. 运行时层 | Runtime, Kernel, KernelRegistry |
负责不同设备(CPU/CUDA/Ascend 等)的内存管理、内核分发与执行。 |
| 6. 适配与绑定层 | pyinfinitensor |
使用 Pybind11 将 C++ 接口导出至 Python,提供 Torch FX 转换器(可选)。 |
前后端的联动与解耦
接下来,我们从 Python tests 文件 (python/tests/test_torch_fx_translator.py) 里,看看整个前后端的联动。
Runtime 设计
在 AI 相关的框架项目里,一般都会将运行环境抽象为 Runtime Interface,这样可以通过为不同平台实现相同的 interface,达到统一管理运行环境的目的.
举例来说,用 CPU 进行张量运算和在 NVIDIA 显卡上进行张量运算有很大的差别:在 CPU 上,我们需要用 memcpy() 复制张量即可;而在 NVIDIA 显卡上,我们首先需要 cudaMalloc() 分配空间,再 cudaMemcpy() 复制数据.而通过一个统一的 Runtime API,我们就可以用一个统一的 copy_tensor() 自动在 CPU 调用 memcpy() 而在 NVIDIA 显卡上调用 cudaMalloc() + cudaMemcpy().这是 Runtime 抽象类的设计初衷.