Hello TVM community, 

I have a question regarding how to read out the intermediate value in Relay IR.

For the mod that the user creates manually, I know we can set arbitrary output 
with the proper setting.

For example, to read out the output_0, output_1, output_2, we can set: 


>     data = relay.var("data", relay.TensorType(dshape, "float32"))
>     output_0 = whatever operations....
>     output_1 = whatever operations....
>     output_2 = whatever operations....
>     func = relay.Function([data], relay.Tuple([output_0, output_1, output_2]))
>     mod = tvm.IRModule.from_expr(func)


However, for the mod that converts from another DNN framework, I am wondering 
how to add such arbitrary output?

For example, I have successfully converted the distilBERT model PyTorch to TVM 
relay IR.
Here is the output when I use print("original mod: \n", 
mod.astext(show_meta_data=False)):

>     def 
> @main(%tf_distil_bert_for_sequence_classification/distilbert/embeddings/Gather/resource:
>  Tensor[(30522, 768), float32], %x: Tensor[(1, 128), int32], 
> %tf_distil_bert_for_sequence_classification/distilbert/embeddings/Gather_1/resource:
>  Tensor[(512, 768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/embeddings/LayerNorm/batchnorm/mul/ReadVariableOp/resource:
>  Tensor[(768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/embeddings/LayerNorm/batchnorm/ReadVariableOp/resource:
>  Tensor[(768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/q_lin/Tensordot/ReadVariableOp/resource:
>  Tensor[(768, 768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/q_lin/BiasAdd/ReadVariableOp/resource:
>  Tensor[(768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/k_lin/Tensordot/ReadVariableOp/resource:
>  Tensor[(768, 768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/k_lin/BiasAdd/ReadVariableOp/resource:
>  Tensor[(768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/ones: Tensor[(1, 128), 
> float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/v_lin/Tensordot/ReadVariableOp/resource:
>  Tensor[(768, 768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/v_lin/BiasAdd/ReadVariableOp/resource:
>  Tensor[(768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/out_lin/Tensordot/ReadVariableOp/resource:
>  Tensor[(768, 768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/out_lin/BiasAdd/ReadVariableOp/resource:
>  Tensor[(768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/sa_layer_norm/batchnorm/mul/ReadVariableOp/resource:
>  Tensor[(768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/sa_layer_norm/batchnorm/ReadVariableOp/resource:
>  Tensor[(768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/ffn/lin1/Tensordot/ReadVariableOp/resource:
>  Tensor[(768, 3072), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/ffn/lin1/BiasAdd/ReadVariableOp/resource:
>  Tensor[(3072), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/ffn/lin2/Tensordot/ReadVariableOp/resource:
>  Tensor[(3072, 768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/ffn/lin2/BiasAdd/ReadVariableOp/resource:
>  Tensor[(768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/output_layer_norm/batchnorm/mul/ReadVariableOp/resource:
>  Tensor[(768), float32], 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/output_layer_norm/batchnorm/ReadVariableOp/resource:
>  Tensor[(768), float32]) 
> 
> 
>     {
>       %0 = expand_dims(meta[relay.Constant][0] /* ty=Tensor[(128), int32] */, 
> axis=0) /* ty=Tensor[(1, 128), int32] */;
>       %1 = 
> take(%tf_distil_bert_for_sequence_classification/distilbert/embeddings/Gather_1/resource,
>  %0, axis=0) /* ty=Tensor[(1, 128, 768), float32] */;
>       %2 = 
> take(%tf_distil_bert_for_sequence_classification/distilbert/embeddings/Gather/resource,
>  %x, axis=0) /* ty=Tensor[(1, 128, 768), float32] */;
>       %3 = tile(%1, reps=[1, 1, 1]) /* ty=Tensor[(1, 128, 768), float32] */;
>       %4 = add(%2, %3) /* ty=Tensor[(1, 128, 768), float32] */;
>       %5 = mean(%4, axis=[2], keepdims=True) /* ty=Tensor[(1, 128, 1), 
> float32] */;
>       %6 = subtract(%4, %5) /* ty=Tensor[(1, 128, 768), float32] */;
>       %7 = multiply(%6, %6) /* ty=Tensor[(1, 128, 768), float32] */;
>       %8 = mean(%7, axis=[2], keepdims=True) /* ty=Tensor[(1, 128, 1), 
> float32] */;
>       %9 = add(%8, 1e-12f /* ty=float32 */) /* ty=Tensor[(1, 128, 1), 
> float32] */;
>       %10 = power(%9, -0.5f /* ty=float32 */) /* ty=Tensor[(1, 128, 1), 
> float32] */;
>       %11 = multiply(%10, 
> %tf_distil_bert_for_sequence_classification/distilbert/embeddings/LayerNorm/batchnorm/mul/ReadVariableOp/resource)
>  /* ty=Tensor[(1, 128, 768), float32] */;
>       %12 = multiply(%5, %11) /* ty=Tensor[(1, 128, 768), float32] */;
>       %13 = multiply(%4, %11) /* ty=Tensor[(1, 128, 768), float32] */;
>       %14 = 
> subtract(%tf_distil_bert_for_sequence_classification/distilbert/embeddings/LayerNorm/batchnorm/ReadVariableOp/resource,
>  %12) /* ty=Tensor[(1, 128, 768), float32] */;
>       %15 = add(%13, %14) /* ty=Tensor[(1, 128, 768), float32] */;
>       %16 = reshape(%15, newshape=[128, 768]) /* ty=Tensor[(128, 768), 
> float32] */;
>       %17 = 
> transpose(%tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/q_lin/Tensordot/ReadVariableOp/resource,
>  axes=[1, 0]) /* ty=Tensor[(768, 768), float32] */;
>       %18 = nn.dense(%16, %17, units=768) /* ty=Tensor[(128, 768), float32] 
> */;
>       %19 = reshape(%18, newshape=[1, 128, 768]) /* ty=Tensor[(1, 128, 768), 
> float32] */;
>       %20 = add(%19, 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/q_lin/BiasAdd/ReadVariableOp/resource)
>  /* ty=Tensor[(1, 128, 768), float32] */;
>       %21 = reshape(%20, newshape=[1, -1, 12, 64]) /* ty=Tensor[(1, 128, 12, 
> 64), float32] */;
>       %22 = cast(768 /* ty=int32 */, dtype="float64") /* ty=float64 */;
>       %23 = cast(12 /* ty=int32 */, dtype="float64") /* ty=float64 */;
>       %24 = divide(%22, %23) /* ty=float64 */;
>       %25 = cast(%24, dtype="int32") /* ty=int32 */;
>       %26 = cast(%25, dtype="float32") /* ty=float32 */;
>       %27 = transpose(%21, axes=[0, 2, 1, 3]) /* ty=Tensor[(1, 12, 128, 64), 
> float32] */;
>       %28 = power(%26, -0.5f /* ty=float32 */) /* ty=float32 */;
>       %29 = multiply(%27, %28) /* ty=Tensor[(1, 12, 128, 64), float32] */;
>       %30 = reshape(%15, newshape=[128, 768]) /* ty=Tensor[(128, 768), 
> float32] */;
>       %31 = 
> transpose(%tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/k_lin/Tensordot/ReadVariableOp/resource,
>  axes=[1, 0]) /* ty=Tensor[(768, 768), float32] */;
>       %32 = nn.dense(%30, %31, units=768) /* ty=Tensor[(128, 768), float32] 
> */;
>       %33 = reshape(%32, newshape=[1, 128, 768]) /* ty=Tensor[(1, 128, 768), 
> float32] */;
>       %34 = add(%33, 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/k_lin/BiasAdd/ReadVariableOp/resource)
>  /* ty=Tensor[(1, 128, 768), float32] */;
>       %35 = reshape(%34, newshape=[1, -1, 12, 64]) /* ty=Tensor[(1, 128, 12, 
> 64), float32] */;
>       %36 = transpose(%35, axes=[0, 2, 1, 3]) /* ty=Tensor[(1, 12, 128, 64), 
> float32] */;
>       %37 = reshape(%29, newshape=[12, 128, 64]) /* ty=Tensor[(12, 128, 64), 
> float32] */;
>       %38 = reshape(%36, newshape=[12, 128, 64]) /* ty=Tensor[(12, 128, 64), 
> float32] */;
>       %39 = nn.batch_matmul(%37, %38, meta[relay.attrs.BatchMatmulAttrs][0]) 
> /* ty=Tensor[(12, 128, 128), float32] */;
>       %40 = 
> reshape(%tf_distil_bert_for_sequence_classification/distilbert/ones, 
> newshape=[1, 1, 1, 128]) /* ty=Tensor[(1, 1, 1, 128), float32] */;
>       %41 = subtract(1f /* ty=float32 */, %40) /* ty=Tensor[(1, 1, 1, 128), 
> float32] */;
>       %42 = reshape(%39, newshape=[1, 12, 128, 128]) /* ty=Tensor[(1, 12, 
> 128, 128), float32] */;
>       %43 = multiply(1e+30f /* ty=float32 */, %41) /* ty=Tensor[(1, 1, 1, 
> 128), float32] */;
>       %44 = subtract(%42, %43) /* ty=Tensor[(1, 12, 128, 128), float32] */;
>       %45 = nn.softmax(%44) /* ty=Tensor[(1, 12, 128, 128), float32] */;
>       %46 = reshape(%15, newshape=[128, 768]) /* ty=Tensor[(128, 768), 
> float32] */;
>       %47 = 
> transpose(%tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/v_lin/Tensordot/ReadVariableOp/resource,
>  axes=[1, 0]) /* ty=Tensor[(768, 768), float32] */;
>       %48 = nn.dense(%46, %47, units=768) /* ty=Tensor[(128, 768), float32] 
> */;
>       %49 = reshape(%48, newshape=[1, 128, 768]) /* ty=Tensor[(1, 128, 768), 
> float32] */;
>       %50 = add(%49, 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/v_lin/BiasAdd/ReadVariableOp/resource)
>  /* ty=Tensor[(1, 128, 768), float32] */;
>       %51 = reshape(%50, newshape=[1, -1, 12, 64]) /* ty=Tensor[(1, 128, 12, 
> 64), float32] */;
>       %52 = transpose(%51, axes=[0, 2, 1, 3]) /* ty=Tensor[(1, 12, 128, 64), 
> float32] */;
>       %53 = reshape(%52, newshape=[12, 128, 64]) /* ty=Tensor[(12, 128, 64), 
> float32] */;
>       %54 = reshape(%45, newshape=[12, 128, 128]) /* ty=Tensor[(12, 128, 
> 128), float32] */;
>       %55 = transpose(%53, axes=[0, 2, 1]) /* ty=Tensor[(12, 64, 128), 
> float32] */;
>       %56 = nn.batch_matmul(%54, %55, meta[relay.attrs.BatchMatmulAttrs][1]) 
> /* ty=Tensor[(12, 128, 64), float32] */;
>       %57 = reshape(%56, newshape=[1, 12, 128, 64]) /* ty=Tensor[(1, 12, 128, 
> 64), float32] */;
>       %58 = transpose(%57, axes=[0, 2, 1, 3]) /* ty=Tensor[(1, 128, 12, 64), 
> float32] */;
>       %59 = reshape(%58, newshape=[1, -1, 768]) /* ty=Tensor[(1, 128, 768), 
> float32] */;
>       %60 = reshape(%59, newshape=[128, 768]) /* ty=Tensor[(128, 768), 
> float32] */;
>       %61 = 
> transpose(%tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/out_lin/Tensordot/ReadVariableOp/resource,
>  axes=[1, 0]) /* ty=Tensor[(768, 768), float32] */;
>       %62 = nn.dense(%60, %61, units=768) /* ty=Tensor[(128, 768), float32] 
> */;
>       %63 = reshape(%62, newshape=[1, 128, 768]) /* ty=Tensor[(1, 128, 768), 
> float32] */;
>       %64 = add(%63, 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/attention/out_lin/BiasAdd/ReadVariableOp/resource)
>  /* ty=Tensor[(1, 128, 768), float32] */;
>       %65 = add(%64, %15) /* ty=Tensor[(1, 128, 768), float32] */;
>       %66 = mean(%65, axis=[2], keepdims=True) /* ty=Tensor[(1, 128, 1), 
> float32] */;
>       %67 = subtract(%65, %66) /* ty=Tensor[(1, 128, 768), float32] */;
>       %68 = multiply(%67, %67) /* ty=Tensor[(1, 128, 768), float32] */;
>       %69 = mean(%68, axis=[2], keepdims=True) /* ty=Tensor[(1, 128, 1), 
> float32] */;
>       %70 = add(%69, 1e-12f /* ty=float32 */) /* ty=Tensor[(1, 128, 1), 
> float32] */;
>       %71 = power(%70, -0.5f /* ty=float32 */) /* ty=Tensor[(1, 128, 1), 
> float32] */;
>       %72 = multiply(%71, 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/sa_layer_norm/batchnorm/mul/ReadVariableOp/resource)
>  /* ty=Tensor[(1, 128, 768), float32] */;
>       %73 = multiply(%66, %72) /* ty=Tensor[(1, 128, 768), float32] */;
>       %74 = multiply(%65, %72) /* ty=Tensor[(1, 128, 768), float32] */;
>       %75 = 
> subtract(%tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/sa_layer_norm/batchnorm/ReadVariableOp/resource,
>  %73) /* ty=Tensor[(1, 128, 768), float32] */;
>       %76 = add(%74, %75) /* ty=Tensor[(1, 128, 768), float32] */;
>       %77 = reshape(%76, newshape=[128, 768]) /* ty=Tensor[(128, 768), 
> float32] */;
>       %78 = 
> transpose(%tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/ffn/lin1/Tensordot/ReadVariableOp/resource,
>  axes=[1, 0]) /* ty=Tensor[(3072, 768), float32] */;
>       %79 = nn.dense(%77, %78, units=3072) /* ty=Tensor[(128, 3072), float32] 
> */;
>       %80 = reshape(%79, newshape=[1, 128, 3072]) /* ty=Tensor[(1, 128, 
> 3072), float32] */;
>       %81 = add(%80, 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/ffn/lin1/BiasAdd/ReadVariableOp/resource)
>  /* ty=Tensor[(1, 128, 3072), float32] */;
>       %82 = divide(%81, 1.41421f /* ty=float32 */) /* ty=Tensor[(1, 128, 
> 3072), float32] */;
>       %83 = erf(%82) /* ty=Tensor[(1, 128, 3072), float32] */;
>       %84 = multiply(0.5f /* ty=float32 */, %81) /* ty=Tensor[(1, 128, 3072), 
> float32] */;
>       %85 = add(1f /* ty=float32 */, %83) /* ty=Tensor[(1, 128, 3072), 
> float32] */;
>       %86 = multiply(%84, %85) /* ty=Tensor[(1, 128, 3072), float32] */;
>       %87 = reshape(%86, newshape=[128, 3072]) /* ty=Tensor[(128, 3072), 
> float32] */;
>       %88 = 
> transpose(%tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/ffn/lin2/Tensordot/ReadVariableOp/resource,
>  axes=[1, 0]) /* ty=Tensor[(768, 3072), float32] */;
>       %89 = nn.dense(%87, %88, units=768) /* ty=Tensor[(128, 768), float32] 
> */;
>       %90 = reshape(%89, newshape=[1, 128, 768]) /* ty=Tensor[(1, 128, 768), 
> float32] */;
>       %91 = add(%90, 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/ffn/lin2/BiasAdd/ReadVariableOp/resource)
>  /* ty=Tensor[(1, 128, 768), float32] */;
>       %92 = add(%91, %76) /* ty=Tensor[(1, 128, 768), float32] */;
>       %93 = mean(%92, axis=[2], keepdims=True) /* ty=Tensor[(1, 128, 1), 
> float32] */;
>       %94 = subtract(%92, %93) /* ty=Tensor[(1, 128, 768), float32] */;
>       %95 = multiply(%94, %94) /* ty=Tensor[(1, 128, 768), float32] */;
>       %96 = mean(%95, axis=[2], keepdims=True) /* ty=Tensor[(1, 128, 1), 
> float32] */;
>       %97 = add(%96, 1e-12f /* ty=float32 */) /* ty=Tensor[(1, 128, 1), 
> float32] */;
>       %98 = power(%97, -0.5f /* ty=float32 */) /* ty=Tensor[(1, 128, 1), 
> float32] */;
>       %99 = multiply(%98, 
> %tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/output_layer_norm/batchnorm/mul/ReadVariableOp/resource)
>  /* ty=Tensor[(1, 128, 768), float32] */;
>       %100 = multiply(%93, %99) /* ty=Tensor[(1, 128, 768), float32] */;
>       %101 = multiply(%92, %99) /* ty=Tensor[(1, 128, 768), float32] */;
>       %102 = 
> subtract(%tf_distil_bert_for_sequence_classification/distilbert/transformer/layer_._0/output_layer_norm/batchnorm/ReadVariableOp/resource,
>  %100) /* ty=Tensor[(1, 128, 768), float32] */;
>       add(%101, %102) /* ty=Tensor[(1, 128, 768), float32] */
>     }

To read out the output, I can use **"module.get_output(0)"**, 

However, this operation only allow user to read the output from the last 
operation, which is 
> add(%101, %102) /* ty=Tensor[(1, 128, 768), float32]

I am wondering is it possible to print out any intermediate value like %60 or 
%80?

Can the user modify the number of outputs in Relay IR and read them out?

Thanks :)





---
[Visit 
Topic](https://discuss.tvm.apache.org/t/how-to-read-out-the-intermediate-value-in-relay-ir/12084/1)
 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/9317f785a6188fe37506845b48dab9af9a8bd930adfc9f75ff1f2955c99368f5).

Reply via email to