Thanks for your reply.
I will take a look at how to use debug_executor to enable such a function.
Also, I am asking this question because this is somehow related to pipeline
execution.
Thus, I am still wondering is it possible for that user can we register
operations in Relay IR as new outputs.
In my case, I split 12 layer BERT models into two subgraphs, the first one
contains the first 4 layers and the second one contains the last 8 layers.
When following Relay IR rules, **both subgraphs only have one global output**,
wherein is the last operation.
BERT in Relay IR:
> running now: BERT
> original mod:
> #[version = "0.0.5"]
> fn (%tf_bert_for_sequence_classification/bert/embeddings/Gather/resource:
> Tensor[(30522, 768), float32], %x: Tensor[(1, 128), int32],
> %tf_bert_for_sequence_classification/bert/embeddings/Gather_1/resource:
> Tensor[(512, 768), float32],
> %tf_bert_for_sequence_classification/bert/embeddings/Gather_2/resource:
> Tensor[(2, 768), float32],
> %tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/batchnorm/mul/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/batchnorm/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/query/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/query/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/key/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/key/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/value/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/value/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/output/dense/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/output/dense/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/output/LayerNorm/batchnorm/mul/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/output/LayerNorm/batchnorm/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/intermediate/dense/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 3072), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/intermediate/dense/BiasAdd/ReadVariableOp/resource:
> Tensor[(3072), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/output/dense/Tensordot/ReadVariableOp/resource:
> Tensor[(3072, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/output/dense/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/output/LayerNorm/batchnorm/mul/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/output/LayerNorm/batchnorm/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/attention/self/query/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/attention/self/query/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/attention/self/key/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/attention/self/key/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/attention/self/value/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/attention/self/value/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/attention/output/dense/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/attention/output/dense/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/attention/output/LayerNorm/batchnorm/mul/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/attention/output/LayerNorm/batchnorm/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/intermediate/dense/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 3072), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/intermediate/dense/BiasAdd/ReadVariableOp/resource:
> Tensor[(3072), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/output/dense/Tensordot/ReadVariableOp/resource:
> Tensor[(3072, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/output/dense/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/output/LayerNorm/batchnorm/mul/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._1/output/LayerNorm/batchnorm/ReadVariableOp/resource:
> Tensor[(768), float32],
> ....%tf_bert_for_sequence_classification/bert/encoder/layer_._11/attention/self/query/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/attention/self/query/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/attention/self/key/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/attention/self/key/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/attention/self/value/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/attention/self/value/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/attention/output/dense/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/attention/output/dense/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/attention/output/LayerNorm/batchnorm/mul/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/attention/output/LayerNorm/batchnorm/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/intermediate/dense/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 3072), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/intermediate/dense/BiasAdd/ReadVariableOp/resource:
> Tensor[(3072), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/output/dense/Tensordot/ReadVariableOp/resource:
> Tensor[(3072, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/output/dense/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/output/LayerNorm/batchnorm/mul/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._11/output/LayerNorm/batchnorm/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/pooler/dense/MatMul/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/pooler/dense/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/classifier/MatMul/ReadVariableOp/resource:
> Tensor[(768, 2), float32],
> %tf_bert_for_sequence_classification/classifier/BiasAdd/ReadVariableOp/resource:
> Tensor[(2), float32]) {
> %0 = expand_dims(meta[relay.Constant][0], axis=0) /*
> tf_bert_for_sequence_classification/bert/embeddings/ExpandDims */;
> %1 =
> take(%tf_bert_for_sequence_classification/bert/embeddings/Gather_1/resource,
> %0, axis=0) /* tf_bert_for_sequence_classification/bert/embeddings/Gather_1
> */;
> %2 =
> take(%tf_bert_for_sequence_classification/bert/embeddings/Gather/resource,
> %x, axis=0) /* tf_bert_for_sequence_classification/bert/embeddings/Gather */;
> %3 = tile(%1, reps=[1, 1, 1]) /*
> tf_bert_for_sequence_classification/bert/embeddings/Tile */;
> %4 = full(0, shape=[1, 128], dtype="int32") /*
> tf_bert_for_sequence_classification/bert/Fill_1 */;
> %5 = add(%2, %3) /*
> tf_bert_for_sequence_classification/bert/embeddings/add/add */;
> %6 =
> take(%tf_bert_for_sequence_classification/bert/embeddings/Gather_2/resource,
> %4, axis=0) /* tf_bert_for_sequence_classification/bert/embeddings/Gather_2
> */;
> %7 = add(%5, %6) /*
> tf_bert_for_sequence_classification/bert/embeddings/add/add_1 */;
> %8 = mean(%7, axis=[2], keepdims=True) /*
> tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/moments/mean */;
> %9 = subtract(%7, %8);
> %10 = multiply(%9, %9) /*
> tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/moments/SquaredDifference
> */;
> %11 = mean(%10, axis=[2], keepdims=True) /*
> tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/moments/variance
> */;
> %12 = add(%11, 1e-12f) /*
> tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/batchnorm/add
> */;
> %13 = power(%12, -0.5f) /*
> tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/batchnorm/Rsqrt
> */;
> %14 = multiply(%13,
> %tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/batchnorm/mul/ReadVariableOp/resource)
> /*
> tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/batchnorm/mul
> */;
> %15 = multiply(%8, %14) /*
> tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/batchnorm/mul_2
> */;
> %16 = multiply(%7, %14) /*
> tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/batchnorm/mul_1
> */;
> %17 =
> subtract(%tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/batchnorm/ReadVariableOp/resource,
> %15) /*
> tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/batchnorm/sub
> */;
> %18 = add(%16, %17) /*
> tf_bert_for_sequence_classification/bert/embeddings/LayerNorm/batchnorm/add_1
> */;
> %19 = reshape(%18, newshape=[128, 768]) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/query/Tensordot/Reshape
> */;
> %20 =
> transpose(%tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/query/Tensordot/ReadVariableOp/resource,
> axes=[1, 0]);
> %21 = nn.dense(%19, %20, units=768) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/query/Tensordot/MatMul
> */;
> %22 = reshape(%21, newshape=[1, 128, 768]) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/query/Tensordot
> */;
> %23 = add(%22,
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/query/BiasAdd/ReadVariableOp/resource)
> /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/query/BiasAdd
> */;
> %24 = reshape(%23, newshape=[1, -1, 12, 64]) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/Reshape
> */;
> %25 = transpose(%24, axes=[0, 2, 1, 3]) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/transpose
> */;
> %26 = reshape(%18, newshape=[128, 768]) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/key/Tensordot/Reshape
> */;
> %27 =
> transpose(%tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/key/Tensordot/ReadVariableOp/resource,
> axes=[1, 0]);
> %28 = nn.dense(%26, %27, units=768) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/key/Tensordot/MatMul
> */;
> %29 = reshape(%28, newshape=[1, 128, 768]) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/key/Tensordot
> */;
> %30 = add(%29,
> %tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/key/BiasAdd/ReadVariableOp/resource)
> /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/key/BiasAdd
> */;
> %31 = reshape(%30, newshape=[1, -1, 12, 64]) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/Reshape_1
> */;
> %32 = transpose(%31, axes=[0, 2, 1, 3]) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/transpose_1
> */;
> %33 = reshape(%25, newshape=[12, 128, 64]);
> %34 = reshape(%32, newshape=[12, 128, 64]);
> %35 = nn.batch_matmul(%33, %34, transpose_b=True);
> %36 = reshape(%35, newshape=[1, 12, 128, 128]) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/MatMul
> */;
> %37 = full(1, shape=[1, 128], dtype="int32") /*
> tf_bert_for_sequence_classification/bert/Fill */;
> %38 = reshape(%37, newshape=[1, 1, 1, 128]) /*
> tf_bert_for_sequence_classification/bert/Reshape */;
> %39 = cast(%38, dtype="float32") /*
> tf_bert_for_sequence_classification/bert/Cast */;
> %40 = subtract(1f, %39) /* tf_bert_for_sequence_classification/bert/Sub
> */;
> %41 = divide(%36, 8f) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._0/attention/self/truediv
> */;
> %42 = multiply(%40, -10000f) /*
> tf_bert_for_sequence_classification/bert/Mul */;
> .....
> %361 = reshape(%339, newshape=[128, 768]) /*
> tf_bert_for_sequence_classification/bert/encoder/layer_._4/attention/self/value/Tensordot/Reshape
> */;
> ...
> %974 =
> transpose(%tf_bert_for_sequence_classification/bert/pooler/dense/MatMul/ReadVariableOp/resource,
> axes=[1, 0]);
> %975 = nn.dense(%973, %974, units=768) /*
> tf_bert_for_sequence_classification/bert/pooler/dense/MatMul */;
> %976 = add(%975,
> %tf_bert_for_sequence_classification/bert/pooler/dense/BiasAdd/ReadVariableOp/resource)
> /* tf_bert_for_sequence_classification/bert/pooler/dense/BiasAdd */;
> %977 = tanh(%976) /*
> tf_bert_for_sequence_classification/bert/pooler/dense/Tanh */;
> %978 =
> transpose(%tf_bert_for_sequence_classification/classifier/MatMul/ReadVariableOp/resource,
> axes=[1, 0]);
> %979 = nn.dense(%977, %978, units=2) /*
> tf_bert_for_sequence_classification/classifier/MatMul */;
> add(%979,
> %tf_bert_for_sequence_classification/classifier/BiasAdd/ReadVariableOp/resource)
> /* tf_bert_for_sequence_classification/classifier/BiasAdd */
> }
first subgraph (mod 0) in Relay IR:
> mods 0: def
> @main(%tf_bert_for_sequence_classification/bert/embeddings/Gather/resource:
> Tensor[(30522, 768), float32], %x: Tensor[(1, 128), int32], .... (ignore){
> %0 = expand_dims(meta[relay.Constant][0] /* ty=Tensor[(128), int32] */,
> axis=0) /* ty=Tensor[(1, 128), int32] */;
> %1 =
> take(%tf_bert_for_sequence_classification/bert/embeddings/Gather_1/resource,
> %0, axis=0) /* ty=Tensor[(1, 128, 768), float32] */;
> %2 =
> take(%tf_bert_for_sequence_classification/bert/embeddings/Gather/resource,
> %x, axis=0)
> ...
> %337 = multiply(%328, %335) /* ty=Tensor[(1, 128, 768), float32] */;
> %338 =
> subtract(%tf_bert_for_sequence_classification/bert/encoder/layer_._3/output/LayerNorm/batchnorm/ReadVariableOp/resource,
> %336) /* ty=Tensor[(1, 128, 768), float32] */;
> add(%337, %338) /* ty=Tensor[(1, 128, 768), float32] */
> }
second subgraph (mod 1) in Relay IR:
> mods 1: def @main(%x: Tensor[(1, 128, 768), float32],
> %tf_bert_for_sequence_classification/bert/encoder/layer_._4/attention/self/query/Tensordot/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> .....%tf_bert_for_sequence_classification/bert/encoder/layer_._11/output/LayerNorm/batchnorm/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/bert/pooler/dense/MatMul/ReadVariableOp/resource:
> Tensor[(768, 768), float32],
> %tf_bert_for_sequence_classification/bert/pooler/dense/BiasAdd/ReadVariableOp/resource:
> Tensor[(768), float32],
> %tf_bert_for_sequence_classification/classifier/MatMul/ReadVariableOp/resource:
> Tensor[(768, 2), float32],
> %tf_bert_for_sequence_classification/classifier/BiasAdd/ReadVariableOp/resource:
> Tensor[(2), float32]) {
> %0 = reshape(%x, newshape=[128, 768]) /* ty=Tensor[(128, 768), float32]
> */;
> %1 =
> transpose(%tf_bert_for_sequence_classification/bert/encoder/layer_._4/attention/self/query/Tensordot/ReadVariableOp/resource,
> axes=[1, 0]) /* ty=Tensor[(768, 768), float32] */;
> %2 = nn.dense(%0, %1, units=768) /* ty=Tensor[(128, 768), float32] */;
> %3 = reshape(%2, newshape=[1, 128, 768]) /* ty=Tensor[(1, 128, 768),
> float32] */;
> %4 = add(%3,
> %tf_bert_for_sequence_classification/bert/encoder/layer_._4/attention/self/query/BiasAdd/ReadVariableOp/resource)
> /* ty=Tensor[(1, 128, 768), float32] */;
> %5 = reshape(%4, newshape=[1, -1, 12, 64]) /* ty=Tensor[(1, 128, 12,
> 64), float32] */;
> %6 = transpose(%5, axes=[0, 2, 1, 3]) /* ty=Tensor[(1, 12, 128, 64),
> float32] */;
> %7 = reshape(%x, newshape=[128, 768]) /* ty=Tensor[(128, 768), float32]
> */;
> %8 =
> transpose(%tf_bert_for_sequence_classification/bert/encoder/layer_._4/attention/self/key/Tensordot/ReadVariableOp/resource,
> axes=[1, 0]) /* ty=Tensor[(768, 768), float32] */;
> %9 = nn.dense(%7, %8, units=768) /* ty=Tensor[(128, 768), float32] */;
> %10 = reshape(%9, newshape=[1, 128, 768]) /* ty=Tensor[(1, 128, 768),
> float32] */;
> %11 = add(%10,
> %tf_bert_for_sequence_classification/bert/encoder/layer_._4/attention/self/key/BiasAdd/ReadVariableOp/resource)
> /* ty=Tensor[(1, 128, 768), float32] */;
> %12 = reshape(%11, newshape=[1, -1, 12, 64]) /* ty=Tensor[(1, 128, 12,
> 64), float32] */;
> %13 = transpose(%12, axes=[0, 2, 1, 3]) /* ty=Tensor[(1, 12, 128, 64),
> float32] */;
> %14 = reshape(%6, newshape=[12, 128, 64]) /* ty=Tensor[(12, 128, 64),
> float32] */;
> %15 = reshape(%13, newshape=[12, 128, 64]) /* ty=Tensor[(12, 128, 64),
> float32] */;
> %16 = nn.batch_matmul(%14, %15, transpose_b=True) /* ty=Tensor[(12,
> 128, 128), float32] */;
> %17 = reshape(%16, newshape=[1, 12, 128, 128]) /* ty=Tensor[(1, 12,
> 128, 128), float32] */;
> %18 = divide(%17, 8f /* ty=float32 */) /* ty=Tensor[(1, 12, 128, 128),
> float32] */;
> %19 = add(%18, %x1) /* ty=Tensor[(1, 12, 128, 128), float32] */;
>
> ..... (ignore)
When I check the data dependency, I notice there are two data dependencies:
1. The last operation of the first subgraph -> %x: Tensor[(1, 128, 768),
float32] of the second subgraph
For this one, I can follow the reference code shown below to set the output of
the first output to go into the input of the second subgraph.
2. %42 of the first subgraph -> %x1: Tensor[(1, 1, 1, 128), float32] of the
second subgraph.
This operation is constant that goes to every layer. (e.g, %19 in second
subgraph)
However, for this operation, I cannot send the data dependency to the next
subgraph since it is not registered as global output in the first subgraph.
Thus, I am still wondering is it possible for that user can we register
operations in Relay IR as new outputs to read them out (or send them to another
subgraph, in my case).
Thanks for your help in advance.
cc @hjiang
============================================================
Reference code:
https://github.com/apache/tvm/blob/6de8fea475ed0d15d8659978fc89510b45d05d6a/tests/python/relay/test_pipeline_executor.py#L82
---
[Visit
Topic](https://discuss.tvm.apache.org/t/how-to-read-out-the-intermediate-value-in-relay-ir/12084/4)
to respond.
You are receiving this because you enabled mailing list mode.
To unsubscribe from these emails, [click
here](https://discuss.tvm.apache.org/email/unsubscribe/7ded86c234fd03bd6cde309c5850c9fd82a9ec73cae826b6ebb55454ea6eb7bb).