File tree 1 file changed +75
-0
lines changed
1 file changed +75
-0
lines changed Original file line number Diff line number Diff line change
1
+
2
+ # 在TVM中为paddle框架新增6个不支持的算子
3
+
4
+ | 任务名称 | TVM项目4-为Paddle框架新增TVM算子 |
5
+ | ---| ---|
6
+ | 提交作者 | 郑学贵 |
7
+ | 提交时间 | 2023-3-2 |
8
+ | 版本号 | V0.0 |
9
+ | 依赖飞桨版本 | v2.4.2 |
10
+ | 文件名 | add_tvm_op_for_paddle_frontend_1.md |
11
+
12
+ # 一、方案名称
13
+
14
+ tvm前端支持paddle算子
15
+
16
+ # 二、方案描述
17
+
18
+ tvm前端目前暂不支持paddle框架的` thresholded_relu ` 、` index_select ` 、` eye ` 、` linspace ` 、` take_alone_axis ` 、` dist ` 算子,需要在tvm前端中适配这些算子,以支撑更多的paddle模型通过tvm进行部署。
19
+
20
+ # 三、方案流程
21
+
22
+ ## 流程设计
23
+
24
+ 1 . 调研paddle中` thresholded_relu ` 、` index_select ` 、` eye ` 、` linspace ` 、` take_alone_axis ` 、` dist ` 接口的实现,了解具体的计算逻辑和公式
25
+ 2 . 调用并参考paddle2onnx的流程。
26
+ 3 . 在tvm中新增相应的convert函数,对于不支持的算子通过Relay IR组合实现。
27
+ 4 . 根据paddle框架中算子参数的可能情况,构建测试函数,覆盖所有使用场景。
28
+
29
+ ## 算子实现
30
+
31
+ ### 1.thresholded_relu
32
+
33
+ 激活函数,可以通过Relay IR中` where ` 、` greater ` 等函数组合实现
34
+
35
+ ### 2.convert_index_select
36
+
37
+ Relay中由功能更强的` take ` 函数,使用` warp ` 模式实现
38
+
39
+ ### 3.eye
40
+
41
+ 可以先构建一个全0的Tensor,再通过` scatter_nd ` 在对角线上再赋值1
42
+
43
+ ### 4.linspace
44
+
45
+ 需要实现在区间上均匀采用` num ` 个值,需要考虑两种情况:
46
+
47
+ - ` num ` 为1,则输出为` start `
48
+ - ` num ` 大于1,可以计算出间隔步长,再通过组合` arrange ` 等函数进行实现
49
+
50
+ ### 5.take_along_axis
51
+
52
+ 可以通过` gather ` 函数实现
53
+
54
+ ### 6. dist
55
+
56
+ 计算` p-范数 ` ,需要根据` p ` 的值进行讨论:
57
+
58
+ - ` p == inf ` :计算最大值
59
+ - ` p == -inf ` :计算最小值
60
+ - ` p == 0 ` :计算非零元素数量
61
+ - 其余情况:根据计算公式,组合Relay中相应的函数进行实现
62
+
63
+ # 四、方案运行效果
64
+
65
+ ## 测试用例
66
+
67
+ 根据API的参数所有可能的类型进行组合,输入通过随机以及手工构造边界样例生成不同` shape ` 的Tensor,覆盖所有使用场景。
68
+
69
+ ## 运行结果
70
+
71
+ paddle框架中` thresholded_relu ` 、` index_select ` 、` eye ` 、` linspace ` 、` take_alone_axis ` 、` dist ` 算子能够导入tvm并执行,计算结果和paddle框架保持一致。
72
+
73
+ # 五、项目提交时间计划
74
+
75
+ 3-2日已完成代码,通过单测并提交到tvm [ pr地址] ( https://github.com/apache/tvm/pull/14172 )
You can’t perform that action at this time.
0 commit comments