21
21
22
22
logger = logging .getLogger (__name__ )
23
23
24
+ _LARGE_IR_MODEL_THRESHOLD = 1536 * 1024 * 1024 # 1536MB
25
+
24
26
25
27
def get_external_data_config () -> Dict [str , PassConfigParam ]:
26
28
return {
@@ -201,6 +203,11 @@ def model_proto_to_olive_model(
201
203
return olive_model
202
204
203
205
206
+ def _count_initializer_size (graph : ir .Graph ) -> int :
207
+ """Count the total size of the initializers in bytes."""
208
+ return sum (v .const_value .nbytes for v in graph .initializers .values () if v .const_value is not None )
209
+
210
+
204
211
def ir_model_to_olive_model (
205
212
model : ir .Model ,
206
213
output_model_path : Union [str , Path ],
@@ -224,20 +231,28 @@ def ir_model_to_olive_model(
224
231
external_data_config = external_data_config .dict ()
225
232
226
233
save_as_external_data = external_data_config .get ("save_as_external_data" )
234
+ # Save as external data if requested or if the model is large
235
+ # Since we do not have a true estimate of the model architecture size for IR Model,
236
+ # we count the size of all initializers and limit that to 1.5GB.
237
+ initializer_size = _count_initializer_size (model .graph )
238
+ is_large_model = initializer_size > _LARGE_IR_MODEL_THRESHOLD
239
+ if is_large_model :
240
+ logger .debug ("Model is large (%s), saving as external data" , initializer_size )
241
+ save_as_external_data = save_as_external_data or is_large_model
227
242
228
243
if save_as_external_data :
229
244
external_data_name = _get_external_data_name (
230
245
Path (output_model_path ), external_data_config .get ("external_data_name" )
231
246
)
232
247
ir .save (model , output_model_path , external_data = external_data_name )
233
- else :
234
- ir .save (model , output_model_path )
235
248
236
- if external_data_name :
237
249
logger .debug ("Model was saved with external data: %s" , external_data_name )
238
250
model_path = LocalFolder ({"path" : Path (output_model_path ).parent })
239
251
onnx_file_name = Path (output_model_path ).name
252
+
240
253
else :
254
+ ir .save (model , output_model_path )
255
+
241
256
logger .debug ("Model was not saved with external data" )
242
257
model_path = LocalFile ({"path" : output_model_path })
243
258
onnx_file_name = None
0 commit comments