shreyask's picture
GLiNER2.5-Decide classification path, ONNX fp32/fp16/q4/q4f16
2a9b872 verified
Raw History Blame Contribute Delete
1.64 kB
import onnx, os, time, numpy as np, sys
from onnxconverter_common import float16
from onnxruntime.quantization import quantize_dynamic, QuantType
from onnxruntime.quantization.matmul_nbits_quantizer import MatMulNBitsQuantizer
D = "/Users/shreyas/work/rnd/gliner2/work/export/onnx"
model = onnx.load(D + "/model.onnx")
print("loaded fp32; nodes", len(model.graph.node), flush=True)
# fp16: keep gather/index ops in fp32 via op_block_list defaults; blocks handle the int paths
t0 = time.time()
m16 = float16.convert_float_to_float16(model, keep_io_types=True, disable_shape_infer=True)
onnx.save_model(m16, D + "/model_fp16.onnx", save_as_external_data=True, all_tensors_to_one_file=True, location="model_fp16.onnx.data", size_threshold=1024)
print("fp16 done", round(time.time()-t0,1), "s", flush=True)
del m16
# q4: MatMulNBits (what onnx-community ships as model_q4.onnx); embeddings stay fp32
t0 = time.time()
q = MatMulNBitsQuantizer(onnx.load(D + "/model.onnx"), block_size=32, is_symmetric=True, accuracy_level=4)
q.process()
q.model.save_model_to_file(D + "/model_q4.onnx", use_external_data_format=True)
print("q4 done", round(time.time()-t0,1), "s", flush=True)
# q4f16: q4 matmuls with fp16 everything else
t0 = time.time()
m = onnx.load(D + "/model_q4.onnx")
m = float16.convert_float_to_float16(m, keep_io_types=True, disable_shape_infer=True, op_block_list=float16.DEFAULT_OP_BLOCK_LIST + ["MatMulNBits"])
onnx.save_model(m, D + "/model_q4f16.onnx", save_as_external_data=True, all_tensors_to_one_file=True, location="model_q4f16.onnx.data", size_threshold=1024)
print("q4f16 done", round(time.time()-t0,1), "s", flush=True)