diff options
Diffstat (limited to 'runtime/libs/tflite/src')
-rw-r--r-- | runtime/libs/tflite/src/Diff.cpp | 82 | ||||
-rw-r--r-- | runtime/libs/tflite/src/FeatureView.cpp | 70 | ||||
-rw-r--r-- | runtime/libs/tflite/src/Quantization.cpp | 22 | ||||
-rw-r--r-- | runtime/libs/tflite/src/RandomInputInitializer.cpp | 71 | ||||
-rw-r--r-- | runtime/libs/tflite/src/RandomTestRunner.cpp | 363 | ||||
-rw-r--r-- | runtime/libs/tflite/src/TensorShapeUtils.cpp | 45 | ||||
-rw-r--r-- | runtime/libs/tflite/src/interp/FlatBufferBuilder.cpp | 40 | ||||
-rw-r--r-- | runtime/libs/tflite/src/interp/FunctionBuilder.cpp | 34 |
8 files changed, 115 insertions, 612 deletions
diff --git a/runtime/libs/tflite/src/Diff.cpp b/runtime/libs/tflite/src/Diff.cpp index 39f994352..8165798e0 100644 --- a/runtime/libs/tflite/src/Diff.cpp +++ b/runtime/libs/tflite/src/Diff.cpp @@ -22,6 +22,8 @@ #include "misc/tensor/Zipper.h" #include "misc/tensor/Comparator.h" +#include <tensorflow/lite/c/c_api.h> + #include <iostream> #include <cassert> @@ -29,9 +31,9 @@ class DiffSummary : public nnfw::misc::tensor::Comparator::Observer { public: DiffSummary() - : max_abs_diff_index(0), max_abs_diff_expected{0.0f}, max_abs_diff_obtained{0.0f}, - max_abs_diff_value{0.0f}, max_rel_diff_index(0), max_rel_diff_expected{0.0f}, - max_rel_diff_obtained{0.0f}, max_rel_diff_value{0.0f} + : max_abs_diff_index(0), max_abs_diff_expected{0.0f}, max_abs_diff_obtained{0.0f}, + max_abs_diff_value{0.0f}, max_rel_diff_index(0), max_rel_diff_expected{0.0f}, + max_rel_diff_obtained{0.0f}, max_rel_diff_value{0.0f} { // DO NOTHING } @@ -86,12 +88,12 @@ bool TfLiteInterpMatchApp::compareSingleTensorView(const nnfw::tflite::TensorVie using nnfw::misc::tensor::zip; zip(expected.shape(), expected, obtained) - << [&](const Index &index, T expected_value, T obtained_value) { - if (expected_value != obtained_value) - { - diffs.emplace_back(index, expected_value, obtained_value); - } - }; + << [&](const Index &index, T expected_value, T obtained_value) { + if (expected_value != obtained_value) + { + diffs.emplace_back(index, expected_value, obtained_value); + } + }; // TODO Unify summary generation code if (diffs.size() == 0) @@ -121,8 +123,8 @@ bool TfLiteInterpMatchApp::compareSingleTensorView(const nnfw::tflite::TensorVie template <> bool TfLiteInterpMatchApp::compareSingleTensorView<float>( - const nnfw::tflite::TensorView<float> &expected, - const nnfw::tflite::TensorView<float> &obtained, int id) const + const nnfw::tflite::TensorView<float> &expected, const nnfw::tflite::TensorView<float> &obtained, + int id) const { DiffSummary summary; @@ -190,53 +192,57 @@ bool TfLiteInterpMatchApp::compareSingleTensorView<float>( #include <map> -bool TfLiteInterpMatchApp::run(::tflite::Interpreter &interp, ::tflite::Interpreter &nnapi) const +bool TfLiteInterpMatchApp::run(TfLiteInterpreter &expected, TfLiteInterpreter &obtained) const { - assert(interp.outputs() == nnapi.outputs()); + auto output_count = TfLiteInterpreterGetOutputTensorCount(&expected); + assert(output_count == TfLiteInterpreterGetOutputTensorCount(&obtained)); bool all_matched = true; - using Comparator = std::function<bool(int id, ::tflite::Interpreter &, ::tflite::Interpreter &)>; + using Comparator = std::function<bool(int32_t, const TfLiteTensor *, const TfLiteTensor *)>; std::map<TfLiteType, Comparator> comparators; - comparators[kTfLiteUInt8] = [this](int id, ::tflite::Interpreter &interp, - ::tflite::Interpreter &nnapi) { - const auto expected = nnfw::tflite::TensorView<uint8_t>::make(interp, id); - const auto obtained = nnfw::tflite::TensorView<uint8_t>::make(nnapi, id); + comparators[kTfLiteUInt8] = [this](int32_t id, const TfLiteTensor *expected_tensor, + const TfLiteTensor *obtained_tensor) { + const auto expected_view = nnfw::tflite::TensorView<uint8_t>::make(expected_tensor); + const auto obtained_view = nnfw::tflite::TensorView<uint8_t>::make(obtained_tensor); - return compareSingleTensorView(expected, obtained, id); + return compareSingleTensorView(expected_view, obtained_view, id); }; - comparators[kTfLiteInt32] = [this](int id, ::tflite::Interpreter &interp, - ::tflite::Interpreter &nnapi) { - const auto expected = nnfw::tflite::TensorView<int32_t>::make(interp, id); - const auto obtained = nnfw::tflite::TensorView<int32_t>::make(nnapi, id); + comparators[kTfLiteInt32] = [this](int32_t id, const TfLiteTensor *expected_tensor, + const TfLiteTensor *obtained_tensor) { + const auto expected_view = nnfw::tflite::TensorView<int32_t>::make(expected_tensor); + const auto obtained_view = nnfw::tflite::TensorView<int32_t>::make(obtained_tensor); - return compareSingleTensorView(expected, obtained, id); + return compareSingleTensorView(expected_view, obtained_view, id); }; - comparators[kTfLiteFloat32] = [this](int id, ::tflite::Interpreter &interp, - ::tflite::Interpreter &nnapi) { - const auto expected = nnfw::tflite::TensorView<float>::make(interp, id); - const auto obtained = nnfw::tflite::TensorView<float>::make(nnapi, id); + comparators[kTfLiteFloat32] = [this](int32_t id, const TfLiteTensor *expected_tensor, + const TfLiteTensor *obtained_tensor) { + const auto expected_view = nnfw::tflite::TensorView<float>::make(expected_tensor); + const auto obtained_view = nnfw::tflite::TensorView<float>::make(obtained_tensor); - return compareSingleTensorView(expected, obtained, id); + return compareSingleTensorView(expected_view, obtained_view, id); }; - comparators[kTfLiteBool] = [this](int id, ::tflite::Interpreter &interp, - ::tflite::Interpreter &nnapi) { - const auto expected = nnfw::tflite::TensorView<bool>::make(interp, id); - const auto obtained = nnfw::tflite::TensorView<bool>::make(nnapi, id); + comparators[kTfLiteBool] = [this](int32_t id, const TfLiteTensor *expected_tensor, + const TfLiteTensor *obtained_tensor) { + const auto expected_view = nnfw::tflite::TensorView<bool>::make(expected_tensor); + const auto obtained_view = nnfw::tflite::TensorView<bool>::make(obtained_tensor); - return compareSingleTensorView(expected, obtained, id); + return compareSingleTensorView(expected_view, obtained_view, id); }; - for (const auto &id : interp.outputs()) + for (int32_t idx = 0; idx < output_count; idx++) { - assert(interp.tensor(id)->type == nnapi.tensor(id)->type); + auto const expected_tensor = TfLiteInterpreterGetOutputTensor(&expected, idx); + auto const obtained_tensor = TfLiteInterpreterGetOutputTensor(&obtained, idx); + auto const tensor_type = TfLiteTensorType(expected_tensor); + assert(tensor_type == TfLiteTensorType(obtained_tensor)); - auto it = comparators.find(interp.tensor(id)->type); + auto it = comparators.find(tensor_type); if (it == comparators.end()) { @@ -245,7 +251,7 @@ bool TfLiteInterpMatchApp::run(::tflite::Interpreter &interp, ::tflite::Interpre const auto &comparator = it->second; - if (!comparator(id, interp, nnapi)) + if (!comparator(idx, expected_tensor, obtained_tensor)) { all_matched = false; } diff --git a/runtime/libs/tflite/src/FeatureView.cpp b/runtime/libs/tflite/src/FeatureView.cpp deleted file mode 100644 index fdf5a4b00..000000000 --- a/runtime/libs/tflite/src/FeatureView.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "tflite/FeatureView.h" -#include "tflite/TensorUtils.h" - -#include <cassert> - -namespace nnfw -{ -namespace tflite -{ - -nnfw::misc::feature::Shape getFeatureShape(const TfLiteTensor *tensor) -{ - nnfw::misc::feature::Shape shape{tensor->dims->data[3], tensor->dims->data[1], - tensor->dims->data[2]}; - - return shape; -} - -FeatureView<float>::FeatureView(::tflite::Interpreter &interp, const InputIndex &index) -{ - const auto tensor_index = interp.inputs().at(index.asInt()); - auto tensor_ptr = interp.tensor(tensor_index); - - assert(isFloatTensor(tensor_ptr)); - assert(isFeatureTensor(tensor_ptr)); - - _shape = getFeatureShape(tensor_ptr); - _base = interp.typed_tensor<float>(tensor_index); -} - -FeatureView<float>::FeatureView(::tflite::Interpreter &interp, const OutputIndex &index) -{ - const auto tensor_index = interp.outputs().at(index.asInt()); - auto tensor_ptr = interp.tensor(tensor_index); - - assert(isFloatTensor(tensor_ptr)); - assert(isFeatureTensor(tensor_ptr)); - - _shape = getFeatureShape(tensor_ptr); - _base = interp.typed_tensor<float>(tensor_index); -} - -float FeatureView<float>::at(uint32_t ch, uint32_t row, uint32_t col) const -{ - return *(_base + getElementOffset(ch, row, col)); -} - -float &FeatureView<float>::at(uint32_t ch, uint32_t row, uint32_t col) -{ - return *(_base + getElementOffset(ch, row, col)); -} - -} // namespace tflite -} // namespace nnfw diff --git a/runtime/libs/tflite/src/Quantization.cpp b/runtime/libs/tflite/src/Quantization.cpp deleted file mode 100644 index 9c162c342..000000000 --- a/runtime/libs/tflite/src/Quantization.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "tflite/Quantization.h" - -TfLiteQuantizationParams make_default_quantization(void) -{ - return TfLiteQuantizationParams{0.0f, 0}; -} diff --git a/runtime/libs/tflite/src/RandomInputInitializer.cpp b/runtime/libs/tflite/src/RandomInputInitializer.cpp new file mode 100644 index 000000000..9ed90f38e --- /dev/null +++ b/runtime/libs/tflite/src/RandomInputInitializer.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "tflite/RandomInputInitializer.h" +#include "tflite/TensorView.h" + +#include <misc/tensor/IndexIterator.h> + +namespace nnfw +{ +namespace tflite +{ +namespace +{ + +template <typename T> +void setValue(nnfw::misc::RandomGenerator &randgen, const TfLiteTensor *tensor) +{ + auto tensor_view = nnfw::tflite::TensorView<T>::make(tensor); + + nnfw::misc::tensor::iterate(tensor_view.shape()) + << [&](const nnfw::misc::tensor::Index &ind) { tensor_view.at(ind) = randgen.generate<T>(); }; +} + +} // namespace + +void RandomInputInitializer::run(TfLiteInterpreter &interp) +{ + const auto input_count = TfLiteInterpreterGetInputTensorCount(&interp); + for (int32_t idx = 0; idx < input_count; idx++) + { + auto tensor = TfLiteInterpreterGetInputTensor(&interp, idx); + auto const tensor_type = TfLiteTensorType(tensor); + switch (tensor_type) + { + case kTfLiteFloat32: + setValue<float>(_randgen, tensor); + break; + case kTfLiteInt32: + setValue<int32_t>(_randgen, tensor); + break; + case kTfLiteUInt8: + setValue<uint8_t>(_randgen, tensor); + break; + case kTfLiteBool: + setValue<bool>(_randgen, tensor); + break; + case kTfLiteInt8: + setValue<int8_t>(_randgen, tensor); + break; + default: + throw std::runtime_error{"Not supported input type"}; + } + } +} + +} // namespace tflite +} // namespace nnfw diff --git a/runtime/libs/tflite/src/RandomTestRunner.cpp b/runtime/libs/tflite/src/RandomTestRunner.cpp deleted file mode 100644 index f7fccbf3b..000000000 --- a/runtime/libs/tflite/src/RandomTestRunner.cpp +++ /dev/null @@ -1,363 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "tflite/RandomTestRunner.h" -#include "tflite/Diff.h" -#include "tflite/TensorLogger.h" -#include "tflite/ext/nnapi_delegate.h" - -#include <misc/tensor/IndexIterator.h> -#include <misc/tensor/Object.h> -#include <misc/EnvVar.h> -#include <misc/fp32.h> - -#include <cassert> -#include <map> -#include <functional> -#include <iostream> - -namespace nnfw -{ -namespace tflite -{ - -using namespace std::placeholders; - -void RandomTestRunner::compile(const nnfw::tflite::Builder &builder) -{ - _tfl_interp = builder.build(); - _nnapi = builder.build(); - - _tfl_interp->UseNNAPI(false); - - // Allocate Tensors - _tfl_interp->AllocateTensors(); - _nnapi->AllocateTensors(); - - assert(_tfl_interp->inputs() == _nnapi->inputs()); - - using ::tflite::Interpreter; - using Initializer = std::function<void(int id, Interpreter *, Interpreter *)>; - - std::map<TfLiteType, Initializer> initializers; - std::map<TfLiteType, Initializer> reseters; - - // Generate singed 32-bit integer (s32) input - initializers[kTfLiteInt32] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteInt32); - assert(_nnapi->tensor(id)->type == kTfLiteInt32); - - auto tfl_interp_view = nnfw::tflite::TensorView<int32_t>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<int32_t>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - int32_t value = 0; - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - // TODO Generate random values - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - ++value; - }; - }; - - // Generate singed 32-bit integer (s32) input - reseters[kTfLiteInt32] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteInt32); - assert(_nnapi->tensor(id)->type == kTfLiteInt32); - - auto tfl_interp_view = nnfw::tflite::TensorView<int32_t>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<int32_t>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - int32_t value = 0; - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - // TODO Generate random values - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - initializers[kTfLiteUInt8] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteUInt8); - assert(_nnapi->tensor(id)->type == kTfLiteUInt8); - - auto tfl_interp_view = nnfw::tflite::TensorView<uint8_t>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<uint8_t>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - auto fp = static_cast<uint8_t (nnfw::misc::RandomGenerator::*)( - const ::nnfw::misc::tensor::Shape &, const ::nnfw::misc::tensor::Index &)>( - &nnfw::misc::RandomGenerator::generate<uint8_t>); - const nnfw::misc::tensor::Object<uint8_t> data(tfl_interp_view.shape(), - std::bind(fp, _randgen, _1, _2)); - assert(tfl_interp_view.shape() == data.shape()); - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - const auto value = data.at(ind); - - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - reseters[kTfLiteUInt8] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteUInt8); - assert(_nnapi->tensor(id)->type == kTfLiteUInt8); - - auto tfl_interp_view = nnfw::tflite::TensorView<uint8_t>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<uint8_t>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - auto fp = static_cast<uint8_t (nnfw::misc::RandomGenerator::*)( - const ::nnfw::misc::tensor::Shape &, const ::nnfw::misc::tensor::Index &)>( - &nnfw::misc::RandomGenerator::generate<uint8_t>); - const nnfw::misc::tensor::Object<uint8_t> data(tfl_interp_view.shape(), - std::bind(fp, _randgen, _1, _2)); - assert(tfl_interp_view.shape() == data.shape()); - - uint8_t value = 0; - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - initializers[kTfLiteFloat32] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteFloat32); - assert(_nnapi->tensor(id)->type == kTfLiteFloat32); - - auto tfl_interp_view = nnfw::tflite::TensorView<float>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<float>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - auto fp = static_cast<float (nnfw::misc::RandomGenerator::*)( - const ::nnfw::misc::tensor::Shape &, const ::nnfw::misc::tensor::Index &)>( - &nnfw::misc::RandomGenerator::generate<float>); - const nnfw::misc::tensor::Object<float> data(tfl_interp_view.shape(), - std::bind(fp, _randgen, _1, _2)); - - assert(tfl_interp_view.shape() == data.shape()); - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - const auto value = data.at(ind); - - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - reseters[kTfLiteFloat32] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteFloat32); - assert(_nnapi->tensor(id)->type == kTfLiteFloat32); - - auto tfl_interp_view = nnfw::tflite::TensorView<float>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<float>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - auto fp = static_cast<float (nnfw::misc::RandomGenerator::*)( - const ::nnfw::misc::tensor::Shape &, const ::nnfw::misc::tensor::Index &)>( - &nnfw::misc::RandomGenerator::generate<float>); - const nnfw::misc::tensor::Object<float> data(tfl_interp_view.shape(), - std::bind(fp, _randgen, _1, _2)); - - assert(tfl_interp_view.shape() == data.shape()); - - float value = 0; - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - initializers[kTfLiteBool] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteBool); - assert(_nnapi->tensor(id)->type == kTfLiteBool); - - auto tfl_interp_view = nnfw::tflite::TensorView<bool>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<bool>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - auto fp = static_cast<bool (nnfw::misc::RandomGenerator::*)( - const ::nnfw::misc::tensor::Shape &, const ::nnfw::misc::tensor::Index &)>( - &nnfw::misc::RandomGenerator::generate<bool>); - const nnfw::misc::tensor::Object<bool> data(tfl_interp_view.shape(), - std::bind(fp, _randgen, _1, _2)); - - assert(tfl_interp_view.shape() == data.shape()); - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - const auto value = data.at(ind); - - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - reseters[kTfLiteBool] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteBool); - assert(_nnapi->tensor(id)->type == kTfLiteBool); - - auto tfl_interp_view = nnfw::tflite::TensorView<bool>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<bool>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - auto fp = static_cast<bool (nnfw::misc::RandomGenerator::*)( - const ::nnfw::misc::tensor::Shape &, const ::nnfw::misc::tensor::Index &)>( - &nnfw::misc::RandomGenerator::generate<bool>); - const nnfw::misc::tensor::Object<bool> data(tfl_interp_view.shape(), - std::bind(fp, _randgen, _1, _2)); - - assert(tfl_interp_view.shape() == data.shape()); - - bool value = false; - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - // Fill IFM with random numbers - for (const auto id : _tfl_interp->inputs()) - { - assert(_tfl_interp->tensor(id)->type == _nnapi->tensor(id)->type); - - auto it = initializers.find(_tfl_interp->tensor(id)->type); - - if (it == initializers.end()) - { - throw std::runtime_error{"Not supported input type"}; - } - - it->second(id, _tfl_interp.get(), _nnapi.get()); - } - - // Fill OFM with 0 - for (const auto id : _tfl_interp->outputs()) - { - assert(_tfl_interp->tensor(id)->type == _nnapi->tensor(id)->type); - - auto it = reseters.find(_tfl_interp->tensor(id)->type); - - if (it == reseters.end()) - { - throw std::runtime_error{"Not supported input type"}; - } - - it->second(id, _tfl_interp.get(), _nnapi.get()); - } -} - -int RandomTestRunner::run(size_t running_count) -{ - std::cout << "[NNAPI TEST] Run T/F Lite Interpreter without NNAPI" << std::endl; - _tfl_interp->Invoke(); - - nnfw::tflite::NNAPIDelegate d; - - for (size_t i = 1; i <= running_count; ++i) - { - std::cout << "[NNAPI TEST #" << i << "] Run T/F Lite Interpreter with NNAPI" << std::endl; - - char *env = getenv("UPSTREAM_DELEGATE"); - - if (env && !std::string(env).compare("1")) - { - _nnapi->UseNNAPI(true); - _nnapi->Invoke(); - } - else - { - // WARNING - // primary_subgraph: Experimental interface. Return 1st sugbraph - // Invoke() will call BuildGraph() internally - if (d.Invoke(&_nnapi.get()->primary_subgraph())) - { - throw std::runtime_error{"Failed to BuildGraph"}; - } - } - - // Compare OFM - std::cout << "[NNAPI TEST #" << i << "] Compare the result" << std::endl; - - const auto tolerance = _param.tolerance; - - auto equals = [tolerance](float lhs, float rhs) { - // NOTE Hybrid approach - // TODO Allow users to set tolerance for absolute_epsilon_equal - if (nnfw::misc::fp32::absolute_epsilon_equal(lhs, rhs)) - { - return true; - } - - return nnfw::misc::fp32::epsilon_equal(lhs, rhs, tolerance); - }; - - nnfw::misc::tensor::Comparator comparator(equals); - TfLiteInterpMatchApp app(comparator); - - app.verbose() = _param.verbose; - - bool res = app.run(*_tfl_interp, *_nnapi); - - if (!res) - { - return 255; - } - - std::cout << "[NNAPI TEST #" << i << "] PASSED" << std::endl << std::endl; - - if (_param.tensor_logging) - nnfw::tflite::TensorLogger::get().save(_param.log_path, *_tfl_interp); - } - - return 0; -} - -RandomTestRunner RandomTestRunner::make(uint32_t seed) -{ - RandomTestParam param; - - param.verbose = nnfw::misc::EnvVar("VERBOSE").asInt(0); - param.tolerance = nnfw::misc::EnvVar("TOLERANCE").asInt(1); - param.tensor_logging = nnfw::misc::EnvVar("TENSOR_LOGGING").asBool(false); - param.log_path = nnfw::misc::EnvVar("TENSOR_LOGGING").asString("tensor_log.txt"); - - return RandomTestRunner{seed, param}; -} - -} // namespace tflite -} // namespace nnfw diff --git a/runtime/libs/tflite/src/TensorShapeUtils.cpp b/runtime/libs/tflite/src/TensorShapeUtils.cpp deleted file mode 100644 index 689b6151b..000000000 --- a/runtime/libs/tflite/src/TensorShapeUtils.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "tflite/TensorShapeUtils.h" - -namespace nnfw -{ -namespace tflite -{ - -nnfw::misc::tensor::Shape broadcast(const nnfw::misc::tensor::Shape &lhs_shape, - const nnfw::misc::tensor::Shape &rhs_shape) -{ - const uint32_t lhs_rank = lhs_shape.rank(); - const uint32_t rhs_rank = rhs_shape.rank(); - const uint32_t out_rank = std::max(lhs_rank, rhs_rank); - const uint32_t lhs_rank_diff = out_rank - lhs_rank; - const uint32_t rhs_rank_diff = out_rank - rhs_rank; - - nnfw::misc::tensor::Shape out_shape(out_rank); - - for (uint32_t axis = 0; axis < out_rank; ++axis) - { - out_shape.dim(axis) = std::max(axis < lhs_rank_diff ? 1 : lhs_shape.dim(axis - lhs_rank_diff), - axis < rhs_rank_diff ? 1 : rhs_shape.dim(axis - rhs_rank_diff)); - } - - return out_shape; -} - -} // namespace tflite -} // namespace nnfw diff --git a/runtime/libs/tflite/src/interp/FlatBufferBuilder.cpp b/runtime/libs/tflite/src/interp/FlatBufferBuilder.cpp deleted file mode 100644 index f54e67202..000000000 --- a/runtime/libs/tflite/src/interp/FlatBufferBuilder.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "tflite/interp/FlatBufferBuilder.h" - -#include "tflite/ext/kernels/register.h" - -namespace nnfw -{ -namespace tflite -{ - -std::unique_ptr<::tflite::Interpreter> FlatBufferBuilder::build(void) const -{ - std::unique_ptr<::tflite::Interpreter> interpreter; - - nnfw::tflite::BuiltinOpResolver resolver; - - ::tflite::InterpreterBuilder builder(_model, resolver); - - builder(&interpreter); - - return interpreter; -} - -} // namespace tflite -} // namespace nnfw diff --git a/runtime/libs/tflite/src/interp/FunctionBuilder.cpp b/runtime/libs/tflite/src/interp/FunctionBuilder.cpp deleted file mode 100644 index 599a4f393..000000000 --- a/runtime/libs/tflite/src/interp/FunctionBuilder.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "tflite/interp/FunctionBuilder.h" - -namespace nnfw -{ -namespace tflite -{ - -std::unique_ptr<::tflite::Interpreter> FunctionBuilder::build(void) const -{ - auto res = std::unique_ptr<::tflite::Interpreter>{new ::tflite::Interpreter}; - - _fn(*res); - - return res; -} - -} // namespace tflite -} // namespace nnfw |