Skip to content

Commit dfa4c22

Browse files
committed
Use negative offsets for read_metadata_from(stream) function, drop its overflow with ov::AlignedBuffer
1 parent ebc5b90 commit dfa4c22

File tree

5 files changed

+28
-81
lines changed

5 files changed

+28
-81
lines changed

src/plugins/intel_npu/src/plugin/include/metadata.hpp

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,6 @@ struct MetadataBase {
103103

104104
virtual uint64_t get_blob_size() const = 0;
105105

106-
virtual size_t get_ov_header_offset() const = 0;
107-
108106
virtual ~MetadataBase() = default;
109107
};
110108

@@ -128,9 +126,7 @@ struct Metadata<METADATA_VERSION_1_0> : public MetadataBase {
128126
uint64_t _blobDataSize;
129127

130128
public:
131-
Metadata(std::optional<std::string_view> ovVersion = std::nullopt);
132-
133-
Metadata(size_t ovHeaderOffset, uint64_t blobDataSize);
129+
Metadata(std::optional<std::string_view> ovVersion = std::nullopt, uint64_t blobDataSize);
134130

135131
void read(std::istream& stream) override;
136132

@@ -155,8 +151,6 @@ struct Metadata<METADATA_VERSION_1_0> : public MetadataBase {
155151
void set_ov_version(const OpenvinoVersion& newVersion);
156152

157153
uint64_t get_blob_size() const override;
158-
159-
size_t get_ov_header_offset() const override;
160154
};
161155

162156
/**
@@ -165,7 +159,7 @@ struct Metadata<METADATA_VERSION_1_0> : public MetadataBase {
165159
* @return Unique pointer to the created MetadataBase object if the major version is supported; otherwise, returns
166160
* 'nullptr'.
167161
*/
168-
std::unique_ptr<MetadataBase> create_metadata(uint32_t version, size_t ovHeaderOffset, uint64_t blobDataSize);
162+
std::unique_ptr<MetadataBase> create_metadata(uint32_t version, uint64_t blobDataSize);
169163

170164
/**
171165
* @brief Reads metadata from a blob.
@@ -175,6 +169,4 @@ std::unique_ptr<MetadataBase> create_metadata(uint32_t version, size_t ovHeaderO
175169
*/
176170
std::unique_ptr<MetadataBase> read_metadata_from(std::istream& stream);
177171

178-
std::unique_ptr<MetadataBase> read_metadata_from(std::istream& stream, const std::shared_ptr<ov::AlignedBuffer>& modelBuffer);
179-
180172
} // namespace intel_npu

src/plugins/intel_npu/src/plugin/src/compiled_model.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,8 @@ void CompiledModel::export_model(std::ostream& stream) const {
7575
_logger.debug("CompiledModel::export_model");
7676
size_t blobSizeBeforeVersioning = _graph->export_blob(stream);
7777

78-
auto meta = Metadata<CURRENT_METADATA_VERSION>(ov::get_openvino_version().buildNumber);
78+
auto meta = Metadata<CURRENT_METADATA_VERSION>(ov::get_openvino_version().buildNumber, blobSizeBeforeVersioning);
7979
meta.write(stream);
80-
stream.write(reinterpret_cast<const char*>(&blobSizeBeforeVersioning), sizeof(blobSizeBeforeVersioning));
81-
stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size());
8280
}
8381

8482
std::shared_ptr<const ov::Model> CompiledModel::get_runtime_model() const {

src/plugins/intel_npu/src/plugin/src/metadata.cpp

Lines changed: 20 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,20 @@
1515

1616
namespace {
1717

18-
size_t getFileSize(std::istream& stream) {
18+
std::streampos getFileSize(std::istream& stream) {
1919
auto log = intel_npu::Logger::global().clone("getFileSize");
2020
if (!stream) {
2121
OPENVINO_THROW("Stream is in bad status! Please check the passed stream status!");
2222
}
2323

24-
const size_t streamStart = stream.tellg();
24+
if (stream.rdbuf()->in_avail() != 0) {
25+
// ov::OwningSharedStreamBuffer scenario
26+
return stream.rdbuf()->in_avail() + stream.tellg();
27+
}
28+
29+
const std::streampos streamStart = stream.tellg();
2530
stream.seekg(0, std::ios_base::end);
26-
const size_t streamEnd = stream.tellg();
31+
const std::streampos streamEnd = stream.tellg();
2732
stream.seekg(streamStart, std::ios_base::beg);
2833

2934
log.debug("Read blob size: streamStart=%zu, streamEnd=%zu", streamStart, streamEnd);
@@ -58,25 +63,25 @@ void OpenvinoVersion::write(std::ostream& stream) {
5863
stream.write(_version.data(), _size);
5964
}
6065

61-
Metadata<METADATA_VERSION_1_0>::Metadata(std::optional<std::string_view> ovVersion, size_t ovHeaderOffset, uint64_t blobDataSize)
66+
Metadata<METADATA_VERSION_1_0>::Metadata(std::optional<std::string_view> ovVersion, uint64_t blobDataSize)
6267
: _version{METADATA_VERSION_1_0},
6368
_ovVersion{ovVersion.value_or(ov::get_openvino_version().buildNumber)},
64-
_ovHeaderOffset{ovHeaderOffset},
6569
_blobDataSize{blobDataSize} {}
6670

6771
void Metadata<METADATA_VERSION_1_0>::read(std::istream& stream) {
6872
_ovVersion.read(stream);
6973
}
7074

7175
void Metadata<METADATA_VERSION_1_0>::write(std::ostream& stream) {
72-
stream.write(reinterpret_cast<const char*>(&_version), sizeof(_version));
7376
_ovVersion.write(stream);
77+
stream.write(reinterpret_cast<const char*>(&_blobDataSize), sizeof(_blobDataSize));
78+
stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size());
7479
}
7580

76-
std::unique_ptr<MetadataBase> create_metadata(uint32_t version, size_t ovHeaderOffset, uint64_t blobDataSize) {
81+
std::unique_ptr<MetadataBase> create_metadata(uint32_t version, uint64_t blobDataSize) {
7782
switch (version) {
7883
case METADATA_VERSION_1_0:
79-
return std::make_unique<Metadata<METADATA_VERSION_1_0>>(std::nullopt, ovHeaderOffset, blobDataSize);
84+
return std::make_unique<Metadata<METADATA_VERSION_1_0>>(std::nullopt, blobDataSize);
8085

8186
default:
8287
return nullptr;
@@ -113,65 +118,26 @@ std::unique_ptr<MetadataBase> read_metadata_from(std::istream& stream) {
113118
std::string blobMagicBytes;
114119
blobMagicBytes.resize(magicBytesSize);
115120

116-
size_t currentStreamPos = stream.tellg();
117-
size_t streamSize = getFileSize(stream);
118-
stream.seekg(streamSize - magicBytesSize, std::ios::beg);
121+
std::streampos currentStreamPos = stream.tellg();
122+
std::streampos streamSize = getFileSize(stream);
123+
stream.seekg(-currentStreamPos + streamSize - magicBytesSize, std::ios::cur);
119124
stream.read(blobMagicBytes.data(), magicBytesSize);
120125
if (MAGIC_BYTES != blobMagicBytes) {
121126
logger.error("Blob is missing NPU metadata!");
122127
return nullptr;
123128
}
124129

125130
uint64_t blobDataSize;
126-
stream.seekg(streamSize - magicBytesSize - sizeof(blobDataSize), std::ios::beg);
131+
stream.seekg(-std::streampos(magicBytesSize) - sizeof(blobDataSize), std::ios::cur);
127132
stream.read(reinterpret_cast<char*>(&blobDataSize), sizeof(blobDataSize));
128-
stream.seekg(currentStreamPos + blobDataSize, std::ios::beg);
133+
stream.seekg(-stream.tellg() + currentStreamPos + blobDataSize, std::ios::cur);
129134

130135
uint32_t metaVersion;
131136
stream.read(reinterpret_cast<char*>(&metaVersion), sizeof(metaVersion));
132137

133138
std::unique_ptr<MetadataBase> storedMeta;
134139
try {
135-
storedMeta = create_metadata(metaVersion, currentStreamPos, blobDataSize);
136-
storedMeta->read(metadataStream);
137-
} catch (...) {
138-
logger.warning("Imported blob metadata version: %d.%d, but the current version is: %d.%d",
139-
get_major(metaVersion),
140-
get_minor(metaVersion),
141-
get_major(CURRENT_METADATA_VERSION),
142-
get_minor(CURRENT_METADATA_VERSION));
143-
}
144-
stream.seekg(currentStreamPos, std::ios::beg);
145-
return storedMeta;
146-
}
147-
148-
std::unique_ptr<MetadataBase> read_metadata_from(std::istream& stream, const std::shared_ptr<ov::AlignedBuffer>& modelBuffer) {
149-
Logger logger("NPUPlugin", Logger::global().level());
150-
if (modelBuffer == nullptr) {
151-
return read_metadata_from(stream);
152-
}
153-
size_t magicBytesSize = MAGIC_BYTES.size();
154-
std::string blobMagicBytes;
155-
blobMagicBytes.resize(magicBytesSize);
156-
157-
size_t currentStreamPos = stream.tellg();
158-
size_t streamSize = modelBuffer->size();
159-
160-
blobMagicBytes.assign(reinterpret_cast<const char*>(modelBuffer->get_ptr(streamSize - magicBytesSize)), magicBytesSize);
161-
if (MAGIC_BYTES != blobMagicBytes) {
162-
logger.error("Blob is missing NPU metadata!");
163-
return nullptr;
164-
}
165-
166-
uint64_t blobDataSize;
167-
blobDataSize = *reinterpret_cast<uint64_t*>(modelBuffer->get_ptr(streamSize - magicBytesSize - sizeof(blobDataSize)));
168-
169-
uint32_t metaVersion;
170-
metaVersion = *reinterpret_cast<uint32_t*>(modelBuffer->get_ptr(currentStreamPos + blobDataSize));
171-
172-
stream.seekg(blobDataSize + sizeof(metaVersion), std::ios::cur);
173-
try {
174-
auto storedMeta = create_metadata(metaVersion, currentStreamPos, blobDataSize);
140+
storedMeta = create_metadata(metaVersion, blobDataSize);
175141
storedMeta->read(stream);
176142
} catch(...) {
177143
logger.warning("Imported blob metadata version: %d.%d, but the current version is: %d.%d",
@@ -182,6 +148,7 @@ std::unique_ptr<MetadataBase> read_metadata_from(std::istream& stream, const std
182148

183149
OPENVINO_THROW("NPU metadata mismatch.");
184150
}
151+
stream.seekg(-stream.tellg() + currentStreamPos, std::ios::cur);
185152
return storedMeta;
186153
}
187154

@@ -197,8 +164,4 @@ uint64_t Metadata<METADATA_VERSION_1_0>::get_blob_size() const {
197164
return _blobDataSize;
198165
}
199166

200-
size_t Metadata<METADATA_VERSION_1_0>::get_ov_header_offset() const {
201-
return _ovHeaderOffset;
202-
}
203-
204167
} // namespace intel_npu

src/plugins/intel_npu/src/plugin/src/plugin.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ std::shared_ptr<ov::ICompiledModel> Plugin::import_model(std::istream& stream, c
760760
auto compiler = compilerAdapterFactory.getCompiler(_backends->getIEngineBackend(), localConfig);
761761

762762
std::unique_ptr<BlobContainer> blobPtr;
763-
auto storedMeta = read_metadata_from(stream, modelBuffer);
763+
auto storedMeta = read_metadata_from(stream);
764764

765765
if (storedMeta == nullptr) {
766766
OPENVINO_THROW("Could not read metadata!");
@@ -779,7 +779,7 @@ std::shared_ptr<ov::ICompiledModel> Plugin::import_model(std::istream& stream, c
779779

780780
blobPtr = std::make_unique<BlobContainerVector>(std::move(blob));
781781
} else {
782-
blobPtr = std::make_unique<BlobContainerAlignedBuffer>(modelBuffer, storedMeta->get_ov_header_offset(), graphSize);
782+
blobPtr = std::make_unique<BlobContainerAlignedBuffer>(modelBuffer, stream.tellg(), graphSize);
783783
}
784784

785785
auto graph = compiler->parse(std::move(blobPtr), localConfig);

src/plugins/intel_npu/tests/unit/npu/metadata_version.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,9 @@ TEST_F(MetadataUnitTests, readUnversionedBlob) {
2121
TEST_F(MetadataUnitTests, writeAndReadMetadataFromBlob) {
2222
std::stringstream stream;
2323
size_t blobSize = 0;
24-
auto meta = Metadata<CURRENT_METADATA_VERSION>(stream.tellg(), blobSize);
24+
auto meta = Metadata<CURRENT_METADATA_VERSION>(blobSize);
2525

2626
OV_ASSERT_NO_THROW(meta.write(stream));
27-
OV_ASSERT_NO_THROW(stream.write(reinterpret_cast<const char*>(&blobSize), sizeof(blobSize)));
28-
OV_ASSERT_NO_THROW(stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size()));
2927

3028
auto storedMeta = read_metadata_from(stream);
3129
ASSERT_NE(storedMeta, nullptr);
@@ -35,14 +33,12 @@ TEST_F(MetadataUnitTests, writeAndReadMetadataFromBlob) {
3533
TEST_F(MetadataUnitTests, writeAndReadInvalidOpenvinoVersion) {
3634
size_t blobSize = 0;
3735
std::stringstream stream;
38-
auto meta = Metadata<CURRENT_METADATA_VERSION>(stream.tellg(), blobSize);
36+
auto meta = Metadata<CURRENT_METADATA_VERSION>(blobSize);
3937

4038
OpenvinoVersion badOvVersion("just_some_wrong_ov_version");
4139
meta.set_ov_version(badOvVersion);
4240

4341
OV_ASSERT_NO_THROW(meta.write(stream));
44-
OV_ASSERT_NO_THROW(stream.write(reinterpret_cast<const char*>(&blobSize), sizeof(blobSize)));
45-
OV_ASSERT_NO_THROW(stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size()));
4642

4743
auto storedMeta = read_metadata_from(stream);
4844
ASSERT_NE(storedMeta, nullptr);
@@ -52,14 +48,12 @@ TEST_F(MetadataUnitTests, writeAndReadInvalidOpenvinoVersion) {
5248
TEST_F(MetadataUnitTests, writeAndReadInvalidMetadataVersion) {
5349
size_t blobSize = 0;
5450
std::stringstream stream;
55-
auto meta = Metadata<CURRENT_METADATA_VERSION>(stream.tellg(), blobSize);
51+
auto meta = Metadata<CURRENT_METADATA_VERSION>(blobSize);
5652

5753
constexpr uint32_t dummy_version = make_version(0x00007E57, 0x0000AC3D);
5854
meta.set_version(dummy_version);
5955

6056
OV_ASSERT_NO_THROW(meta.write(stream));
61-
OV_ASSERT_NO_THROW(stream.write(reinterpret_cast<const char*>(&blobSize), sizeof(blobSize)));
62-
OV_ASSERT_NO_THROW(stream.write(MAGIC_BYTES.data(), MAGIC_BYTES.size()));
6357

6458
auto storedMeta = read_metadata_from(stream);
6559
ASSERT_EQ(storedMeta, nullptr);

0 commit comments

Comments
 (0)