使用 TEDD 进行可视化

使用 TEDD 进行可视化#

本节介绍使用 TEDD (Tensor Expression Debug Display) 可视化张量表达式。

加载一些库:

# import tvm
from tvm import te
from tvm.contrib import tedd
from graphviz import Source
from IPython.display import display_svg

定义 add 计算和调度:

A, B, C = [te.placeholder((2, 3), name=name) for name in "ABC"]

Y = A * B
Z = Y + C

s = te.create_schedule(Z.op)

数据流图#

查看计算过程以及调度的流程图:

dot_string = tedd.viz_dataflow_graph(s, output_dot_string=True)
src = Source(dot_string)
display_svg(src)
../../../_images/8d3bb54f56353750606ccbbea8eb3dc4e46ed392357e2c1bc8ff6f335294513d.svg

备注

每个节点表示一个阶段,中间显示名称和 memory scope,两侧显示 inputs/outputs 信息。边表示节点的依赖关系。

调度树#

dot_string = tedd.viz_schedule_tree(s, output_dot_string=True)
# tedd.viz_schedule_tree(s, dot_file_path="/tmp/scheduletree.dot") # 保存到本地
src = Source(dot_string)
display_svg(src)
../../../_images/5056e34a22dc8c02408ba167fdb1d784ded2c273a4d426e7da7eb9597ef5e12b.svg

建议调用 normalize() 来推断范围信息。

s = s.normalize()
# tedd.viz_schedule_tree(s, dot_file_path="/tmp/scheduletree2.dot")
dot_string = tedd.viz_schedule_tree(s, output_dot_string=True)
src = Source(dot_string)
display_svg(src)
../../../_images/a7ce268698fe7acd141e39ad5c62c3de2ce97155b7c66732c52d809537ba4e39.svg

ROOT 下的每个块代表一个阶段。阶段名称显示在顶部行,计算显示在底部行。中间的行是 IterVars,外部越高,内部越低。

迭代关系图#

迭代关系图(IterVar Relationship Graph)。每个子图表示一个阶段,并包含 IterVar 节点和变换节点。

# tedd.viz_itervar_relationship_graph(s, dot_file_path="/tmp/itervar.dot")
dot_string = tedd.viz_itervar_relationship_graph(s, output_dot_string=True)
src = Source(dot_string)
display_svg(src)
../../../_images/52fbde24d44300ac348cb17fa6774f98f1f5a79b0fb84abdfdaf7e5bdf2bc076.svg