This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VM:Resnet18上的量化完整性检查

Guru**** 652440 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1199778/tda4vm-quantization-sanity-check-on-resnet18

器件型号:TDA4VM

我们正在尝试转换基于 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、因此存在显著的动态范围间隙、对吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

      如果您的模型输出为浮点、那么即使是 TIDL 也将返回浮点输出。 您可以执行的一个完整性检查是在浮点模式下运行 TIDL,这可以通过设置 tenser_bits = 32来完成。 请注意、此选项只能在 x86 (PC)仿真模式下运行。

    此致、

    安州

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢。 实际上、设置 tenser_bits = 32可使测试通过。

    我还想知道--如果我们设置 tenser_bits = 16;在 FP16或定点16中,在 PC 仿真上的 tidl 模型计算/输出是吗?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Noam、您好!

        鉴于使用 TIDL 浮点时、您获得了正确的输出、这表示预处理没有问题、因此现在我们需要找出哪一层在16位推理下行为不正常的根本原因。 这样做的方法是从 TIDL 生成层级布线(这可以通过设置 DEBUG_LEVEL = 3来实现、这是 TIDL 的可选参数之一。 使用此选项时,应在/tmp 目录中生成层级跟踪。 然后、可以将其与相应的 ONNXRT 布线进行比较、以确定未提供正确输出的层。 您可以参考以下文档中的示例脚本进行此类比较:  

    https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/08_04_00_02/exports/docs/tidl_j721e_08_04_00_12/ti_dl/docs/user_guide_html/md_tidl_fsg_steps_to_debug_mismatch.html#did_tidl_debug_fm_quant

    [引用 userid="553646" URL"~/support/processors-group/processors/f/processors-forum/1199778/tda4vm-quantization-sanity-check-on-resnet18/4525527 #4525527"]是 FP16或定点16中的计算机仿真上的 tidl 模型计算/输出?[/quot]

       Tenser_bits = 16在 定点16位中进行推理、但如果 onnx 模型返回最终输出为浮点、则将完成从16位定点到浮点的转换 、您 将获得浮点输出。  因此、当 tenser_bits = 16时、您仍然应该从 TIDL 获得正确的浮点输出。

      一个附带的问题、使用 tenser_bits=16的具体原因是什么? 是因为 tenser_bits = 8位时您没有获得正确的精度?


    此致、

    安州