From 39c865b3aa8587d426e726380e5e6f70ac4b6f6d Mon Sep 17 00:00:00 2001 From: Xusong Wang Date: Tue, 28 Aug 2018 16:50:01 -0700 Subject: [PATCH] Fix logics for floating-point comparision in VTS test. Set the acceptable error range based on both absolute tolerance and relative tolerance. Currently, absolute tolerance is set to 1e-5 for FP32 and 5 epsilon (~5e-3) for FP16 relaxed computation. The relative tolerance is set to 5ULP of the corresponding precision. Add a TODO mark for potential future adjustment on error limit based on testing. Bug: 111768023 Test: none Change-Id: Idedcec3e09fd7de9696811b93c81d0f180e896ef --- .../vts/functional/GeneratedTestHarness.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp index 0682ab95b2..64495cf763 100644 --- a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp @@ -66,8 +66,8 @@ void copy_back(MixedTyped* dst, const std::vector& ra, char* sr // Top level driver for models and examples generated by test_generator.py // Test driver for those generated from ml/nn/runtime/test/spec void EvaluatePreparedModel(sp& preparedModel, std::function is_ignored, - const std::vector& examples, - float fpRange = 1e-5f) { + const std::vector& examples, float fpAtol = 1e-5f, + float fpRtol = 1e-5f) { const uint32_t INPUT = 0; const uint32_t OUTPUT = 1; @@ -175,7 +175,7 @@ void EvaluatePreparedModel(sp& preparedModel, std::function& device, std::function c EXPECT_EQ(ErrorStatus::NONE, prepareReturnStatus); ASSERT_NE(nullptr, preparedModel.get()); - EvaluatePreparedModel(preparedModel, is_ignored, examples); + float fpAtol = 1e-5f, fpRtol = 5.0f * 1.1920928955078125e-7f; + EvaluatePreparedModel(preparedModel, is_ignored, examples, fpAtol, fpRtol); } void Execute(const sp& device, std::function create_model, @@ -265,9 +266,13 @@ void Execute(const sp& device, std::function c EXPECT_EQ(ErrorStatus::NONE, prepareReturnStatus); ASSERT_NE(nullptr, preparedModel.get()); - // If in relaxed mode, set the error range to be 5ULP of FP16. - float fpRange = !model.relaxComputationFloat32toFloat16 ? 1e-5f : 5.0f * 0.0009765625f; - EvaluatePreparedModel(preparedModel, is_ignored, examples, fpRange); + // TODO: Adjust the error limit based on testing. + // If in relaxed mode, set the absolute tolerance to be 5ULP of FP16. + float fpAtol = !model.relaxComputationFloat32toFloat16 ? 1e-5f : 5.0f * 0.0009765625f; + // Set the relative tolerance to be 5ULP of the corresponding FP precision. + float fpRtol = !model.relaxComputationFloat32toFloat16 ? 5.0f * 1.1920928955078125e-7f + : 5.0f * 0.0009765625f; + EvaluatePreparedModel(preparedModel, is_ignored, examples, fpAtol, fpRtol); } } // namespace generated_tests