@@ -2977,6 +2977,60 @@ def generate_gemm_dynmaic_inputs(name, inputA, inputB, inputC, path_data, path_m
2977
2977
"models"
2978
2978
)
2979
2979
2980
+ ## gemm with external data.
2981
+
2982
+ import numpy as np
2983
+ import onnx
2984
+ from onnx import helper , TensorProto , numpy_helper
2985
+ from onnx .external_data_helper import convert_model_to_external_data
2986
+ import os
2987
+ import onnxruntime as ort
2988
+
2989
+ input_dim = 8
2990
+ output_dim = 32
2991
+ batch_dim = 4
2992
+ onnx_model_path = "gemm_external_data.onnx"
2993
+ B_filename = "gemm_external_data_B"
2994
+ C_filename = "gemm_external_data_C"
2995
+
2996
+ A_data = np .random .randn (batch_dim , input_dim ).astype (np .float32 ) # Batch size = 1
2997
+
2998
+ A = helper .make_tensor_value_info ("A" , TensorProto .FLOAT , A_data .shape )
2999
+ Y = helper .make_tensor_value_info ("Y" , TensorProto .FLOAT , [batch_dim , output_dim ])
3000
+
3001
+ np .random .seed (0 )
3002
+ B_data = np .random .randn (input_dim , output_dim ).astype (np .float32 )
3003
+ C_data = np .random .randn (output_dim ).astype (np .float32 )
3004
+
3005
+ B_tensor = numpy_helper .from_array (B_data , name = "B" )
3006
+ C_tensor = numpy_helper .from_array (C_data , name = "C" )
3007
+
3008
+ gemm_node = helper .make_node ("Gemm" , ["A" , "B" , "C" ], ["Y" ], alpha = 1.0 , beta = 1.0 , transB = 0 )
3009
+ graph = helper .make_graph ([gemm_node ], "GEMMGraph" , [A ], [Y ], [B_tensor , C_tensor ])
3010
+ model = helper .make_model (graph )
3011
+ onnx .checker .check_model (model )
3012
+
3013
+ convert_model_to_external_data (
3014
+ model ,
3015
+ all_tensors_to_one_file = False ,
3016
+ size_threshold = 0 , # Force all tensors to external
3017
+ convert_attribute = False
3018
+ )
3019
+
3020
+ for initializer in model .graph .initializer :
3021
+ if initializer .name == "B" :
3022
+ initializer .external_data [0 ].value = B_filename
3023
+ elif initializer .name == "C" :
3024
+ initializer .external_data [0 ].value = C_filename
3025
+
3026
+ onnx .save_model (model , onnx_model_path )
3027
+
3028
+ session = ort .InferenceSession (onnx_model_path )
3029
+ outputs = session .run (None , {"A" : A_data })
3030
+ Y_data = outputs [0 ]
3031
+
3032
+ np .save ("input_test_gemm_external_data.npy" , A_data )
3033
+ np .save ("output_test_gemm_external_data.npy" , Y_data )
2980
3034
2981
3035
# ########################## ReduceSum with Dynamic Batch ##########################
2982
3036
input_np = np .random .rand (2 , 4 , 4 , 4 ).astype ("float32" )
0 commit comments