我们正在尝试转换基于 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、因此存在显著的动态范围间隙、对吧?