本文聚焦以下阶段:
torch.fx.GraphModule
torch-mlir
对应主流程代码:torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:108
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:108
入口函数是 NpuMlirKernel.codegen_kernel():
NpuMlirKernel.codegen_kernel()
scalarize_tensor_ops_on_scalars(self._gm_with_prim_cast)
set_model_name("MODEL_NAME")
model_name = get_aot_compilation_context() ...
mlir_module = stateless_fx_import(...)
run_pipeline_with_repro_report(..., "builtin.module(torch-lower-to-backend-contract)", ...)
str(mlir_module)
代码:torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:124
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:124
调用:
scalarize_tensor_ops_on_scalars(...)
定义:torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/utils.py:370
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/utils.py:370
主要作用:
aten.add.Tensor
aten.mul.Tensor
aten.add.Scalar
aten.mul.Scalar
代码:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:125
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:126
流程:
get_aot_compilation_context()
model_name
func_name
说明:
MODEL_NAME
define_kernel
调用点:torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:127
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:127
mlir_module = stateless_fx_import( self._gm_with_prim_cast, model_name=model_name, import_symbolic_shape_expressions=False )
实现位于:torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:195
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:195
stateless_fx_import 做三件事:
stateless_fx_import
ir.Context
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:207-209
FxImporter
import_stateless_graph(gm.graph, ...)
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:210-211
_module_lowering(...)
ir.Module
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:212-214
补丁注入位置:
fx_importer.FxImporter.import_stateless_graph = _patch_import_stateless_graph
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:192
fx_importer.sympy_expr_to_semi_affine_expr = _patch_sympy_expr_to_semi_affine_expr
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:193
定义:torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:51
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:51
关键增强:
SymInt
self._cc._symbolic_guards
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:65-100
func_dialect.FuncOp
torch.assume_strict_symbolic_shapes
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:112
GraphNodeImporter.import_nodes(...)
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:114-122
定义:torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:127
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:127
Add/Mul/Pow/Mod/FloorDiv
代码:torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:131
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:131
run_pipeline_with_repro_report( mlir_module, "builtin.module(torch-lower-to-backend-contract)", "Lowering TorchFX IR -> Torch Backend IR", )
这一步是核心 lowering:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:138-141
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:143
步骤:
FuncOp
该文本随后会进入下一阶段(不在本文范围):
MLIRProcessor.get_named_op_str(...)
这段流程本质是:
torch-mlir FxImporter
torch-lower-to-backend-contract
FX -> torch-mlir -> Torch Backend MLIR 详细流程
本文聚焦以下阶段:
torch.fx.GraphModule(以下简称 FX Graph)torch-mlir的 FX importer 导入并运行 lowering pipeline对应主流程代码:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:1081. 入口与上下文
入口函数是
NpuMlirKernel.codegen_kernel():torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:108scalarize_tensor_ops_on_scalars(self._gm_with_prim_cast)set_model_name("MODEL_NAME")model_name = get_aot_compilation_context() ...mlir_module = stateless_fx_import(...)run_pipeline_with_repro_report(..., "builtin.module(torch-lower-to-backend-contract)", ...)str(mlir_module)生成 MLIR 字符串2. FX 导入前预处理(稳定 importer 输入)
代码:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:124调用:
scalarize_tensor_ops_on_scalars(...)定义:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/utils.py:370主要作用:
aten.add.Tensor/aten.mul.Tensor且“第二个参数不是 Node(即常量)”的节点改成aten.add.Scalar/aten.mul.Scalar3. 设置 MLIR 函数名(符号名来源)
代码:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:125torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:126流程:
set_model_name("MODEL_NAME")get_aot_compilation_context()取到model_namefunc_name说明:
MODEL_NAME是模板名,稍后在define_kernel阶段会替换成真实 kernel 名。4. FX -> torch-mlir 导入
调用点:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:127mlir_module = stateless_fx_import( self._gm_with_prim_cast, model_name=model_name, import_symbolic_shape_expressions=False )实现位于:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:195stateless_fx_import做三件事:ir.Context并注册 torch dialect代码:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:207-209FxImporter,调用import_stateless_graph(gm.graph, ...)导入 FX 节点代码:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:210-211_module_lowering(...)返回ir.Module代码:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:212-2145. 为什么要 patch torch-mlir 的 importer
补丁注入位置:
fx_importer.FxImporter.import_stateless_graph = _patch_import_stateless_graphtorch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:192fx_importer.sympy_expr_to_semi_affine_expr = _patch_sympy_expr_to_semi_affine_exprtorch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:1935.1 patch_import_stateless_graph
定义:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:51关键增强:
SymInt提取符号范围约束,写入self._cc._symbolic_guards代码:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:65-100func_dialect.FuncOp时,增加属性torch.assume_strict_symbolic_shapes代码:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:112GraphNodeImporter.import_nodes(...)导入 FX 节点代码:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:114-1225.2 patch_sympy_expr_to_semi_affine_expr
定义:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/torch_mlir_patch.py:127关键增强:
Add/Mul/Pow/Mod/FloorDiv等 sympy 表达式提供到 MLIR affine/semi-affine 的翻译6. torch-mlir 模块 -> Torch Backend MLIR
代码:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:131run_pipeline_with_repro_report( mlir_module, "builtin.module(torch-lower-to-backend-contract)", "Lowering TorchFX IR -> Torch Backend IR", )这一步是核心 lowering:
7. 最终导出 MLIR 字符串
代码:
torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:138-141torch_npu/_inductor/ascend_npu_ir/ascend_npu_ir/npu/codegen/mlir.py:143步骤:
FuncOp,补充torch.assume_strict_symbolic_shapes属性str(mlir_module)生成文本该文本随后会进入下一阶段(不在本文范围):
MLIRProcessor.get_named_op_str(...)8. 一句话总结
这段流程本质是:
torch-mlir FxImporter导入成 MLIR Moduletorch-lower-to-backend-contractpipeline 降到 Torch Backend IR