10
10
#include " intel_npu/config/config.hpp"
11
11
#include " intel_npu/utils/logger/logger.hpp"
12
12
#include " openvino/core/version.hpp"
13
+ #include " openvino/runtime/shared_buffer.hpp"
14
+ namespace {
15
+
16
+ size_t getFileSize (std::istream& stream) {
17
+ auto log = intel_npu::Logger::global ().clone (" getFileSize" );
18
+ if (!stream) {
19
+ OPENVINO_THROW (" Stream is in bad status! Please check the passed stream status!" );
20
+ }
21
+
22
+ const size_t streamStart = stream.tellg ();
23
+ stream.seekg (0 , std::ios_base::end);
24
+ const size_t streamEnd = stream.tellg ();
25
+ stream.seekg (streamStart, std::ios_base::beg);
26
+
27
+ log.debug (" Read blob size: streamStart=%zu, streamEnd=%zu" , streamStart, streamEnd);
28
+
29
+ if (streamEnd < streamStart) {
30
+ OPENVINO_THROW (" Invalid stream size: streamEnd (" ,
31
+ streamEnd,
32
+ " ) is not larger than streamStart (" ,
33
+ streamStart,
34
+ " )!" );
35
+ }
36
+
37
+ return streamEnd - streamStart;
38
+ }
39
+
40
+ } // namespace
13
41
14
42
namespace intel_npu {
15
43
@@ -24,7 +52,15 @@ void OpenvinoVersion::read(std::istream& stream) {
24
52
}
25
53
26
54
Metadata<METADATA_VERSION_1_0>::Metadata()
27
- : _version{METADATA_VERSION_1_0},
55
+ : _blobDataSize{0 },
56
+ _version{METADATA_VERSION_1_0},
57
+ _ovHeaderOffset{0 },
58
+ _ovVersion{ov::get_openvino_version ().buildNumber } {}
59
+
60
+ Metadata<METADATA_VERSION_1_0>::Metadata(size_t ovHeaderOffset, uint64_t blobDataSize)
61
+ : _blobDataSize{blobDataSize},
62
+ _version{METADATA_VERSION_1_0},
63
+ _ovHeaderOffset{ovHeaderOffset},
28
64
_ovVersion{ov::get_openvino_version ().buildNumber } {}
29
65
30
66
void Metadata<METADATA_VERSION_1_0>::read(std::istream& stream) {
@@ -41,13 +77,13 @@ void Metadata<METADATA_VERSION_1_0>::write(std::ostream& stream) {
41
77
stream.write (_ovVersion.get_version ().data (), _ovVersion.get_version ().size ());
42
78
}
43
79
44
- std::unique_ptr<MetadataBase> create_metadata (uint32_t version) {
80
+ std::unique_ptr<MetadataBase> create_metadata (uint32_t version, size_t ovHeaderOffset, uint64_t blobDataSize ) {
45
81
switch (version) {
46
82
case METADATA_VERSION_1_0:
47
- return std::make_unique<Metadata<METADATA_VERSION_1_0>>();
83
+ return std::make_unique<Metadata<METADATA_VERSION_1_0>>(ovHeaderOffset, blobDataSize );
48
84
49
85
default :
50
- OPENVINO_THROW ( " Invalid metadata version! " ) ;
86
+ return nullptr ;
51
87
}
52
88
}
53
89
@@ -75,35 +111,69 @@ bool Metadata<METADATA_VERSION_1_0>::is_compatible() {
75
111
return true ;
76
112
}
77
113
78
- std::unique_ptr<MetadataBase> read_metadata_from (const std::vector< uint8_t >& blob ) {
114
+ std::unique_ptr<MetadataBase> read_metadata_from (std::istream& stream ) {
79
115
Logger logger (" NPUPlugin" , Logger::global ().level ());
80
116
size_t magicBytesSize = MAGIC_BYTES.size ();
81
117
std::string blobMagicBytes;
82
118
blobMagicBytes.resize (magicBytesSize);
83
119
84
- auto metadataIterator = blob.end () - magicBytesSize;
85
- std::memcpy (blobMagicBytes.data (), &(*metadataIterator), magicBytesSize);
120
+ size_t currentStreamPos = stream.tellg ();
121
+ size_t streamSize = getFileSize (stream);
122
+ stream.seekg (streamSize - magicBytesSize, std::ios::beg);
123
+ stream.read (blobMagicBytes.data (), magicBytesSize);
86
124
if (MAGIC_BYTES != blobMagicBytes) {
87
- OPENVINO_THROW (" Blob is missing NPU metadata!" );
125
+ logger.error (" Blob is missing NPU metadata!" );
126
+ return nullptr ;
88
127
}
89
128
90
129
uint64_t blobDataSize;
91
- metadataIterator -= sizeof (blobDataSize);
92
- std::memcpy (&blobDataSize, &(*metadataIterator), sizeof (blobDataSize));
93
- metadataIterator = blob.begin () + blobDataSize;
130
+ stream.seekg (streamSize - magicBytesSize - sizeof (blobDataSize), std::ios::beg);
131
+ stream.read (reinterpret_cast <char *>(&blobDataSize), sizeof (blobDataSize));
132
+ stream.seekg (currentStreamPos + blobDataSize, std::ios::beg);
133
+
134
+ uint32_t metaVersion;
135
+ stream.read (reinterpret_cast <char *>(&metaVersion), sizeof (metaVersion));
136
+
137
+ auto storedMeta = create_metadata (metaVersion, currentStreamPos, blobDataSize);
138
+ if (storedMeta != nullptr ) {
139
+ storedMeta->read (stream);
140
+ } else {
141
+ logger.warning (" Imported blob metadata version: %d.%d, but the current version is: %d.%d" ,
142
+ get_major (metaVersion),
143
+ get_minor (metaVersion),
144
+ get_major (CURRENT_METADATA_VERSION),
145
+ get_minor (CURRENT_METADATA_VERSION));
146
+ }
147
+ stream.seekg (currentStreamPos, std::ios::beg);
148
+ return storedMeta;
149
+ }
150
+
151
+ std::unique_ptr<MetadataBase> read_metadata_from (std::istream& stream, const std::shared_ptr<ov::AlignedBuffer>& modelBuffer) {
152
+ Logger logger (" NPUPlugin" , Logger::global ().level ());
153
+ size_t magicBytesSize = MAGIC_BYTES.size ();
154
+ std::string blobMagicBytes;
155
+ blobMagicBytes.resize (magicBytesSize);
94
156
95
- std::stringstream metadataStream;
96
- metadataStream.write (reinterpret_cast <const char *>(&(*metadataIterator)),
97
- blob.end () - metadataIterator - sizeof (blobDataSize));
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)));
98
168
99
169
uint32_t metaVersion;
100
- metadataStream. read ( reinterpret_cast <char *>(&metaVersion), sizeof (metaVersion ));
170
+ metaVersion = * reinterpret_cast <uint32_t *>(modelBuffer-> get_ptr (currentStreamPos + blobDataSize ));
101
171
102
- std::unique_ptr<MetadataBase> storedMeta;
103
- try {
104
- storedMeta = create_metadata (metaVersion);
105
- storedMeta->read (metadataStream );
106
- } catch (...) {
172
+ auto storedMeta = create_metadata (metaVersion, currentStreamPos, blobDataSize) ;
173
+ stream. seekg (blobDataSize + sizeof (metaVersion), std::ios::cur);
174
+ if ( storedMeta != nullptr ) {
175
+ storedMeta->read (stream );
176
+ } else {
107
177
logger.warning (" Imported blob metadata version: %d.%d, but the current version is: %d.%d" ,
108
178
get_major (metaVersion),
109
179
get_minor (metaVersion),
@@ -121,4 +191,12 @@ void Metadata<METADATA_VERSION_1_0>::set_ov_version(const OpenvinoVersion& newVe
121
191
_ovVersion = newVersion;
122
192
}
123
193
194
+ uint64_t Metadata<METADATA_VERSION_1_0>::get_blob_size() const {
195
+ return _blobDataSize;
196
+ }
197
+
198
+ size_t Metadata<METADATA_VERSION_1_0>::get_ov_header_offset() const {
199
+ return _ovHeaderOffset;
200
+ }
201
+
124
202
} // namespace intel_npu
0 commit comments