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