从 Vitis AI v2.5 起,支持含自定义运算符 (OP) 的 Pytorch 和 Tensorflow2 模型。自定义运算符的基本工作流程如下所示。
图 1. 自定义运算符工作流程
此工作流程中的步骤如下所示:
- 将运算符定义为对 XIR 未知的自定义运算符,然后量化模型。
- 编译量化的模型。
- 寄存并实现自定义运算符。
- 使用 graph_runner API 部署模型。
注释: 如果要实现自定义运算符的加速(PL 或 AI 引擎)函数,请将其设为 CPU 运算符,但在此 CPU 运算符的实现中实现 PL/AI 引擎调用代码。
对于步骤 4,graph_runner API 支持 C++ 和 Python。使用 Graph_runner API 部署自定义运算符时,其运行时已最优化,包括在不同 DPU 运算符与 CPU 运算符之间采用零复制技术。它表示在不同层之间无需数据复制即可达成地址共享。
零复制技术支持下列模型结构。
类型 | OP 输出 | OP 输入 | 使用零复制 |
---|---|---|---|
a | 单 dpu OP | 单 cpu OP | 是 |
b | 单 cpu OP | 单 dpu OP | 是 |
c | 单 cpu OP | 单 cpu OP | 是 |
d | 单 dpu OP | 多 cpu OP | 是 |
e | 多 cpu OP 和多 dpu OP | 单 cpu OP | 是 |
注释: 模型结构类型 a-e 如下图所示。
图 2. 模型结构类型
注释: 零复制技术能否应用于其他模型结构则视情况而定。
以下提供了分别对应于两个模型的示例。
- 基于 Tensorflow2 的 MNIST 模型
- 基于 PyTorch 的 Pointpillars 模型