diff --git a/src/plugins/intel_npu/src/plugin/include/metadata.hpp b/src/plugins/intel_npu/src/plugin/include/metadata.hpp index 05e45f1c2436ee..ee0940a59dd738 100644 --- a/src/plugins/intel_npu/src/plugin/include/metadata.hpp +++ b/src/plugins/intel_npu/src/plugin/include/metadata.hpp @@ -102,8 +102,6 @@ struct MetadataBase { virtual uint64_t get_blob_size() const = 0; - virtual size_t get_ov_header_offset() const = 0; - virtual ~MetadataBase() = default; }; @@ -123,13 +121,10 @@ struct Metadata : public MetadataBase { private: uint64_t _blobDataSize; uint32_t _version; - size_t _ovHeaderOffset; OpenvinoVersion _ovVersion; public: - Metadata(); - - Metadata(size_t ovHeaderOffset, uint64_t blobDataSize); + Metadata(uint64_t blobDataSize); void read(std::istream& stream) override; @@ -154,8 +149,6 @@ struct Metadata : public MetadataBase { void set_ov_version(const OpenvinoVersion& newVersion); uint64_t get_blob_size() const override; - - size_t get_ov_header_offset() const override; }; /** @@ -164,7 +157,7 @@ struct Metadata : public MetadataBase { * @return Unique pointer to the created MetadataBase object if the major version is supported; otherwise, returns * 'nullptr'. */ -std::unique_ptr create_metadata(uint32_t version, size_t ovHeaderOffset, uint64_t blobDataSize); +std::unique_ptr create_metadata(uint32_t version, uint64_t blobDataSize); /** * @brief Reads metadata from a blob. @@ -174,6 +167,4 @@ std::unique_ptr create_metadata(uint32_t version, size_t ovHeaderO */ std::unique_ptr read_metadata_from(std::istream& stream); -std::unique_ptr read_metadata_from(std::istream& stream, const std::shared_ptr& modelBuffer); - } // namespace intel_npu diff --git a/src/plugins/intel_npu/src/plugin/src/compiled_model.cpp b/src/plugins/intel_npu/src/plugin/src/compiled_model.cpp index 7d46e14db8a980..c14a0012e7fb3d 100644 --- a/src/plugins/intel_npu/src/plugin/src/compiled_model.cpp +++ b/src/plugins/intel_npu/src/plugin/src/compiled_model.cpp @@ -75,10 +75,8 @@ void CompiledModel::export_model(std::ostream& stream) const { _logger.debug("CompiledModel::export_model"); size_t blobSizeBeforeVersioning = _graph->export_blob(stream); - auto meta = Metadata(); + auto meta = Metadata(blobSizeBeforeVersioning); meta.write(stream); - stream.write(reinterpret_cast(&blobSizeBeforeVersioning), sizeof(blobSizeBeforeVersioning)); - stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size()); } std::shared_ptr CompiledModel::get_runtime_model() const { diff --git a/src/plugins/intel_npu/src/plugin/src/metadata.cpp b/src/plugins/intel_npu/src/plugin/src/metadata.cpp index eb04a46c3a00c4..ad9825293c2d5d 100644 --- a/src/plugins/intel_npu/src/plugin/src/metadata.cpp +++ b/src/plugins/intel_npu/src/plugin/src/metadata.cpp @@ -14,15 +14,20 @@ namespace { -size_t getFileSize(std::istream& stream) { +std::streampos getFileSize(std::istream& stream) { auto log = intel_npu::Logger::global().clone("getFileSize"); if (!stream) { OPENVINO_THROW("Stream is in bad status! Please check the passed stream status!"); } - const size_t streamStart = stream.tellg(); + if (stream.rdbuf()->in_avail() != 0) { + // ov::OwningSharedStreamBuffer scenario + return stream.rdbuf()->in_avail() + stream.tellg(); + } + + const std::streampos streamStart = stream.tellg(); stream.seekg(0, std::ios_base::end); - const size_t streamEnd = stream.tellg(); + const std::streampos streamEnd = stream.tellg(); stream.seekg(streamStart, std::ios_base::beg); log.debug("Read blob size: streamStart=%zu, streamEnd=%zu", streamStart, streamEnd); @@ -52,16 +57,9 @@ void OpenvinoVersion::read(std::istream& stream) { stream.read(_version.data(), _size); } -Metadata::Metadata() - : _blobDataSize{0}, - _version{METADATA_VERSION_1_0}, - _ovHeaderOffset{0}, - _ovVersion{ov::get_openvino_version().buildNumber} {} - -Metadata::Metadata(size_t ovHeaderOffset, uint64_t blobDataSize) +Metadata::Metadata(uint64_t blobDataSize) : _blobDataSize{blobDataSize}, _version{METADATA_VERSION_1_0}, - _ovHeaderOffset{ovHeaderOffset}, _ovVersion{ov::get_openvino_version().buildNumber} {} void Metadata::read(std::istream& stream) { @@ -76,12 +74,14 @@ void Metadata::write(std::ostream& stream) { stream.write(reinterpret_cast(&_version), sizeof(_version)); stream.write(reinterpret_cast(&_ovVersion.get_size()), sizeof(_ovVersion.get_size())); stream.write(_ovVersion.get_version().data(), _ovVersion.get_version().size()); + stream.write(reinterpret_cast(&_blobDataSize), sizeof(_blobDataSize)); + stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size()); } -std::unique_ptr create_metadata(uint32_t version, size_t ovHeaderOffset, uint64_t blobDataSize) { +std::unique_ptr create_metadata(uint32_t version, uint64_t blobDataSize) { switch (version) { case METADATA_VERSION_1_0: - return std::make_unique>(ovHeaderOffset, blobDataSize); + return std::make_unique>(blobDataSize); default: return nullptr; @@ -118,9 +118,9 @@ std::unique_ptr read_metadata_from(std::istream& stream) { std::string blobMagicBytes; blobMagicBytes.resize(magicBytesSize); - size_t currentStreamPos = stream.tellg(); - size_t streamSize = getFileSize(stream); - stream.seekg(streamSize - magicBytesSize, std::ios::beg); + std::streampos currentStreamPos = stream.tellg(); + std::streampos streamSize = getFileSize(stream); + stream.seekg(-currentStreamPos + streamSize - magicBytesSize, std::ios::cur); stream.read(blobMagicBytes.data(), magicBytesSize); if (MAGIC_BYTES != blobMagicBytes) { logger.error("Blob is missing NPU metadata!"); @@ -128,53 +128,14 @@ std::unique_ptr read_metadata_from(std::istream& stream) { } uint64_t blobDataSize; - stream.seekg(streamSize - magicBytesSize - sizeof(blobDataSize), std::ios::beg); + stream.seekg(-std::streampos(magicBytesSize) - sizeof(blobDataSize), std::ios::cur); stream.read(reinterpret_cast(&blobDataSize), sizeof(blobDataSize)); - stream.seekg(currentStreamPos + blobDataSize, std::ios::beg); + stream.seekg(-stream.tellg() + currentStreamPos + blobDataSize, std::ios::cur); uint32_t metaVersion; stream.read(reinterpret_cast(&metaVersion), sizeof(metaVersion)); - auto storedMeta = create_metadata(metaVersion, currentStreamPos, blobDataSize); - if (storedMeta != nullptr) { - storedMeta->read(stream); - } else { - 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)); - } - stream.seekg(currentStreamPos, std::ios::beg); - return storedMeta; -} - -std::unique_ptr read_metadata_from(std::istream& stream, const std::shared_ptr& modelBuffer) { - Logger logger("NPUPlugin", Logger::global().level()); - if (modelBuffer == nullptr) { - return read_metadata_from(stream); - } - size_t magicBytesSize = MAGIC_BYTES.size(); - std::string blobMagicBytes; - blobMagicBytes.resize(magicBytesSize); - - size_t currentStreamPos = stream.tellg(); - size_t streamSize = modelBuffer->size(); - - blobMagicBytes.assign(reinterpret_cast(modelBuffer->get_ptr(streamSize - magicBytesSize)), magicBytesSize); - if (MAGIC_BYTES != blobMagicBytes) { - logger.error("Blob is missing NPU metadata!"); - return nullptr; - } - - uint64_t blobDataSize; - blobDataSize = *reinterpret_cast(modelBuffer->get_ptr(streamSize - magicBytesSize - sizeof(blobDataSize))); - - uint32_t metaVersion; - metaVersion = *reinterpret_cast(modelBuffer->get_ptr(currentStreamPos + blobDataSize)); - - auto storedMeta = create_metadata(metaVersion, currentStreamPos, blobDataSize); - stream.seekg(blobDataSize + sizeof(metaVersion), std::ios::cur); + auto storedMeta = create_metadata(metaVersion, blobDataSize); if (storedMeta != nullptr) { storedMeta->read(stream); } else { @@ -184,6 +145,7 @@ std::unique_ptr read_metadata_from(std::istream& stream, const std get_major(CURRENT_METADATA_VERSION), get_minor(CURRENT_METADATA_VERSION)); } + stream.seekg(-stream.tellg() + currentStreamPos, std::ios::cur); return storedMeta; } @@ -199,8 +161,4 @@ uint64_t Metadata::get_blob_size() const { return _blobDataSize; } -size_t Metadata::get_ov_header_offset() const { - return _ovHeaderOffset; -} - } // namespace intel_npu diff --git a/src/plugins/intel_npu/src/plugin/src/plugin.cpp b/src/plugins/intel_npu/src/plugin/src/plugin.cpp index c8a321e6185ff4..ee6c4947819b82 100644 --- a/src/plugins/intel_npu/src/plugin/src/plugin.cpp +++ b/src/plugins/intel_npu/src/plugin/src/plugin.cpp @@ -760,7 +760,7 @@ std::shared_ptr Plugin::import_model(std::istream& stream, c auto compiler = compilerAdapterFactory.getCompiler(_backends->getIEngineBackend(), localConfig); std::unique_ptr blobPtr; - auto storedMeta = read_metadata_from(stream, modelBuffer); + auto storedMeta = read_metadata_from(stream); if (storedMeta == nullptr) { OPENVINO_THROW("Could not read metadata!"); @@ -779,7 +779,7 @@ std::shared_ptr Plugin::import_model(std::istream& stream, c blobPtr = std::make_unique(std::move(blob)); } else { - blobPtr = std::make_unique(modelBuffer, storedMeta->get_ov_header_offset(), graphSize); + blobPtr = std::make_unique(modelBuffer, stream.tellg(), graphSize); } auto graph = compiler->parse(std::move(blobPtr), localConfig); diff --git a/src/plugins/intel_npu/tests/unit/npu/metadata_version.cpp b/src/plugins/intel_npu/tests/unit/npu/metadata_version.cpp index f3b637e643101b..ffad40e5becb49 100644 --- a/src/plugins/intel_npu/tests/unit/npu/metadata_version.cpp +++ b/src/plugins/intel_npu/tests/unit/npu/metadata_version.cpp @@ -21,11 +21,9 @@ TEST_F(MetadataUnitTests, readUnversionedBlob) { TEST_F(MetadataUnitTests, writeAndReadMetadataFromBlob) { std::stringstream stream; size_t blobSize = 0; - auto meta = Metadata(stream.tellg(), blobSize); + auto meta = Metadata(blobSize); OV_ASSERT_NO_THROW(meta.write(stream)); - OV_ASSERT_NO_THROW(stream.write(reinterpret_cast(&blobSize), sizeof(blobSize))); - OV_ASSERT_NO_THROW(stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size())); auto storedMeta = read_metadata_from(stream); ASSERT_NE(storedMeta, nullptr); @@ -35,14 +33,12 @@ TEST_F(MetadataUnitTests, writeAndReadMetadataFromBlob) { TEST_F(MetadataUnitTests, writeAndReadInvalidOpenvinoVersion) { size_t blobSize = 0; std::stringstream stream; - auto meta = Metadata(stream.tellg(), blobSize); + auto meta = Metadata(blobSize); 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(&blobSize), sizeof(blobSize))); - OV_ASSERT_NO_THROW(stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size())); auto storedMeta = read_metadata_from(stream); ASSERT_NE(storedMeta, nullptr); @@ -52,14 +48,12 @@ TEST_F(MetadataUnitTests, writeAndReadInvalidOpenvinoVersion) { TEST_F(MetadataUnitTests, writeAndReadInvalidMetadataVersion) { size_t blobSize = 0; std::stringstream stream; - auto meta = Metadata(stream.tellg(), blobSize); + auto meta = Metadata(blobSize); 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(&blobSize), sizeof(blobSize))); - OV_ASSERT_NO_THROW(stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size())); auto storedMeta = read_metadata_from(stream); ASSERT_EQ(storedMeta, nullptr);