I would like to analyze an ONNX (Open Neural Network Exchange) file. How can I examine the size of each layer to better understand what contributes to the total file size?
One can use this Python script to view the size of each layer in an ONNX file. It display the number of parameters, the number of bytes and the parameter type for each layer:
'''
pip install onnx numpy
Tested with Python 3.12 on Ubuntu 22.04.
'''
import onnx
import numpy as np
from onnx import numpy_helper
def show_layer_sizes(onnx_model_path):
model = onnx.load(onnx_model_path)
initializer_map = {init.name: init for init in model.graph.initializer}
print(f"{'Layer Name':<40} {'# Params':>12} {'Size (Bytes)':>15} {'Data Types':>20}")
print("-" * 95)
total_params = 0
total_bytes = 0
for node in model.graph.node:
layer_params = 0
layer_bytes = 0
dtypes = set()
for input_name in node.input:
if input_name in initializer_map:
tensor = numpy_helper.to_array(initializer_map[input_name])
layer_params += tensor.size
layer_bytes += tensor.nbytes
dtypes.add(str(tensor.dtype))
total_params += layer_params
total_bytes += layer_bytes
dtype_str = ", ".join(sorted(dtypes)) if dtypes else "-"
print(f"{node.name or node.output[0]:<40} {layer_params:>12,} {layer_bytes:>15,} {dtype_str:>20}")
print("-" * 95)
print(f"{'Total':<40} {total_params:>12,} {total_bytes:>15,} {'-'*20}")
if __name__ == "__main__":
onnx_model_path = "outs/fr-en/model.onnx"
show_layer_sizes(onnx_model_path)
Example of output:
Layer Name # Params Size (Bytes) Data Types
-----------------------------------------------------------------------------------------------
Identity_484 262,144 1,048,576 float32
/model/encoder/Shape 0 0 -
/model/encoder/Constant 0 0 -
/model/encoder/Gather 0 0 -
/model/encoder/Constant_1 0 0 -
/model/encoder/Unsqueeze 0 0 -
/model/encoder/Concat 0 0 -
/model/encoder/Reshape 0 0 -
/model/encoder/shared/Gather 30,471,168 121,884,672 float32
/model/encoder/Constant_2 0 0 -
/model/encoder/Mul 0 0 -
/model/encoder/embed_positions/Constant 0 0 -
/model/encoder/embed_positions/Cast 0 0 -
/model/encoder/embed_positions/Constant_1 0 0 -
/model/encoder/embed_positions/Range 0 0 -
/model/encoder/embed_positions/Gather 262,144 1,048,576 float32
/model/encoder/Add 0 0 -
/model/encoder/Shape_1 0 0 -
/model/encoder/Constant_3 0 0 -
/model/encoder/Gather_1 0 0 -
/model/encoder/Shape_2 0 0 -
/model/encoder/Constant_4 0 0 -
/model/encoder/Gather_2 0 0 -
/model/encoder/Unsqueeze_1 0 0 -
/model/encoder/Unsqueeze_2 0 0 -
/model/encoder/Unsqueeze_3 0 0 -
/model/encoder/Constant_5 0 0 -
/model/encoder/Unsqueeze_4 0 0 -
/model/encoder/Unsqueeze_5 0 0 -
/model/encoder/Concat_1 0 0 -
/model/encoder/Constant_6 0 0 -
/model/encoder/Reshape_1 0 0 -
/model/encoder/Shape_3 0 0 -
/model/encoder/ConstantOfShape 0 0 -
/model/encoder/Constant_7 0 0 -
/model/encoder/Mul_1 0 0 -
/model/encoder/Equal 0 0 -
/model/encoder/Where 0 0 -
/model/encoder/Expand 0 0 -
/model/encoder/Cast 0 0 -
/model/encoder/Constant_8 0 0 -
/model/encoder/Sub 0 0 -
/model/encoder/Cast_1 0 0 -
/model/encoder/Cast_2 0 0 -
/model/encoder/Constant_9 0 0 -
/model/encoder/Where_1 0 0 -
/model/encoder/layers.0/self_attn/Shape 0 0 -
/model/encoder/layers.0/self_attn/Constant 0 0 -
/model/encoder/layers.0/self_attn/Gather 0 0 -
/model/encoder/layers.0/self_attn/Shape_1 0 0 -
/model/encoder/layers.0/self_attn/Constant_1 0 0 -
/model/encoder/layers.0/self_attn/Gather_1 0 0 -
/model/encoder/layers.0/self_attn/q_proj/MatMul 262,144 1,048,576 float32
/model/encoder/layers.0/self_attn/q_proj/Add 512 2,048 float32
/model/encoder/layers.0/self_attn/Constant_2 0 0 -
/model/encoder/layers.0/self_attn/Mul 0 0 -
/model/encoder/layers.0/self_attn/k_proj/MatMul 262,144 1,048,576 float32
/model/encoder/layers.0/self_attn/k_proj/Add 512 2,048 float32
/model/encoder/layers.0/self_attn/Unsqueeze 0 0 -
/model/encoder/layers.0/self_attn/Constant_3 0 0 -
/model/encoder/layers.0/self_attn/Constant_4 0 0 -
/model/encoder/layers.0/self_attn/Constant_5 0 0 -
/model/encoder/layers.0/self_attn/Concat 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_1 0 0 -
/model/encoder/layers.0/self_attn/Constant_6 0 0 -
/model/encoder/layers.0/self_attn/Constant_7 0 0 -
/model/encoder/layers.0/self_attn/Constant_8 0 0 -
/model/encoder/layers.0/self_attn/Concat_1 0 0 -
/model/encoder/layers.0/self_attn/Reshape 0 0 -
/model/encoder/layers.0/self_attn/Transpose 0 0 -
/model/encoder/layers.0/self_attn/v_proj/MatMul 262,144 1,048,576 float32
/model/encoder/layers.0/self_attn/v_proj/Add 512 2,048 float32
/model/encoder/layers.0/self_attn/Reshape_1 0 0 -
/model/encoder/layers.0/self_attn/Transpose_1 0 0 -
/model/encoder/layers.0/self_attn/Constant_9 0 0 -
/model/encoder/layers.0/self_attn/Mul_1 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_2 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_3 0 0 -
/model/encoder/layers.0/self_attn/Constant_10 0 0 -
/model/encoder/layers.0/self_attn/Constant_11 0 0 -
/model/encoder/layers.0/self_attn/Concat_2 0 0 -
/model/encoder/layers.0/self_attn/Reshape_2 0 0 -
/model/encoder/layers.0/self_attn/Transpose_2 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_4 0 0 -
/model/encoder/layers.0/self_attn/Constant_12 0 0 -
/model/encoder/layers.0/self_attn/Constant_13 0 0 -
/model/encoder/layers.0/self_attn/Concat_3 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_5 0 0 -
/model/encoder/layers.0/self_attn/Constant_14 0 0 -
/model/encoder/layers.0/self_attn/Constant_15 0 0 -
/model/encoder/layers.0/self_attn/Concat_4 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_6 0 0 -
/model/encoder/layers.0/self_attn/Constant_16 0 0 -
/model/encoder/layers.0/self_attn/Constant_17 0 0 -
/model/encoder/layers.0/self_attn/Concat_5 0 0 -
/model/encoder/layers.0/self_attn/Reshape_3 0 0 -
/model/encoder/layers.0/self_attn/Reshape_4 0 0 -
/model/encoder/layers.0/self_attn/Reshape_5 0 0 -
/model/encoder/layers.0/self_attn/Shape_2 0 0 -
/model/encoder/layers.0/self_attn/Constant_18 0 0 -
/model/encoder/layers.0/self_attn/Gather_2 0 0 -
/model/encoder/layers.0/self_attn/Transpose_3 0 0 -
/model/encoder/layers.0/self_attn/MatMul 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_7 0 0 -
/model/encoder/layers.0/self_attn/Constant_19 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_8 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_9 0 0 -
/model/encoder/layers.0/self_attn/Concat_6 0 0 -
/model/encoder/layers.0/self_attn/Reshape_6 0 0 -
/model/encoder/layers.0/self_attn/Add 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_10 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_11 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_12 0 0 -
/model/encoder/layers.0/self_attn/Concat_7 0 0 -
/model/encoder/layers.0/self_attn/Reshape_7 0 0 -
/model/encoder/layers.0/self_attn/Softmax 0 0 -
/model/encoder/layers.0/self_attn/MatMul_1 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_13 0 0 -
/model/encoder/layers.0/self_attn/Constant_20 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_14 0 0 -
/model/encoder/layers.0/self_attn/Constant_21 0 0 -
/model/encoder/layers.0/self_attn/Concat_8 0 0 -
/model/encoder/layers.0/self_attn/Reshape_8 0 0 -
/model/encoder/layers.0/self_attn/Transpose_4 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_15 0 0 -
/model/encoder/layers.0/self_attn/Unsqueeze_16 0 0 -
/model/encoder/layers.0/self_attn/Constant_22 0 0 -
/model/encoder/layers.0/self_attn/Concat_9 0 0 -
/model/encoder/layers.0/self_attn/Reshape_9 0 0 -
/model/encoder/layers.0/self_attn/out_proj/MatMul 262,144 1,048,576 float32
/model/encoder/layers.0/self_attn/out_proj/Add 512 2,048 float32
/model/encoder/layers.0/Add 0 0 -
/model/encoder/layers.0/self_attn_layer_norm/ReduceMean 0 0 -
/model/encoder/layers.0/self_attn_layer_norm/Sub 0 0 -
/model/encoder/layers.0/self_attn_layer_norm/Constant 0 0 -
/model/encoder/layers.0/self_attn_layer_norm/Pow 0 0 -
/model/encoder/layers.0/self_attn_layer_norm/ReduceMean_1 0 0 -
/model/encoder/layers.0/self_attn_layer_norm/Constant_1 0 0 -
/model/encoder/layers.0/self_attn_layer_norm/Add 0 0 -
/model/encoder/layers.0/self_attn_layer_norm/Sqrt 0 0 -
/model/encoder/layers.0/self_attn_layer_norm/Div 0 0 -
/model/encoder/layers.0/self_attn_layer_norm/Mul 512 2,048 float32
/model/encoder/layers.0/self_attn_layer_norm/Add_1 512 2,048 float32
/model/encoder/layers.0/fc1/MatMul 1,048,576 4,194,304 float32
/model/encoder/layers.0/fc1/Add 2,048 8,192 float32
[...]
/model/decoder/shared/Gather 30,471,168 121,884,672 float32
[...]
/model/decoder/layers.5/encoder_attn/Unsqueeze_16 0 0 -
/model/decoder/layers.5/encoder_attn/Constant_22 0 0 -
/model/decoder/layers.5/encoder_attn/Concat_9 0 0 -
/model/decoder/layers.5/encoder_attn/Reshape_9 0 0 -
/model/decoder/layers.5/encoder_attn/out_proj/MatMul 262,144 1,048,576 float32
/model/decoder/layers.5/encoder_attn/out_proj/Add 512 2,048 float32
/model/decoder/layers.5/Add_1 0 0 -
/model/decoder/layers.5/encoder_attn_layer_norm/ReduceMean 0 0 -
/model/decoder/layers.5/encoder_attn_layer_norm/Sub 0 0 -
/model/decoder/layers.5/encoder_attn_layer_norm/Constant 0 0 -
/model/decoder/layers.5/encoder_attn_layer_norm/Pow 0 0 -
/model/decoder/layers.5/encoder_attn_layer_norm/ReduceMean_1 0 0 -
/model/decoder/layers.5/encoder_attn_layer_norm/Constant_1 0 0 -
/model/decoder/layers.5/encoder_attn_layer_norm/Add 0 0 -
/model/decoder/layers.5/encoder_attn_layer_norm/Sqrt 0 0 -
/model/decoder/layers.5/encoder_attn_layer_norm/Div 0 0 -
/model/decoder/layers.5/encoder_attn_layer_norm/Mul 512 2,048 float32
/model/decoder/layers.5/encoder_attn_layer_norm/Add_1 512 2,048 float32
/model/decoder/layers.5/fc1/MatMul 1,048,576 4,194,304 float32
/model/decoder/layers.5/fc1/Add 2,048 8,192 float32
/model/decoder/layers.5/activation_fn/Sigmoid 0 0 -
/model/decoder/layers.5/activation_fn/Mul 0 0 -
/model/decoder/layers.5/fc2/MatMul 1,048,576 4,194,304 float32
/model/decoder/layers.5/fc2/Add 512 2,048 float32
/model/decoder/layers.5/Add_2 0 0 -
/model/decoder/layers.5/final_layer_norm/ReduceMean 0 0 -
/model/decoder/layers.5/final_layer_norm/Sub 0 0 -
/model/decoder/layers.5/final_layer_norm/Constant 0 0 -
/model/decoder/layers.5/final_layer_norm/Pow 0 0 -
/model/decoder/layers.5/final_layer_norm/ReduceMean_1 0 0 -
/model/decoder/layers.5/final_layer_norm/Constant_1 0 0 -
/model/decoder/layers.5/final_layer_norm/Add 0 0 -
/model/decoder/layers.5/final_layer_norm/Sqrt 0 0 -
/model/decoder/layers.5/final_layer_norm/Div 0 0 -
/model/decoder/layers.5/final_layer_norm/Mul 512 2,048 float32
/model/decoder/layers.5/final_layer_norm/Add_1 512 2,048 float32
/lm_head/MatMul 30,471,168 121,884,672 float32
/Add 59,514 238,056 float32
-----------------------------------------------------------------------------------------------
Total 136,135,802 544,543,208 --------------------