forked from openvinotoolkit/openvino
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Alexandru Enache <[email protected]>
- Loading branch information
1 parent
99b823b
commit eea8d49
Showing
3 changed files
with
269 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
// Copyright (C) 2018-2024 Intel Corporation | ||
// SPDX-License-Identifier: Apache-2.0 | ||
// | ||
|
||
#include "metadata.hpp" | ||
|
||
#include <cstring> | ||
#include <sstream> | ||
|
||
#include "intel_npu/config/config.hpp" | ||
#include "intel_npu/utils/logger/logger.hpp" | ||
#include "openvino/core/version.hpp" | ||
|
||
namespace intel_npu { | ||
|
||
OpenvinoVersion::OpenvinoVersion(std::string_view version) | ||
: _version(version), | ||
_size(static_cast<uint32_t>(version.size())) {} | ||
|
||
void OpenvinoVersion::read(std::istream& stream) { | ||
stream.read(reinterpret_cast<char*>(&_size), sizeof(_size)); | ||
_version.resize(_size); | ||
stream.read(_version.data(), _size); | ||
} | ||
|
||
Metadata<METADATA_VERSION_1_0>::Metadata() | ||
: _version{METADATA_VERSION_1_0}, | ||
_ovVersion{ov::get_openvino_version().buildNumber} {} | ||
|
||
void Metadata<METADATA_VERSION_1_0>::read(std::istream& stream) { | ||
_ovVersion.read(stream); | ||
} | ||
|
||
uint32_t& OpenvinoVersion::get_size() { | ||
return _size; | ||
} | ||
|
||
void Metadata<METADATA_VERSION_1_0>::write(std::ostream& stream) { | ||
stream.write(reinterpret_cast<const char*>(&_version), sizeof(_version)); | ||
stream.write(reinterpret_cast<const char*>(&_ovVersion.get_size()), sizeof(_ovVersion.get_size())); | ||
stream.write(_ovVersion.get_version().data(), _ovVersion.get_version().size()); | ||
} | ||
|
||
std::unique_ptr<MetadataBase> create_metadata(uint32_t version) { | ||
switch (version) { | ||
case METADATA_VERSION_1_0: | ||
return std::make_unique<Metadata<METADATA_VERSION_1_0>>(); | ||
|
||
default: | ||
OPENVINO_THROW("Invalid metadata version!"); | ||
} | ||
} | ||
|
||
std::string OpenvinoVersion::get_version() { | ||
return _version; | ||
} | ||
|
||
bool Metadata<METADATA_VERSION_1_0>::is_compatible() { | ||
Logger logger("NPUPlugin", Logger::global().level()); | ||
// checking if we can import the blob | ||
if (_ovVersion.get_version() != ov::get_openvino_version().buildNumber) { | ||
logger.warning("Imported blob OpenVINO version: %s, but the current OpenVINO version is: %s", | ||
_ovVersion.get_version().c_str(), | ||
ov::get_openvino_version().buildNumber); | ||
|
||
#ifdef NPU_PLUGIN_DEVELOPER_BUILD | ||
if (auto envVar = std::getenv("NPU_DISABLE_VERSION_CHECK")) { | ||
if (envVarStrToBool("NPU_DISABLE_VERSION_CHECK", envVar)) { | ||
return true; | ||
} | ||
} | ||
#endif | ||
return false; | ||
} | ||
return true; | ||
} | ||
|
||
std::unique_ptr<MetadataBase> read_metadata_from(const std::vector<uint8_t>& blob) { | ||
Logger logger("NPUPlugin", Logger::global().level()); | ||
size_t magicBytesSize = MAGIC_BYTES.size(); | ||
std::string blobMagicBytes; | ||
blobMagicBytes.resize(magicBytesSize); | ||
|
||
auto metadataIterator = blob.end() - magicBytesSize; | ||
std::memcpy(blobMagicBytes.data(), &(*metadataIterator), magicBytesSize); | ||
if (MAGIC_BYTES != blobMagicBytes) { | ||
OPENVINO_THROW("Blob is missing NPU metadata!"); | ||
} | ||
|
||
uint64_t blobDataSize; | ||
metadataIterator -= sizeof(blobDataSize); | ||
std::memcpy(&blobDataSize, &(*metadataIterator), sizeof(blobDataSize)); | ||
metadataIterator = blob.begin() + blobDataSize; | ||
|
||
std::stringstream metadataStream; | ||
metadataStream.write(reinterpret_cast<const char*>(&(*metadataIterator)), | ||
blob.end() - metadataIterator - sizeof(blobDataSize)); | ||
|
||
uint32_t metaVersion; | ||
metadataStream.read(reinterpret_cast<char*>(&metaVersion), sizeof(metaVersion)); | ||
|
||
std::unique_ptr<MetadataBase> storedMeta; | ||
try { | ||
storedMeta = create_metadata(metaVersion); | ||
storedMeta->read(metadataStream); | ||
} catch(...) { | ||
logger.warning("Imported blob metadata version: %d.%d, but the current version is: %d.%d", | ||
get_major(metaVersion), | ||
get_minor(metaVersion), | ||
get_major(CURRENT_METADATA_VERSION), | ||
get_minor(CURRENT_METADATA_VERSION)); | ||
} | ||
return storedMeta; | ||
} | ||
|
||
void Metadata<METADATA_VERSION_1_0>::set_version(uint32_t newVersion) { | ||
_version = newVersion; | ||
} | ||
|
||
void Metadata<METADATA_VERSION_1_0>::set_ov_version(const OpenvinoVersion& newVersion) { | ||
_ovVersion = newVersion; | ||
} | ||
|
||
} // namespace intel_npu |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
// Copyright (C) 2018-2024 Intel Corporation | ||
// SPDX-License-Identifier: Apache-2.0 | ||
// | ||
|
||
#include <gtest/gtest.h> | ||
|
||
#include "common_test_utils/test_assertions.hpp" | ||
#include "metadata.hpp" | ||
|
||
using namespace intel_npu; | ||
|
||
using MetadataUnitTests = ::testing::Test; | ||
|
||
struct MetadataTest : Metadata<CURRENT_METADATA_VERSION> { | ||
void set_version(uint32_t newVersion) { | ||
_version = newVersion; | ||
} | ||
|
||
void set_ov_version(const OpenvinoVersion& newVersion) { | ||
_ovVersion = newVersion; | ||
} | ||
}; | ||
|
||
TEST_F(MetadataUnitTests, readUnversionedBlob) { | ||
std::vector<uint8_t> blob(50, 68); | ||
|
||
std::unique_ptr<MetadataBase> storedMeta; | ||
ASSERT_ANY_THROW(storedMeta = read_metadata_from(blob)); | ||
ASSERT_EQ(storedMeta, nullptr); | ||
} | ||
|
||
TEST_F(MetadataUnitTests, writeAndReadMetadataFromBlob) { | ||
std::stringstream stream; | ||
size_t blobSize = 0; | ||
auto meta = MetadataTest(); | ||
|
||
OV_ASSERT_NO_THROW(meta.write(stream)); | ||
OV_ASSERT_NO_THROW(stream.write(reinterpret_cast<const char*>(&blobSize), sizeof(blobSize))); | ||
OV_ASSERT_NO_THROW(stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size())); | ||
|
||
blobSize = stream.str().length(); | ||
|
||
std::vector<uint8_t> blob(blobSize); | ||
OV_ASSERT_NO_THROW(stream.read(reinterpret_cast<char*>(blob.data()), blobSize)); | ||
auto storedMeta = read_metadata_from(blob); | ||
ASSERT_NE(storedMeta, nullptr); | ||
ASSERT_TRUE(storedMeta->is_compatible()); | ||
} | ||
|
||
TEST_F(MetadataUnitTests, writeAndReadInvalidOpenvinoVersion) { | ||
size_t blobSize = 0; | ||
std::stringstream stream; | ||
auto meta = MetadataTest(); | ||
|
||
OpenvinoVersion badOvVersion("just_some_wrong_ov_version"); | ||
meta.set_ov_version(badOvVersion); | ||
|
||
OV_ASSERT_NO_THROW(meta.write(stream)); | ||
OV_ASSERT_NO_THROW(stream.write(reinterpret_cast<const char*>(&blobSize), sizeof(blobSize))); | ||
OV_ASSERT_NO_THROW(stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size())); | ||
|
||
blobSize = stream.str().length(); | ||
|
||
std::vector<uint8_t> blob(blobSize); | ||
OV_ASSERT_NO_THROW(stream.read(reinterpret_cast<char*>(blob.data()), blobSize)); | ||
auto storedMeta = read_metadata_from(blob); | ||
ASSERT_NE(storedMeta, nullptr); | ||
ASSERT_FALSE(storedMeta->is_compatible()); | ||
} | ||
|
||
TEST_F(MetadataUnitTests, writeAndReadInvalidMetadataVersion) { | ||
size_t blobSize = 0; | ||
std::stringstream stream; | ||
auto meta = Metadata<CURRENT_METADATA_VERSION>(); | ||
|
||
constexpr uint32_t dummy_version = make_version(0x00007E57, 0x0000AC3D); | ||
meta.set_version(dummy_version); | ||
|
||
OV_ASSERT_NO_THROW(meta.write(stream)); | ||
OV_ASSERT_NO_THROW(stream.write(reinterpret_cast<const char*>(&blobSize), sizeof(blobSize))); | ||
OV_ASSERT_NO_THROW(stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size())); | ||
|
||
blobSize = stream.str().length(); | ||
|
||
std::vector<uint8_t> blob(blobSize); | ||
OV_ASSERT_NO_THROW(stream.read(reinterpret_cast<char*>(blob.data()), blobSize)); | ||
auto storedMeta = read_metadata_from(blob); | ||
ASSERT_EQ(storedMeta, nullptr); | ||
} |