From 8ead6c48d878346dfadc7fb48ee9ec94ab418a88 Mon Sep 17 00:00:00 2001 From: Tai Ly Date: Wed, 14 Feb 2024 22:35:44 +0000 Subject: [reference_model] tosa.fb name changes This patch adjusts reference model for attribute name changes in tosa.fb schema, and for obsoleted slice/tile/reshape attributes also updated examples due to the breaking tosa flatbuffers changes Signed-off-by: Tai Ly Change-Id: I105eb99a4c35f289c5078aed0a7f9cbb6dfe9123 --- examples/run_ref_model_examples.sh | 1 + examples/test_add_1x4x4x4_f32/model.pb | 2 +- examples/test_add_1x4x4x4_f32/model.tflite | Bin 956 -> 956 bytes ...v2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11.tosa | Bin 1676 -> 1676 bytes ...v2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11.tosa | Bin 1380 -> 1380 bytes .../model.pb | 2 +- .../model.tflite | Bin 1588 -> 1588 bytes ...v2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11.tosa | Bin 1312 -> 1312 bytes .../model.tflite | Bin 1720 -> 1720 bytes .../flatbuffer-tflite/desc.json | 16 +++++++++ .../test_lstm_stateful_13x21x3_f32.tosa | Bin 0 -> 11752 bytes .../test_lstm_stateful_13x21x3_f32/model.tflite | Bin 0 -> 7912 bytes .../placeholder_0.npy | Bin 0 -> 3404 bytes .../tflite_result.npy | Bin 0 -> 232 bytes examples/test_stateful_op/desc.json | 16 --------- examples/test_stateful_op/placeholder_0.npy | Bin 132 -> 0 bytes examples/test_stateful_op/test_variable_add.tosa | Bin 616 -> 0 bytes examples/test_stateful_op/variable_0.npy | Bin 132 -> 0 bytes .../src/generate/generate_dot_product_states.cc | 12 +++---- reference_model/src/ops/control_flow.cc | 38 ++++++++++----------- reference_model/src/ops/data_layout.h | 1 - reference_model/src/ops/op_factory.h | 15 ++++---- reference_model/src/ops/tensor_ops.cc | 4 +-- thirdparty/serialization_lib | 2 +- verif/generator/tosa_test_gen.py | 6 +--- 25 files changed, 55 insertions(+), 60 deletions(-) create mode 100644 examples/test_lstm_stateful_13x21x3_f32/flatbuffer-tflite/desc.json create mode 100644 examples/test_lstm_stateful_13x21x3_f32/flatbuffer-tflite/test_lstm_stateful_13x21x3_f32.tosa create mode 100644 examples/test_lstm_stateful_13x21x3_f32/model.tflite create mode 100644 examples/test_lstm_stateful_13x21x3_f32/placeholder_0.npy create mode 100644 examples/test_lstm_stateful_13x21x3_f32/tflite_result.npy delete mode 100644 examples/test_stateful_op/desc.json delete mode 100644 examples/test_stateful_op/placeholder_0.npy delete mode 100644 examples/test_stateful_op/test_variable_add.tosa delete mode 100644 examples/test_stateful_op/variable_0.npy diff --git a/examples/run_ref_model_examples.sh b/examples/run_ref_model_examples.sh index 2744bc8..3d796de 100755 --- a/examples/run_ref_model_examples.sh +++ b/examples/run_ref_model_examples.sh @@ -30,3 +30,4 @@ run_test test_add_1x4x4x4_f32 tflite run_test test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11 tf run_test test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11 tflite run_test test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11 tflite +run_test test_lstm_stateful_13x21x3_f32 tflite diff --git a/examples/test_add_1x4x4x4_f32/model.pb b/examples/test_add_1x4x4x4_f32/model.pb index 41b87df..f1af89b 100644 --- a/examples/test_add_1x4x4x4_f32/model.pb +++ b/examples/test_add_1x4x4x4_f32/model.pb @@ -92,5 +92,5 @@ node { } } versions { - producer: 1707 + producer: 1597 } diff --git a/examples/test_add_1x4x4x4_f32/model.tflite b/examples/test_add_1x4x4x4_f32/model.tflite index f21b91d..f686724 100644 Binary files a/examples/test_add_1x4x4x4_f32/model.tflite and b/examples/test_add_1x4x4x4_f32/model.tflite differ diff --git a/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/flatbuffer-tf/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11.tosa b/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/flatbuffer-tf/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11.tosa index 1ae89a6..e3bc565 100644 Binary files a/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/flatbuffer-tf/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11.tosa and b/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/flatbuffer-tf/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11.tosa differ diff --git a/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/flatbuffer-tflite/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11.tosa b/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/flatbuffer-tflite/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11.tosa index d55d5d6..90e8e86 100644 Binary files a/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/flatbuffer-tflite/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11.tosa and b/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/flatbuffer-tflite/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11.tosa differ diff --git a/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/model.pb b/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/model.pb index 825d6ac..bf7ee3a 100644 --- a/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/model.pb +++ b/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/model.pb @@ -137,5 +137,5 @@ node { } } versions { - producer: 1707 + producer: 1597 } diff --git a/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/model.tflite b/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/model.tflite index fcd9565..8fae7b0 100644 Binary files a/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/model.tflite and b/examples/test_conv2d_1x1_1x32x32x8_f32_st11_padSAME_dilat11/model.tflite differ diff --git a/examples/test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11/flatbuffer-tflite/test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11.tosa b/examples/test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11/flatbuffer-tflite/test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11.tosa index ced7eb7..e9fb643 100644 Binary files a/examples/test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11/flatbuffer-tflite/test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11.tosa and b/examples/test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11/flatbuffer-tflite/test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11.tosa differ diff --git a/examples/test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11/model.tflite b/examples/test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11/model.tflite index b2b83d9..66885db 100644 Binary files a/examples/test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11/model.tflite and b/examples/test_conv2d_1x1_1x32x32x8_qi8_st11_padSAME_dilat11/model.tflite differ diff --git a/examples/test_lstm_stateful_13x21x3_f32/flatbuffer-tflite/desc.json b/examples/test_lstm_stateful_13x21x3_f32/flatbuffer-tflite/desc.json new file mode 100644 index 0000000..7fa53d0 --- /dev/null +++ b/examples/test_lstm_stateful_13x21x3_f32/flatbuffer-tflite/desc.json @@ -0,0 +1,16 @@ +{ + "tosa_file": "test_lstm_stateful_13x21x3_f32.tosa", + "ifm_name": [ + "TosaInput_0" + ], + "ifm_file": [ + "../placeholder_0.npy" + ], + "ofm_name": [ + "TosaOutput_0" + ], + "ofm_file": [ + "ref_model_output_0.npy" + ], + "expected_failure": false +} \ No newline at end of file diff --git a/examples/test_lstm_stateful_13x21x3_f32/flatbuffer-tflite/test_lstm_stateful_13x21x3_f32.tosa b/examples/test_lstm_stateful_13x21x3_f32/flatbuffer-tflite/test_lstm_stateful_13x21x3_f32.tosa new file mode 100644 index 0000000..39087fa Binary files /dev/null and b/examples/test_lstm_stateful_13x21x3_f32/flatbuffer-tflite/test_lstm_stateful_13x21x3_f32.tosa differ diff --git a/examples/test_lstm_stateful_13x21x3_f32/model.tflite b/examples/test_lstm_stateful_13x21x3_f32/model.tflite new file mode 100644 index 0000000..c95205d Binary files /dev/null and b/examples/test_lstm_stateful_13x21x3_f32/model.tflite differ diff --git a/examples/test_lstm_stateful_13x21x3_f32/placeholder_0.npy b/examples/test_lstm_stateful_13x21x3_f32/placeholder_0.npy new file mode 100644 index 0000000..6452c52 Binary files /dev/null and b/examples/test_lstm_stateful_13x21x3_f32/placeholder_0.npy differ diff --git a/examples/test_lstm_stateful_13x21x3_f32/tflite_result.npy b/examples/test_lstm_stateful_13x21x3_f32/tflite_result.npy new file mode 100644 index 0000000..9efb8ed Binary files /dev/null and b/examples/test_lstm_stateful_13x21x3_f32/tflite_result.npy differ diff --git a/examples/test_stateful_op/desc.json b/examples/test_stateful_op/desc.json deleted file mode 100644 index 1f1459f..0000000 --- a/examples/test_stateful_op/desc.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "tosa_file": "test_variable_add.tosa", - "ifm_name": [ - "TosaInput_0" - ], - "ifm_file": [ - "placeholder_0.npy" - ], - "variable_name": [ - "Variable_0" - ], - "variable_file": [ - "variable_0.npy" - ], - "expected_failure": false -} \ No newline at end of file diff --git a/examples/test_stateful_op/placeholder_0.npy b/examples/test_stateful_op/placeholder_0.npy deleted file mode 100644 index f9688e6..0000000 Binary files a/examples/test_stateful_op/placeholder_0.npy and /dev/null differ diff --git a/examples/test_stateful_op/test_variable_add.tosa b/examples/test_stateful_op/test_variable_add.tosa deleted file mode 100644 index 2be3044..0000000 Binary files a/examples/test_stateful_op/test_variable_add.tosa and /dev/null differ diff --git a/examples/test_stateful_op/variable_0.npy b/examples/test_stateful_op/variable_0.npy deleted file mode 100644 index c183a15..0000000 Binary files a/examples/test_stateful_op/variable_0.npy and /dev/null differ diff --git a/reference_model/src/generate/generate_dot_product_states.cc b/reference_model/src/generate/generate_dot_product_states.cc index b78be71..4b435ca 100644 --- a/reference_model/src/generate/generate_dot_product_states.cc +++ b/reference_model/src/generate/generate_dot_product_states.cc @@ -101,7 +101,7 @@ public: else return 0.f; } - uint32_t nextIndex() + uint32_t nextIndex() override { ASSERT_MSG(_set_data0.nextIndex() == _set_data1.nextIndex(), "Internal index inconsistency in GeneratorS0") return _set_data0.nextIndex(); @@ -134,7 +134,7 @@ public: else return (_B * _B / (_KS + 1)) * v; } - uint32_t nextIndex() + uint32_t nextIndex() override { return _set_data.nextIndex(); } @@ -167,7 +167,7 @@ public: else return 0.f; } - uint32_t nextIndex() + uint32_t nextIndex() override { return _set_data.nextIndex(); } @@ -199,7 +199,7 @@ public: else return 0.f; } - uint32_t nextIndex() + uint32_t nextIndex() override { return _set_data.nextIndex(); } @@ -246,7 +246,7 @@ public: else return 0.f; } - uint32_t nextIndex() + uint32_t nextIndex() override { ASSERT_MSG(_set_data0.nextIndex() == _set_data1.nextIndex(), "Internal index inconsistency in GeneratorS4") return _set_data0.nextIndex(); @@ -280,7 +280,7 @@ public: else return 0.f; } - uint32_t nextIndex() + uint32_t nextIndex() override { return _set_data.nextIndex(); } diff --git a/reference_model/src/ops/control_flow.cc b/reference_model/src/ops/control_flow.cc index 6bbc587..ac09bbb 100644 --- a/reference_model/src/ops/control_flow.cc +++ b/reference_model/src/ops/control_flow.cc @@ -181,26 +181,26 @@ int OpCondIf::checkTensorAttributes() cond = dynamic_cast*>(inputs[0]); ASSERT_MEM(cond); - auto then_region = tsh->GetRegionByName(attribute->then_branch()); - auto else_region = tsh->GetRegionByName(attribute->else_branch()); + auto then_region = tsh->GetRegionByName(attribute->then_graph()); + auto else_region = tsh->GetRegionByName(attribute->else_graph()); if (then_region && else_region) { - // new serialization: then_branch and else_branch point to regions + // new serialization: then_graph and else_graph point to regions then_block = then_region->GetBlocks().front(); else_block = else_region->GetBlocks().front(); } else { - // old serialization: then_branch and else_branch point to blocks in curr_region + // old serialization: then_graph and else_graph point to blocks in curr_region auto region_name = getParentSGT()->getRegionName(); auto curr_region = tsh->GetRegionByName(region_name); - then_block = curr_region->GetBlockByName(attribute->then_branch()); - else_block = curr_region->GetBlockByName(attribute->else_branch()); + then_block = curr_region->GetBlockByName(attribute->then_graph()); + else_block = curr_region->GetBlockByName(attribute->else_graph()); } - ERROR_IF(!then_block, "OpCondIf: fail to resolve then_branch %s", attribute->then_branch().c_str()); + ERROR_IF(!then_block, "OpCondIf: fail to resolve then_graph %s", attribute->then_graph().c_str()); - ERROR_IF(!else_block, "OpCondIf: fail to resolve else_branch %s", attribute->else_branch().c_str()); + ERROR_IF(!else_block, "OpCondIf: fail to resolve else_graph %s", attribute->else_graph().c_str()); // Make sure operator input/output matches block input/output // Skip the first rank 0 bool tensor on input list @@ -276,7 +276,7 @@ int OpCondIf::eval() { if (evalBlock(then_block, block_inputs, getOutputs())) { - WARNING("OpCondIf: Fail to evaluate then branch block %s", attribute->then_branch().c_str()); + WARNING("OpCondIf: Fail to evaluate then branch block %s", attribute->then_graph().c_str()); return 1; } } @@ -284,7 +284,7 @@ int OpCondIf::eval() { if (evalBlock(else_block, block_inputs, getOutputs())) { - WARNING("OpCondIf: Fail to evaluate else branch block %s", attribute->else_branch().c_str()); + WARNING("OpCondIf: Fail to evaluate else branch block %s", attribute->else_graph().c_str()); return 1; } } @@ -327,11 +327,11 @@ int OpWhileLoop::checkTensorAttributes() return 1; } - auto cond_region = tsh->GetRegionByName(attribute->cond_branch()); - auto body_region = tsh->GetRegionByName(attribute->body_branch()); + auto cond_region = tsh->GetRegionByName(attribute->cond_graph()); + auto body_region = tsh->GetRegionByName(attribute->body_graph()); if (cond_region && body_region) { - // new serialization: then_branch and else_branch point to regions + // new serialization: then_graph and else_graph point to regions cond_block = cond_region->GetBlocks().front(); body_block = body_region->GetBlocks().front(); } @@ -339,12 +339,12 @@ int OpWhileLoop::checkTensorAttributes() { auto region_name = getParentSGT()->getRegionName(); auto curr_region = tsh->GetRegionByName(region_name); - cond_block = curr_region->GetBlockByName(attribute->cond_branch()); - body_block = curr_region->GetBlockByName(attribute->body_branch()); + cond_block = curr_region->GetBlockByName(attribute->cond_graph()); + body_block = curr_region->GetBlockByName(attribute->body_graph()); } - ERROR_IF(!cond_block, "OpWhileLoop: fail to resolve cond_branch %s", attribute->cond_branch().c_str()); - ERROR_IF(!body_block, "OpWhileLoop: fail to resolve body_branch %s", attribute->body_branch().c_str()); + ERROR_IF(!cond_block, "OpWhileLoop: fail to resolve cond_graph %s", attribute->cond_graph().c_str()); + ERROR_IF(!body_block, "OpWhileLoop: fail to resolve body_graph %s", attribute->body_graph().c_str()); // Make sure operator input/output matches block input/output int32_t num_block_tensor = getInputs().size(); @@ -418,7 +418,7 @@ int OpWhileLoop::eval() { if (evalBlock(cond_block, getInputs(), cond_block_outputs)) { - WARNING("OpWhileLoop: Fail to evaluate cond block %s", attribute->cond_branch().c_str()); + WARNING("OpWhileLoop: Fail to evaluate cond block %s", attribute->cond_graph().c_str()); return 1; } bool cond_val = cond_output_ctensor.getTensor()(0); @@ -428,7 +428,7 @@ int OpWhileLoop::eval() { if (evalBlock(body_block, getInputs(), getOutputs())) { - WARNING("OpWhileLoop: Fail to evaluate body block %s", attribute->body_branch().c_str()); + WARNING("OpWhileLoop: Fail to evaluate body block %s", attribute->body_graph().c_str()); return 1; } diff --git a/reference_model/src/ops/data_layout.h b/reference_model/src/ops/data_layout.h index dee2ae0..802c8a0 100644 --- a/reference_model/src/ops/data_layout.h +++ b/reference_model/src/ops/data_layout.h @@ -178,7 +178,6 @@ public: using TOut = Eigen::Tensor; protected: - TosaTileAttribute* attribute; TosaReference::TensorTemplate* in; TosaReference::TensorTemplate* multiples; TosaReference::TensorTemplate* out; diff --git a/reference_model/src/ops/op_factory.h b/reference_model/src/ops/op_factory.h index 06ef36e..1d20066 100644 --- a/reference_model/src/ops/op_factory.h +++ b/reference_model/src/ops/op_factory.h @@ -62,10 +62,10 @@ return new OP(sgt, attribute, id); \ } -#define DEF_FACTORY_ONE_TYPE_ONE_ACCUM(OP, ATTR_NAME, DTYPE, ACCUM_DTYPE) \ - if (inputDTYPE == TOSA_REF_TYPE_##DTYPE && ACCUM_FROM_ATTRIBUTE(ATTR_NAME) == TOSA_REF_TYPE_##ACCUM_DTYPE) \ +#define DEF_FACTORY_ONE_TYPE_ONE_ACCUM(OP, ATTR_NAME, DTYPE, ACC_TYPE) \ + if (inputDTYPE == TOSA_REF_TYPE_##DTYPE && ACCUM_FROM_ATTRIBUTE(ATTR_NAME) == TOSA_REF_TYPE_##ACC_TYPE) \ { \ - return new OP(sgt, attribute, id); \ + return new OP(sgt, attribute, id); \ } #define DEF_FACTORY_TWO_TYPE(OP, DTYPE1, DTYPE2) \ @@ -80,12 +80,11 @@ return new OP(sgt, attribute, id); \ } -#define DEF_FACTORY_TWO_TYPE_ONE_ACCUM(OP, ATTR_NAME, DTYPE1, DTYPE2, ACCUM_DTYPE) \ +#define DEF_FACTORY_TWO_TYPE_ONE_ACCUM(OP, ATTR_NAME, DTYPE1, DTYPE2, ACC_TYPE) \ if (inputDTYPE == TOSA_REF_TYPE_##DTYPE1 && weightDTYPE == TOSA_REF_TYPE_##DTYPE2 && \ - ACCUM_FROM_ATTRIBUTE(ATTR_NAME) == TOSA_REF_TYPE_##ACCUM_DTYPE) \ + ACCUM_FROM_ATTRIBUTE(ATTR_NAME) == TOSA_REF_TYPE_##ACC_TYPE) \ { \ - return new OP(sgt, attribute, \ - id); \ + return new OP(sgt, attribute, id); \ } #define DEF_FACTORY_THREE_TYPE(OP, DTYPE1, DTYPE2, DTYPE3) \ @@ -103,7 +102,7 @@ { \ auto attr = new tosa::Tosa##ATTRIBUTE_NAME##Attribute(p); \ ASSERT_MEM(attr); \ - accumDType = tosa::EnumValuesDType()[attr->accum_dtype()]; \ + accumDType = tosa::EnumValuesDType()[attr->acc_type()]; \ } \ else \ { \ diff --git a/reference_model/src/ops/tensor_ops.cc b/reference_model/src/ops/tensor_ops.cc index 124dc87..609265c 100644 --- a/reference_model/src/ops/tensor_ops.cc +++ b/reference_model/src/ops/tensor_ops.cc @@ -496,11 +496,11 @@ int OpAvgPool2d::eval() LEVEL_CHECK(pad_left <= tosa_level.MAX_KERNEL, "pad_left should be smaller than or equal to MAX_KERNEL"); LEVEL_CHECK(pad_right <= tosa_level.MAX_KERNEL, "pad_right should be smaller than or equal to MAX_KERNEL"); - TOSA_REF_TYPE accum_dtype = ConvertDType(this->attribute->accum_dtype()); + TOSA_REF_TYPE accum_dtype = ConvertDType(this->attribute->acc_type()); DEBUG_INFO(OP, "perform AvgPool2d, input.shape=[%d,%d,%d,%d], output.shape=[%d,%d,%d,%d], kernel=[%d,%d], " - "stride=[%d,%d], pad=[%d,%d,%d,%d], accum_dtype=%s", + "stride=[%d,%d], pad=[%d,%d,%d,%d], acc_type=%s", in_batch, in_height, in_width, in_channels, out_batch, out_height, out_width, out_channels, kernel_y, kernel_x, stride_y, stride_x, pad_top, pad_bottom, pad_left, pad_right, EnumNamesDType()[accum_dtype]); diff --git a/thirdparty/serialization_lib b/thirdparty/serialization_lib index a029f1f..81db8ee 160000 --- a/thirdparty/serialization_lib +++ b/thirdparty/serialization_lib @@ -1 +1 @@ -Subproject commit a029f1f02707f40f6990df53fd4f56684490d58f +Subproject commit 81db8ee8f580d30ec0ca53067df32ef046e6f09e diff --git a/verif/generator/tosa_test_gen.py b/verif/generator/tosa_test_gen.py index a03a763..ee45f0e 100644 --- a/verif/generator/tosa_test_gen.py +++ b/verif/generator/tosa_test_gen.py @@ -1835,11 +1835,7 @@ class TosaTestGen: ): return None - # TODO remove the slice attribute once shape dynamism support is mature. - attr = ts.TosaSerializerAttribute() - attr.SliceAttribute(start_const, size_const) - - self.ser.addOperator(op["op"], input_list, output_list, attr) + self.ser.addOperator(op["op"], input_list, output_list) compliance = self.tensorComplianceMetaData( op, a.dtype, args_dict, result_tensor, error_name -- cgit v1.2.1