From 32d0b5af61d978d9932ac5576b42203e57881168 Mon Sep 17 00:00:00 2001 From: Jeremy Johnson Date: Thu, 1 Feb 2024 15:54:07 +0000 Subject: Main Compliance: Add RESIZE support Add RELATIVE verify mode for RESIZE. Signed-off-by: Jeremy Johnson Change-Id: I4fe352579507211dae7a048bf080c24426ce42a2 --- reference_model/src/generate/generate_utils.cc | 5 +- reference_model/src/verify/verifiers.h | 11 ++++ reference_model/src/verify/verify_entry.cc | 3 + reference_model/src/verify/verify_relative.cc | 83 ++++++++++++++++++++++++++ reference_model/src/verify/verify_utils.cc | 11 ++++ reference_model/src/verify/verify_utils.h | 13 +++- 6 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 reference_model/src/verify/verify_relative.cc (limited to 'reference_model/src') diff --git a/reference_model/src/generate/generate_utils.cc b/reference_model/src/generate/generate_utils.cc index cf5308b..8b16e97 100644 --- a/reference_model/src/generate/generate_utils.cc +++ b/reference_model/src/generate/generate_utils.cc @@ -71,14 +71,15 @@ NLOHMANN_JSON_SERIALIZE_ENUM(Op, { Op::Op_PAD, "PAD" }, { Op::Op_POW, "POW" }, { Op::Op_RECIPROCAL, "RECIPROCAL" }, - { Op::Op_RESHAPE, "RESHAPE" }, - { Op::Op_RSQRT, "RSQRT" }, { Op::Op_REDUCE_MAX, "REDUCE_MAX" }, { Op::Op_REDUCE_MIN, "REDUCE_MIN" }, { Op::Op_REDUCE_PRODUCT, "REDUCE_PRODUCT" }, { Op::Op_REDUCE_SUM, "REDUCE_SUM" }, + { Op::Op_RESHAPE, "RESHAPE" }, + { Op::Op_RESIZE, "RESIZE" }, { Op::Op_REVERSE, "REVERSE" }, { Op::Op_RFFT2D, "RFFT2D" }, + { Op::Op_RSQRT, "RSQRT" }, { Op::Op_SCATTER, "SCATTER" }, { Op::Op_SELECT, "SELECT" }, { Op::Op_SIGMOID, "SIGMOID" }, diff --git a/reference_model/src/verify/verifiers.h b/reference_model/src/verify/verifiers.h index 6830115..80b6e19 100644 --- a/reference_model/src/verify/verifiers.h +++ b/reference_model/src/verify/verifiers.h @@ -71,6 +71,17 @@ bool verifyULP(const CTensor* referenceTensor, const CTensor* implementationTens /// \return True if compliant else false bool verifyAbsError(const CTensor* ref, const CTensor* refBnd, const CTensor* imp, const AbsErrorVerifyInfo& aeInfo); +/// \brief Perform relative result verification +/// +/// \param referenceTensor Reference tensor +/// \param implementationTensor Implementation resulting tensor +/// \param rInfo Relative verification meta-data +/// +/// \return True if compliant else false +bool verifyRelative(const CTensor* referenceTensor, + const CTensor* implementationTensor, + const RelativeVerifyInfo& rInfo); + }; // namespace TosaReference #endif // VERIFIERS_H_ diff --git a/reference_model/src/verify/verify_entry.cc b/reference_model/src/verify/verify_entry.cc index afc5916..9702c36 100644 --- a/reference_model/src/verify/verify_entry.cc +++ b/reference_model/src/verify/verify_entry.cc @@ -43,6 +43,9 @@ bool verify(const CTensor* ref, const CTensor* refBnd, const CTensor* imp, const case VerifyMode::AbsError: { return verifyAbsError(ref, refBnd, imp, cfg.absErrorInfo); } + case VerifyMode::Relative: { + return verifyRelative(ref, imp, cfg.relativeInfo); + } default: { WARNING("[Verifier] Unsupported verification mode."); break; diff --git a/reference_model/src/verify/verify_relative.cc b/reference_model/src/verify/verify_relative.cc new file mode 100644 index 0000000..b12daf7 --- /dev/null +++ b/reference_model/src/verify/verify_relative.cc @@ -0,0 +1,83 @@ + +// Copyright (c) 2024, ARM Limited. +// +// 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 +#include + +#include "verifiers.h" +#include "verify/verify_utils.h" + +namespace TosaReference +{ + +namespace +{ +template +bool validateData(const double* ref, + const OutDtype* imp, + const std::vector& shape, + const RelativeVerifyInfo& cfg) +{ + const size_t T = static_cast(numElements(shape)); + TOSA_REF_REQUIRE(T > 0, "[R] Invalid shape for reference tensor"); + + double errBound = cfg.max * cfg.scale; + for (size_t i = 0; i < T; ++i) + { + bool valid = tosaCheckFloatBound(imp[i], ref[i], errBound); + if (!valid) + { + auto pos = indexToPosition(i, shape); + WARNING("[Verifier][RP] Location %s", positionToString(pos).c_str()); + return false; + } + } + return true; +} +} // namespace + +bool verifyRelative(const CTensor* referenceTensor, + const CTensor* implementationTensor, + const RelativeVerifyInfo& rInfo) +{ + // Validate that tensors are provided + TOSA_REF_REQUIRE(referenceTensor != nullptr, "[R] Reference tensor is missing"); + TOSA_REF_REQUIRE(implementationTensor != nullptr, "[R] Implementation tensor is missing"); + + const std::vector refShape(referenceTensor->shape, referenceTensor->shape + referenceTensor->num_dims); + + const double* refData = reinterpret_cast(referenceTensor->data); + TOSA_REF_REQUIRE(refData != nullptr, "[R] Missing data for reference"); + + switch (implementationTensor->data_type) + { + case tosa_datatype_fp32_t: { + const auto* impData = reinterpret_cast(implementationTensor->data); + TOSA_REF_REQUIRE(impData != nullptr, "[R] Missing data for implementation"); + return validateData(refData, impData, refShape, rInfo); + } + case tosa_datatype_fp16_t: { + const auto* impData = reinterpret_cast(implementationTensor->data); + TOSA_REF_REQUIRE(impData != nullptr, "[R] Missing data for implementation"); + return validateData(refData, impData, refShape, rInfo); + } + default: + WARNING("[Verifier][R] Data-type not supported."); + break; + } + + return false; +} +} // namespace TosaReference diff --git a/reference_model/src/verify/verify_utils.cc b/reference_model/src/verify/verify_utils.cc index abb55eb..14bc6f1 100644 --- a/reference_model/src/verify/verify_utils.cc +++ b/reference_model/src/verify/verify_utils.cc @@ -52,6 +52,7 @@ NLOHMANN_JSON_SERIALIZE_ENUM(VerifyMode, { VerifyMode::FpSpecial, "FP_SPECIAL" }, { VerifyMode::ReduceProduct, "REDUCE_PRODUCT" }, { VerifyMode::AbsError, "ABS_ERROR" }, + { VerifyMode::Relative, "RELATIVE" }, }) void from_json(const nlohmann::json& j, UlpVerifyInfo& ulpInfo) @@ -78,6 +79,12 @@ void from_json(const nlohmann::json& j, AbsErrorVerifyInfo& absErrorInfo) } } +void from_json(const nlohmann::json& j, RelativeVerifyInfo& rInfo) +{ + j.at("max").get_to(rInfo.max); + j.at("scale").get_to(rInfo.scale); +} + void from_json(const nlohmann::json& j, VerifyConfig& cfg) { j.at("mode").get_to(cfg.mode); @@ -100,6 +107,10 @@ void from_json(const nlohmann::json& j, VerifyConfig& cfg) { j.at("abs_error_info").get_to(cfg.absErrorInfo); } + if (j.contains("relative_info")) + { + j.at("relative_info").get_to(cfg.relativeInfo); + } } std::optional parseVerifyConfig(const char* tensorName, const char* json) diff --git a/reference_model/src/verify/verify_utils.h b/reference_model/src/verify/verify_utils.h index 0fc68fb..341bd90 100644 --- a/reference_model/src/verify/verify_utils.h +++ b/reference_model/src/verify/verify_utils.h @@ -46,7 +46,8 @@ enum class VerifyMode DotProduct, FpSpecial, ReduceProduct, - AbsError + AbsError, + Relative }; /// \brief ULP verification meta-data @@ -83,6 +84,15 @@ struct AbsErrorVerifyInfo double lowerBound; }; +/// \brief relative verification meta-data +struct RelativeVerifyInfo +{ + RelativeVerifyInfo() = default; + + double max; + double scale; +}; + /// \brief Verification meta-data struct VerifyConfig { @@ -94,6 +104,7 @@ struct VerifyConfig DotProductVerifyInfo dotProductInfo; ReduceProductVerifyInfo reduceProductInfo; AbsErrorVerifyInfo absErrorInfo; + RelativeVerifyInfo relativeInfo; }; /// \brief Parse the verification config for a tensor when given in JSON form -- cgit v1.2.1