我们正在尝试转换基于 torchvision resnet18的特征提取网络,定义如下:
torch_model = models.resnet18(pretrained=True)
return_nodes = {'layer4': 'layer4'}
model = create_feature_extractor(torch_model, return_nodes=return_nodes)
model.eval()
模型首先转换为 onnx
torch.onnx.export(model=model, args=torch_input, f=model_onnx_path, input_names=input_names, output_names=output_names, verbose=verbose, opset_version=onxx_opset_version)
其中 onxx_opset_version = 11
然后通过应用75个随机输入矩阵转换为 TIDL
arr = np.rand(*shape).astype (np.float32)
更改为(num_Bits = 16、Accuracy = 1)
compile_options = {
"tidl_tools_path": os.environ["TIDL_TOOLS_PATH"],
"artifacts_folder": out_path,
"tensor_bits": num_bits,
"accuracy_level": accuracy,
"advanced_options:calibration_frames": num_calibration_frames,
"advanced_options:calibration_iterations": CALIBRATION_ITERATIONS, # used if accuracy_level = 1
"debug_level": DEBUG_LEVEL,
# Comma separated string of operator types as defined by ONNX runtime, ex "MaxPool, Concat"
"deny_list": deny_list
}
so = rt.SessionOptions()
EP_list = ["TIDLCompilationProvider", "CPUExecutionProvider"]
sess = rt.InferenceSession(model_path, providers=EP_list, provider_options=[
compile_options, {}], sess_options=so)
input_details = sess.get_inputs()
最后、我们通过应用另一个随机生成的 tensors 来生成 TIDL 模型的输出:
delegate_options = {
"tidl_tools_path": os.environ["TIDL_TOOLS_PATH"],
"artifacts_folder": artifact_path
}
EP_list = ["TIDLExecutionProvider", "CPUExecutionProvider"]
provider_options = [delegate_options, {}]
ort_session = rt.InferenceSession(model_onnx_path, providers=EP_list, provider_options=provider_options, sess_options=so)
和与 onnx 输出比较:
(--validation_rtol 0.005 --validation_atol 0.01)
np.testing.assert_allclose(onnx_output, tidl_output, rtol= validation_rtol, atol= validation_atol)
我们得到一个断言:
AssertionError (错误):
不等于容差 rtol=0.005、atol=0.01
不匹配的元素:5/1000 (0.5%)
最大绝对差值:0.03549385
最大相对差值:0.92525095
X:数组([-1.655439e+00、 5.876558e-01、 9.720564e-01、 1.086628e+00、
8.692306e-01、-2.400382e-01、 8.647077e-01、 4.130581e-02、
-1.276346e+00、-5.920414e-01、 8.705726e-01、 2.137526e+00、...
Y:数组([-1.667603e+00、 5.889614e-01、 9.750553e-01、 1.090211e+00、
8.695857e-01、-2.456472e-01、 8.647428e-01、 4.008919e-02、
-1.284469e+00、-5.9057e-01、 8.846528e-01、 2.153247e+00、...
问题:
- 这是否是预期的结果?
- 我们是否真的要用这种“健全性检查”呢? 我想 onnx 输出为 float32、TIDL 输出为定点16、因此存在显著的动态范围间隙、对吧?