tvm
Loading...
Searching...
No Matches
transform.h
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
24#ifndef TVM_RELAX_TRANSFORM_H_
25#define TVM_RELAX_TRANSFORM_H_
26
27#include <tvm/ffi/reflection/registry.h>
28#include <tvm/ir/transform.h>
30#include <tvm/relax/expr.h>
31#include <tvm/tirx/function.h>
32#include <tvm/tirx/index_map.h>
33
34namespace tvm {
35namespace relax {
36namespace transform {
37
44using LayoutCb = ffi::TypedFunction<ffi::Map<ffi::String, ffi::Array<ffi::String>>(Call)>;
45
58 int opt_level, ffi::String name,
59 tvm::ffi::Array<ffi::String> required, bool traceable = false);
60
73 std::function<DataflowBlock(DataflowBlock, IRModule, PassContext)> pass_func, int opt_level,
74 ffi::String name, tvm::ffi::Array<ffi::String> required, bool traceable = false);
75
82
89
102
109
123
146
153
161
170
183
192
201TVM_DLL Pass BindParams(ffi::String func_name, ffi::Map<Any, ffi::ObjectRef> params);
202
219BindSymbolicVars(ffi::Map<ffi::Variant<tirx::PrimVar, ffi::String>, PrimExpr> binding_map,
220 ffi::Optional<ffi::String> func_name = std::nullopt);
221
230
255TVM_DLL Pass LegalizeOps(ffi::Optional<ffi::Map<ffi::String, ffi::Function>> cmap,
256 ffi::Optional<ffi::Array<ffi::String>> skip_ops,
257 bool enable_warning = false);
258
264
276
285
313LiftTransformParams(ffi::Variant<bool, ffi::Array<ffi::String>> shared_transform = false);
314
322
328
334
340
349
362
368class FusionPatternNode : public ffi::Object {
369 public:
374 ffi::String name;
375
381
386 ffi::Map<ffi::String, DFPattern> annotation_patterns;
387
395 ffi::Optional<ffi::Function> check;
396
403 ffi::Optional<ffi::Function> attrs_getter;
404
405 static void RegisterReflection() {
406 namespace refl = tvm::ffi::reflection;
407 refl::ObjectDef<FusionPatternNode>()
408 .def_ro("name", &FusionPatternNode::name)
409 .def_ro("pattern", &FusionPatternNode::pattern)
410 .def_ro("annotation_patterns", &FusionPatternNode::annotation_patterns)
411 .def_ro("check", &FusionPatternNode::check)
412 .def_ro("attrs_getter", &FusionPatternNode::attrs_getter);
413 }
414 TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.transform.FusionPattern", FusionPatternNode,
415 ffi::Object);
416};
417
418class FusionPattern : public ffi::ObjectRef {
419 public:
420 FusionPattern(ffi::String name, DFPattern pattern,
421 ffi::Map<ffi::String, DFPattern> annotation_patterns,
422 ffi::Optional<ffi::Function> check, ffi::Optional<ffi::Function> attrs_getter);
423
424 FusionPattern(ffi::String name, DFPattern pattern)
425 : FusionPattern(name, pattern, {}, std::nullopt, std::nullopt) {}
426
428};
429
433class PatternCheckContextNode : public ffi::Object {
434 public:
439
444 ffi::Map<ffi::String, Expr> annotated_expr;
445
450 ffi::Map<Var, Expr> matched_bindings;
451
456 ffi::Map<Var, ffi::Array<Var>> var_usages;
457
462 ffi::Map<Expr, Var> value_to_bound_var;
463
464 static void RegisterReflection() {
465 namespace refl = tvm::ffi::reflection;
466 refl::ObjectDef<PatternCheckContextNode>()
467 .def_ro("matched_expr", &PatternCheckContextNode::matched_expr)
468 .def_ro("annotated_expr", &PatternCheckContextNode::annotated_expr)
469 .def_ro("matched_bindings", &PatternCheckContextNode::matched_bindings)
470 .def_ro("var_usages", &PatternCheckContextNode::var_usages)
471 .def_ro("value_to_bound_var", &PatternCheckContextNode::value_to_bound_var);
472 }
473 TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.transform.PatternCheckContext", PatternCheckContextNode,
474 ffi::Object);
475};
476
477class PatternCheckContext : public ffi::ObjectRef {
478 public:
479 PatternCheckContext(Expr matched_expr, ffi::Map<ffi::String, Expr> annotated_expr,
480 ffi::Map<Var, Expr> matched_bindings,
481 ffi::Map<Var, ffi::Array<Var>> var_usages,
482 ffi::Map<Expr, Var> value_to_bound_var);
483
486};
487
513TVM_DLL Pass Gradient(ffi::String func_name,
514 ffi::Optional<ffi::Array<Var>> require_grads = std::nullopt,
515 int target_index = 0);
516
537TVM_DLL Pass FuseOpsByPattern(const tvm::ffi::Array<FusionPattern>& patterns,
538 bool bind_constants = true, bool annotate_codegen = false,
539 const tvm::ffi::Array<ffi::String>& entry_function_names = {});
540
549
557
565RunCodegen(ffi::Optional<ffi::Map<ffi::String, ffi::Map<ffi::String, ffi::Any>>> target_options,
566 ffi::Array<ffi::String> entry_functions);
567
576TVM_DLL Pass DecomposeOpsForInference(ffi::Optional<ffi::String> func_name);
577
586TVM_DLL Pass DecomposeOpsForTraining(ffi::Optional<ffi::String> func_name);
587
601AlterOpImpl(const ffi::Map<ffi::String, tirx::PrimFunc>& op_impl_map,
602 const ffi::Map<ffi::String, ffi::Array<tirx::IndexMap>>& op_buffer_transforms);
603
611TVM_DLL Pass ConvertLayout(ffi::Map<ffi::String, ffi::Array<ffi::String>> desired_layouts,
613
622
639TVM_DLL Pass DeadCodeElimination(ffi::Array<ffi::String> entry_functions = {});
640
651
663 DLDataType out_dtype, ffi::Optional<ffi::Array<ffi::String>> fp16_input_names = std::nullopt);
664
671
678
679} // namespace transform
680} // namespace relax
681} // namespace tvm
682
683#endif // TVM_RELAX_TRANSFORM_H_
Managed reference to CallNode.
Definition expr.h:474
Managed reference to ExprNode.
Definition base_expr.h:335
Managed reference class to IRModuleNode.
Definition module.h:255
Typed reference/view over any Expr whose ExprNode::ty is PrimType.
Definition base_expr.h:401
Managed reference to VDeviceNode.
Definition global_info.h:87
Managed reference to VarNode.
Definition expr.h:372
RAII wrapper function to enter and exit a context object similar to python's with syntax.
Definition with_context.h:59
Managed reference to dataflow patterns.
Definition dataflow_pattern.h:102
Definition expr.h:325
Definition expr.h:471
The pattern object used as the input of FuseOpsByPattern. For bindings to be fused,...
Definition transform.h:368
ffi::Optional< ffi::Function > attrs_getter
The function to get attributes for fused function.
Definition transform.h:403
ffi::Optional< ffi::Function > check
The function to determine whether the match result is accepted. This can be std::nullopt if check fun...
Definition transform.h:395
ffi::String name
The name of pattern. It becomes the value of the kComposite attribute of a fused function after succe...
Definition transform.h:374
ffi::Map< ffi::String, DFPattern > annotation_patterns
The map which is used to extract important expressions from the pattern match result....
Definition transform.h:386
DFPattern pattern
The dataflow pattern that will be used to match expression in the DataflowBlock. All the call nodes c...
Definition transform.h:380
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.transform.FusionPattern", FusionPatternNode, ffi::Object)
static void RegisterReflection()
Definition transform.h:405
Definition transform.h:418
FusionPattern(ffi::String name, DFPattern pattern)
Definition transform.h:424
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(FusionPattern, ffi::ObjectRef, FusionPatternNode)
FusionPattern(ffi::String name, DFPattern pattern, ffi::Map< ffi::String, DFPattern > annotation_patterns, ffi::Optional< ffi::Function > check, ffi::Optional< ffi::Function > attrs_getter)
The input of FusionPattern::check.
Definition transform.h:433
ffi::Map< Expr, Var > value_to_bound_var
Map from value to its bound variable. It doesn't have variables after the matched expression.
Definition transform.h:462
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.transform.PatternCheckContext", PatternCheckContextNode, ffi::Object)
ffi::Map< Var, Expr > matched_bindings
Map from variable to its value. It contains variables from bindings that is being fused by FuseOpsByP...
Definition transform.h:450
static void RegisterReflection()
Definition transform.h:464
ffi::Map< ffi::String, Expr > annotated_expr
A map which contains all expressions matched by the sub patterns in FusionPattern::annotation_pattern...
Definition transform.h:444
Expr matched_expr
The expression that's matched with the FusionPattern::pattern.
Definition transform.h:438
ffi::Map< Var, ffi::Array< Var > > var_usages
A map mapping variable definitions to a set of uses. It has all variables used in the function.
Definition transform.h:456
PatternCheckContext(Expr matched_expr, ffi::Map< ffi::String, Expr > annotated_expr, ffi::Map< Var, Expr > matched_bindings, ffi::Map< Var, ffi::Array< Var > > var_usages, ffi::Map< Expr, Var > value_to_bound_var)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(PatternCheckContext, ffi::ObjectRef, PatternCheckContextNode)
PassContext that is used to configure the pass behavior.
Definition transform.h:151
Managed reference class for PassInfoNode.
Definition transform.h:367
Definition transform.h:417
A pattern language for matching dataflow properties.
Defines a remapping of buffer indices.
Pass RealizeVDevice()
Propagate virtual device information.
Pass CreateFunctionPass(std::function< Function(Function, IRModule, PassContext)> pass_func, int opt_level, ffi::String name, tvm::ffi::Array< ffi::String > required, bool traceable=false)
Create a function pass.
Pass MergeCompositeFunctions()
Group one or multiple composite functions created by FuseOpsByPattern into a new function....
tvm::relax::DataflowBlock DataflowBlock
Definition transform.h:42
Pass DataflowUseInplaceCalls()
Pass that changes calls to operators that can be done in-place (generally, these are elementwise oper...
Pass FuseOpsByPattern(const tvm::ffi::Array< FusionPattern > &patterns, bool bind_constants=true, bool annotate_codegen=false, const tvm::ffi::Array< ffi::String > &entry_function_names={})
Apply pattern matching to each function in the given module, and group matched expressions into a new...
Pass CallTIRRewrite()
Perform explicit tensor allocation for call_tir and call_dps_packed.
Pass ConvertLayout(ffi::Map< ffi::String, ffi::Array< ffi::String > > desired_layouts, LayoutCb layout_cb)
Layout conversion pass.
Pass ToMixedPrecision(DLDataType out_dtype, ffi::Optional< ffi::Array< ffi::String > > fp16_input_names=std::nullopt)
Automatic mixed precision pass. Currently the pass assumes the input module to be fp32 only,...
Pass AlterOpImpl(const ffi::Map< ffi::String, tirx::PrimFunc > &op_impl_map, const ffi::Map< ffi::String, ffi::Array< tirx::IndexMap > > &op_buffer_transforms)
Returns a pass which replaces PrimFuncs which have matching kOperatorName attribute in op_impl_map,...
Pass Gradient(ffi::String func_name, ffi::Optional< ffi::Array< Var > > require_grads=std::nullopt, int target_index=0)
Reverse-mode automatic differentiation.
Pass Normalize()
Transform Relax IR to normal form: transform AST to A-normal form, and fill the ty of expressions.
tvm::relax::Function Function
Definition transform.h:41
Pass RemoveUnusedParameters()
Remove unused parameters to internal functions.
Pass BindSymbolicVars(ffi::Map< ffi::Variant< tirx::PrimVar, ffi::String >, PrimExpr > binding_map, ffi::Optional< ffi::String > func_name=std::nullopt)
Bind symbolic vars to constant shape values.
Pass SpecializePrimFuncBasedOnCallSite()
This pass updates the var_buffer mapping of PrimFunctions from the call_tir info. Primarily used to u...
Pass FuseTIR()
Fuse relax sub-function into a larger TIR function if possible. this pass works together with FuseOps...
Pass SplitLayoutRewritePreproc()
Split the layout rewrite preproc block to a separate tirx::PrimFunc.
Pass AttachGlobalSymbol()
Attach global_symbol to Relax functions and TIR Primfuncs for codegen.
Pass FuseOps(int fuse_opt_level=-1)
This pass groups bindings in a dataflow block of Relax functions and generates a new grouped Relax fu...
Pass AnnotateTIROpPattern()
Annotate Op Pattern Kind for TIR functions, which is used in FuseOps.
Pass RemovePurityChecking()
Activate force_pure on all pure functions in the module and unwrap all pure override ops into the nor...
Pass AttachAttrLayoutFreeBuffers()
Attach layout free buffers to the tirx::PrimFunc.
Pass LiftTransformParams(ffi::Variant< bool, ffi::Array< ffi::String > > shared_transform=false)
Lift transformation of the parameters of a function.
Pass NormalizeGlobalVar()
Possibly rename the GlobalVar in an IRModule to ensure these properties:
Pass BindParams(ffi::String func_name, ffi::Map< Any, ffi::ObjectRef > params)
Bind params of function of the module to constant tensors.
Pass RemoveUnusedOutputs()
Remove unused outputs from internal functions.
Pass ExpandTupleArguments()
Expand tuple arguments to internal functions.
Pass RunCodegen(ffi::Optional< ffi::Map< ffi::String, ffi::Map< ffi::String, ffi::Any > > > target_options, ffi::Array< ffi::String > entry_functions)
Run codegen.
Pass FoldConstant()
Fold constant expressions within dataflow blocks.
Pass CanonicalizeBindings()
Simplify a Relax module by folding var bindings and match shape nodes, as well as tuple indices....
Pass RewriteDataflowReshape()
Convert all reshape-like call_tir whose corresponding binding vars are DataflowVars to relax....
Pass DecomposeOpsForTraining(ffi::Optional< ffi::String > func_name)
Decompose composite operators during training. For example, The result of batch norm (a triple) will ...
Pass LegalizeOps(ffi::Optional< ffi::Map< ffi::String, ffi::Function > > cmap, ffi::Optional< ffi::Array< ffi::String > > skip_ops, bool enable_warning=false)
Legalize high-level operator calls in Relax functions to call_tir with corresponding low-level TIR Pr...
ffi::TypedFunction< ffi::Map< ffi::String, ffi::Array< ffi::String > >(Call)> LayoutCb
Definition transform.h:44
Pass LambdaLift()
Perform lambda lifting to lift functions from nested into global.
Pass CreateDataflowBlockPass(std::function< DataflowBlock(DataflowBlock, IRModule, PassContext)> pass_func, int opt_level, ffi::String name, tvm::ffi::Array< ffi::String > required, bool traceable=false)
Create a dataflowblock pass.
Pass RewriteCUDAGraph()
Rewrite a Relax module for executing with CUDA graph. This pass identifies the regions that can be ex...
Pass DecomposeOpsForInference(ffi::Optional< ffi::String > func_name)
Decompose composite operators during inference. For example, The result of batch norm (a triple) will...
Pass ConvertToDataflow(int min_size=2)
A pass that converts consecutive dataflow operations inside binding blocks into dataflow blocks.
Pass EliminateCommonSubexpr(bool call_only=false)
Pass UpdateVDevice(VDevice new_vdevice, int64_t index)
Update virtual device.
Pass StaticPlanBlockMemory()
The static memory planning pass on BindingBlock level. The pass will reuse allocated memory to its be...
Pass ToNonDataflow()
Transform all dataflow structure to non-dataflow version.
Pass DeadCodeElimination(ffi::Array< ffi::String > entry_functions={})
Dead code elimination.
Pass CreateModulePass(std::function< IRModule(IRModule, PassContext)> pass_func, int opt_level, ffi::String name, ffi::Array< ffi::String > required, bool traceable=false)
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition analyzer.h:40
TIR Function.