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
55TVM_DLL Pass CreateFunctionPass(std::function<Function(Function, IRModule, PassContext)> pass_func,
56 int opt_level, ffi::String name);
57
68 std::function<DataflowBlock(DataflowBlock, IRModule, PassContext)> pass_func, int opt_level,
69 ffi::String name);
70
76TVM_DLL Pass LambdaLift();
77
84
97
104
118
141
148
155TVM_DLL Pass Normalize();
156
165
178
186TVM_DLL Pass EliminateCommonSubexpr(bool call_only = false);
187
196TVM_DLL Pass BindParams(ffi::String func_name, ffi::Map<Any, ffi::ObjectRef> params);
197
213TVM_DLL Pass BindSymbolicVars(ffi::Map<ffi::Variant<PrimVar, ffi::String>, PrimExpr> binding_map,
214 ffi::Optional<ffi::String> func_name = std::nullopt);
215
224
249TVM_DLL Pass LegalizeOps(ffi::Optional<ffi::Map<ffi::String, ffi::Function>> cmap,
250 ffi::Optional<ffi::Array<ffi::String>> skip_ops,
251 bool enable_warning = false);
252
258
270
279
306TVM_DLL Pass
307LiftTransformParams(ffi::Variant<bool, ffi::Array<ffi::String>> shared_transform = false);
308
315TVM_DLL Pass UpdateVDevice(VDevice new_vdevice, int64_t index);
316
322
328
334
343
355TVM_DLL Pass FuseOps(int fuse_opt_level = -1);
356
362class FusionPatternObj : public ffi::Object {
363 public:
364 explicit FusionPatternObj(DFPattern value) : pattern(std::move(value)) {}
365 explicit FusionPatternObj(ffi::UnsafeInit) : pattern(ffi::UnsafeInit{}) {}
366
371 ffi::String name;
372
378
383 ffi::Map<ffi::String, DFPattern> annotation_patterns;
384
392 ffi::Optional<ffi::Function> check;
393
400 ffi::Optional<ffi::Function> attrs_getter;
401
402 static void RegisterReflection() {
403 namespace refl = tvm::ffi::reflection;
404 refl::ObjectDef<FusionPatternObj>()
405 .def_ro("name", &FusionPatternObj::name)
406 .def_ro("pattern", &FusionPatternObj::pattern)
407 .def_ro("annotation_patterns", &FusionPatternObj::annotation_patterns)
408 .def_ro("check", &FusionPatternObj::check)
409 .def_ro("attrs_getter", &FusionPatternObj::attrs_getter);
410 }
411 TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.transform.FusionPattern", FusionPatternObj, ffi::Object);
412};
413
414class FusionPattern : public ffi::ObjectRef {
415 public:
416 FusionPattern(ffi::String name, DFPattern pattern,
417 ffi::Map<ffi::String, DFPattern> annotation_patterns,
418 ffi::Optional<ffi::Function> check, ffi::Optional<ffi::Function> attrs_getter);
419
420 FusionPattern(ffi::String name, DFPattern pattern)
421 : FusionPattern(name, pattern, {}, std::nullopt, std::nullopt) {}
422
424};
425
429class PatternCheckContextObj : public ffi::Object {
430 public:
432 explicit PatternCheckContextObj(ffi::UnsafeInit) : matched_expr(ffi::UnsafeInit{}) {}
433
438
443 ffi::Map<ffi::String, Expr> annotated_expr;
444
449 ffi::Map<Var, Expr> matched_bindings;
450
455 ffi::Map<Var, ffi::Array<Var>> var_usages;
456
461 ffi::Map<Expr, Var> value_to_bound_var;
462
463 static void RegisterReflection() {
464 namespace refl = tvm::ffi::reflection;
465 refl::ObjectDef<PatternCheckContextObj>()
466 .def_ro("matched_expr", &PatternCheckContextObj::matched_expr)
467 .def_ro("annotated_expr", &PatternCheckContextObj::annotated_expr)
468 .def_ro("matched_bindings", &PatternCheckContextObj::matched_bindings)
469 .def_ro("var_usages", &PatternCheckContextObj::var_usages)
470 .def_ro("value_to_bound_var", &PatternCheckContextObj::value_to_bound_var);
471 }
472 TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.transform.PatternCheckContext", PatternCheckContextObj,
473 ffi::Object);
474};
475
476class PatternCheckContext : public ffi::ObjectRef {
477 public:
478 PatternCheckContext(Expr matched_expr, ffi::Map<ffi::String, Expr> annotated_expr,
479 ffi::Map<Var, Expr> matched_bindings,
480 ffi::Map<Var, ffi::Array<Var>> var_usages,
481 ffi::Map<Expr, Var> value_to_bound_var);
482
485};
486
512TVM_DLL Pass Gradient(ffi::String func_name,
513 ffi::Optional<ffi::Array<Var>> require_grads = std::nullopt,
514 int target_index = 0);
515
536TVM_DLL Pass FuseOpsByPattern(const tvm::ffi::Array<FusionPattern>& patterns,
537 bool bind_constants = true, bool annotate_codegen = false,
538 const tvm::ffi::Array<ffi::String>& entry_function_names = {});
539
548
555TVM_DLL Pass FuseTIR();
556
563TVM_DLL Pass
564RunCodegen(ffi::Optional<ffi::Map<ffi::String, ffi::Map<ffi::String, ffi::Any>>> target_options,
565 ffi::Array<ffi::String> entry_functions);
566
575TVM_DLL Pass DecomposeOpsForInference(ffi::Optional<ffi::String> func_name);
576
585TVM_DLL Pass DecomposeOpsForTraining(ffi::Optional<ffi::String> func_name);
586
600 const ffi::Map<ffi::String, tirx::Function>& op_impl_map,
601 const ffi::Map<ffi::String, ffi::Array<ffi::Optional<tirx::IndexMap>>>& op_tensor_transforms);
602
610TVM_DLL Pass ConvertLayout(ffi::Map<ffi::String, ffi::Array<ffi::String>> desired_layouts,
611 LayoutCb layout_cb);
612
620TVM_DLL Pass ConvertToDataflow(int min_size = 2);
621
638TVM_DLL Pass DeadCodeElimination(ffi::Array<ffi::String> entry_functions = {});
639
650
662 DLDataType out_dtype, ffi::Optional<ffi::Array<ffi::String>> fp16_input_names = std::nullopt);
663
670
677
678} // namespace transform
679} // namespace relax
680} // namespace tvm
681
682#endif // TVM_RELAX_TRANSFORM_H_
Managed reference to CallNode.
Definition expr.h:972
Managed reference to ExprNode.
Definition base_expr.h:359
Managed reference class to IRModuleNode.
Definition module.h:255
Typed reference/view over any Expr whose ExprNode::ty is PrimType.
Definition base_expr.h:447
Managed reference to VarNode.
Definition expr.h:714
Managed reference to dataflow patterns.
Definition dataflow_pattern.h:102
Definition expr.h:248
Definition expr.h:415
Managed reference to VDeviceNode.
Definition global_info.h:66
The pattern object used as the input of FuseOpsByPattern. For bindings to be fused,...
Definition transform.h:362
ffi::Optional< ffi::Function > attrs_getter
The function to get attributes for fused function.
Definition transform.h:400
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:392
DFPattern pattern
The dataflow pattern that will be used to match expression in the DataflowBlock. All the call nodes c...
Definition transform.h:377
FusionPatternObj(ffi::UnsafeInit)
Definition transform.h:365
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.transform.FusionPattern", FusionPatternObj, ffi::Object)
FusionPatternObj(DFPattern value)
Definition transform.h:364
ffi::String name
The name of pattern. It becomes the value of the kComposite attribute of a fused function after succe...
Definition transform.h:371
static void RegisterReflection()
Definition transform.h:402
ffi::Map< ffi::String, DFPattern > annotation_patterns
The map which is used to extract important expressions from the pattern match result....
Definition transform.h:383
Definition transform.h:414
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(FusionPattern, ffi::ObjectRef, FusionPatternObj)
FusionPattern(ffi::String name, DFPattern pattern)
Definition transform.h:420
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:429
static void RegisterReflection()
Definition transform.h:463
PatternCheckContextObj(ffi::UnsafeInit)
Definition transform.h:432
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:455
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.transform.PatternCheckContext", PatternCheckContextObj, ffi::Object)
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:461
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:443
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:449
PatternCheckContextObj(Expr matched_expr)
Definition transform.h:431
Expr matched_expr
The expression that's matched with the FusionPattern::pattern.
Definition transform.h:437
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, PatternCheckContextObj)
PassContext that is used to configure the pass behavior.
Definition transform.h:62
Managed reference class for PassInfoObj.
Definition transform.h:251
Definition transform.h:298
A pattern language for matching dataflow properties.
Defines a remapping of tensor indices.
Utilities for IR transformations.
Pass RealizeVDevice()
Propagate virtual device information.
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 CreateDataflowBlockPass(std::function< DataflowBlock(DataflowBlock, IRModule, PassContext)> pass_func, int opt_level, ffi::String name)
Create a dataflowblock pass.
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 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 CreateFunctionPass(std::function< Function(Function, IRModule, PassContext)> pass_func, int opt_level, ffi::String name)
Create a function pass.
Pass BindSymbolicVars(ffi::Map< ffi::Variant< PrimVar, ffi::String >, PrimExpr > binding_map, ffi::Optional< ffi::String > func_name=std::nullopt)
Bind symbolic vars to constant shape values.
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::Function.
Pass AttachGlobalSymbol()
Attach global_symbol to Relax functions and TIR Functions 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 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 Fu...
ffi::TypedFunction< ffi::Map< ffi::String, ffi::Array< ffi::String > >(Call)> LayoutCb
Definition transform.h:44
Pass AttachAttrLayoutFreeTensors()
Attach layout free tensors to the tirx::Function.
Pass LambdaLift()
Perform lambda lifting to lift functions from nested into global.
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 AlterOpImpl(const ffi::Map< ffi::String, tirx::Function > &op_impl_map, const ffi::Map< ffi::String, ffi::Array< ffi::Optional< tirx::IndexMap > > > &op_tensor_transforms)
Returns a pass which replaces Functions which have matching kOperatorName attribute in op_impl_map,...
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 SpecializeFunctionBasedOnCallSite()
This pass updates the var_tensor mapping of Functiontions from the call_tir info. Primarily used to u...
Pass DeadCodeElimination(ffi::Array< ffi::String > entry_functions={})
Dead code elimination.
TVM_TIRX_DLL Pass CreateModulePass(std::function< IRModule(IRModule, PassContext)> pass_func, int opt_level, ffi::String name)
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition attr.h:23
TIR Function.