Files
SDK_SG200x_V2/cviruntime/python/test.py
carbon e25f20f7a3 add cviruntime
commit 3f4938648950a7f3bf9a19c320ca9fae7c52de20
Author: sophgo-forum-service <forum_service@sophgo.com>
Date:   Mon May 13 13:44:23 2024 +0800

    [feat] cviruntime opensource for cv18xx soc.

    - a4b6a3, add cumsum and gatherelements_pt.
2024-05-31 11:51:34 +08:00

79 lines
2.4 KiB
Python

#!/usr/bin/python3
import argparse
import pyruntime as rt
import numpy as np
def bf16_to_fp32(d_bf16):
s = d_bf16.shape
d_bf16 = d_bf16.flatten()
assert d_bf16.dtype == np.uint16
d_fp32 = np.empty_like(d_bf16, dtype=np.float32)
for i in range(len(d_bf16)):
d_fp32[i] = struct.unpack('<f', struct.pack('<HH', 0, d_bf16[i]))[0]
return d_fp32.reshape(s)
def compare_one_array(a, b):
if a.dtype == np.uint16:
a = bf16_to_fp32(a)
return np.array_equal(a.astype(np.float32).flatten(),
b.astype(np.float32).flatten())
def max_name_sz(tensors):
max_sz = 0
for out in tensors:
sz = len(out.name)
max_sz = max_sz if sz < max_sz else sz
return max_sz
def compare_with_ref(tensors, refs):
result = [0, 0]
style = "{:<" + str(max_name_sz(tensors) + 4) + "}";
print("To compare outputs with refernece npz:")
for out in tensors:
ref = refs[out.name]
same = compare_one_array(out.data, ref)
result[int(same)] += 1
print(" {} [{}]".format(str.format(style, out.name),
"PASS" if same else "FAIL"))
print("{} passed, {} failed, Compare {}!!!"
.format(result[1], result[0], "OK" if result[0] == 0 else "ERROR"))
return result[0] == 0
def quant(x, scale):
x = x * scale
x = np.trunc(x + np.copysign(.5, x))
x[x > 127.0] = 127.0
x[x < -128.0] = -128.0
return x.astype(np.int8)
def test(input_npz, cvimodel, ref_npz):
# load cvimodel
model = rt.Model(cvimodel, batch_num=1, output_all_tensors=True)
# fill data to inputs
data = model.inputs[0].data
qscale = model.inputs[0].qscale
# load input data and quant to int8
input_npz = np.load(input_npz)
input = input_npz[input_npz.files[0]]
print(input.shape)
input = quant(input, qscale)
# fill input data to input tensor of model
data[:] = input.reshape(data.shape)
for out in model.outputs:
print(out.name)
print(out.data.dtype)
print(out.data.shape)
# forward
model.forward()
# compare result with reference
refs = np.load(ref_npz)
compare_with_ref(model.outputs, refs)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Test python runtime API.")
parser.add_argument("--cvimodel", type=str, help="cvimodel")
parser.add_argument("--input", type=str, help="input npz")
parser.add_argument("--reference", type=str, help="reference to output npz")
args = parser.parse_args()
test(args.input, args.cvimodel, args.reference)