Skip to content

【PIR】Support visulization with GraphViz for pir Program #55599

@Aurelius84

Description

@Aurelius84

一、任务背景

飞桨近期在重构底层的中间表示(下称:IR),替换原来的 ProgramDesc 为新的 MLIR。具体技术设计详见:IR Dialect

二、任务描述(难度:中)

此项目处于高效迭代期,为了加速开发者们对模型、子图级别下新 IR 表示的熟悉,降低功能开发中的调试成本,希望能够给 IR Dialect 添加「可视化」功能,接口形态如下:

// 详见 test/cpp/ir/core/ir_program_test.cc

#include "paddle/ir/core/program.h"

TEST(program_test, program) {
ir::IrContext *ctx = ir::IrContext::Instance();
ir::Program program(ctx);

// ... (省略了 Program 生成过程)

program.Visualize();  // <----- 核心接口
}

三、思路引导

Visualize() 接口能够输出一个 string 供终端打印调试,其内容可以遵循 GraphViz 的 Dot Language 协议,可以借鉴 CINN 中 dot_lang.cc 中的实现。

其输出范式为(CINN中的一个简单样例):

digraph G {
   subgraph cluster_125 {
      label="group_125(size=3)"
      color="grey"
      style="filled"
      fillcolor="#FFFFF0"
      node_715[label="eager_in_tmp_8\n[128x1x1x128]\nfloat16" color="#FFDC85" style="filled"]
      node_718[label="var_1559\n[128x12x128x128]\nfloat16" color="#FFDC85" style="filled"]
      node_719[label="var_1561\n[128x12x128x128]\nfloat16" color="#FFDC85" style="filled"]
      node_716[label="var_4003\n[128x12x128x128]\nfloat16" color="#FFDC85" style="filled"]
      node_717[label="elementwise_add_515" shape="Mrecord" color="#8EABFF" style="filled"]
      node_720[label="cast_516" shape="Mrecord" color="#8EABFF" style="filled"]
      node_721[label="var_1563\n[128x12x128x128]\nfloat32" color="#FFDC85" style="filled"]
      node_714[label="broadcast_to_514" shape="Mrecord" color="#8EABFF" style="filled"]
   }
   node_722[label="cublas_matmul_513" shape="Mrecord" color="#ff7f00" style="filled"]
   node_724[label="reduce_max_517" shape="Mrecord" color="#ff7f00" style="filled"]
   node_723[label="subtract_518" shape="Mrecord" color="#ff7f00" style="filled"]
   node_715->node_714
   node_714->node_716
   node_718->node_717
   node_716->node_717
   node_717->node_719
   node_719->node_720
   node_720->node_721
   node_722->node_718
   node_721->node_723
   node_721->node_724
} // end G

借助 VScode 的 DOT Preview 插件可以进行便捷化的可视化,即下图:

image

四、一些Tips

4.1 图语义

CINN 中的 Visualize 接口是基于 Graph 来做的。飞桨的新一代 IR 里的 ir::Program 本身借助了 OpOprand 和 OpResult 连接关系表达了 Graph 的语义,所以可以直接借助 ir::Program来实现(详见 OpOperandImpl实现)

下图表示算子A的第一个输出被算子C和算子B用作第一个输入。

image

4.2 子图可视化

此功能支持可以分为两期。第一期可以不考虑控制流、多Region的场景,聚焦单Block即可。控制流和多Region属于「子图可视化」。

Metadata

Metadata

Assignees

Labels

PFCCPaddle Framework Contributor Club,https://github.com/PaddlePaddle/community/tree/master/pfccgood first issuestatus/close已关闭type/feature-request新需求申请

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions