TMS320F280049C: 使用ti tinyml tensorlab 、Neural Network Compiler部署时序AI时,推理错误

Part Number: TMS320F280049C

你好,我正在尝试使用tinyml-tensorlabNNC部署器在F280049上评估轻量时序AI分类问题的解决方案。

训练模型阶段,数据集是arc_fault_example_dsk,模型为TimeSeries_Generic_1k_t,对应yaml文件为./tinyml-tensorlab/tinyml-modelmaker/config_timeseries_classification_dsk-quant.yaml,都是使用了tensorlab的现有内容,得到了包括ONNX模型在内的许多文件输出。
1. 我注意到输出文件.\TimeSeries_Generic_1k_t\training\quantization\golden_vectors\test_vector.c中的class_0_normal set

Fullscreen
1
golden_output[2] = { 0, -0, } ;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
,class_1_arc set
Fullscreen
1
golden_output[2] = { -1, 1, } ;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
。而未量化.\TimeSeries_Generic_1k_t\training\base\golden_vectors\test_vector.c中的class_0_normal set
Fullscreen
1
golden_output[2] = { 2, -3, } ;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
,class_1_arc set 
Fullscreen
1
golden_output[2] = { -2, 4, } ;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

nnc的参数:

2. 当我把得到的ONNX模型(quantization文件夹下的那个)通过nnc部署到280049上后,其推理得到输出非常奇怪的值,它明显超出了int8t的范围:  

3. 我想或许是模型输出搞错了,如果把typedef直接改为float32t,则结果是两个相同的浮点值,依然与预期值差别较大:

4. 我想会不会是量化导致了精度损失,所以我又用未量化模型(base文件夹下那个)尝试,但是我遇到了memory allocation问题,

Fullscreen
1
2
__attribute__((section(".bss.noinit.tvm"), aligned(16)))
static uint8_t global_workspace[4 + 24584];
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
,未量化模型参数太多导致无法放进一块RAMGS0:
我在尝试在syscfg中将RAMGS0~3都合并(4*8192 > 24588 ),但是完全不起作用,我不明白新版本的cmd如何修改:

综上,我想知道:【1】期望输出的数值是否正确,是怎么看的?第几个数值大就是哪个吗?【2】【3】数值这样是不正确的,对吗?它会是量化精度损失还是其他问题?【4】如果参数超出单块RAMGS0,如何合并RAM并给“.bss.noinit.tvm”使用?

  • 已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • [1]黄金输出表示无论哪个元素具有最高值,其索引都是预测类。 例如:在[-2, 4]中,4是最高的,因此预测类将为1。

    [2]黄金输出似乎是正确的,尽管值的大小看起来很小。 在培训过程中获得的准确性如何? 培训是否良好?

    [3]对于设备,下面是一个可能是问题的详细解释:

    在编译器的参数中,我看到了这一点,特别是在点--target="c, ti-npu type=soft output_int=true"。 将编译模型以获取浮点输入数组并返回整数输出数组。

    根据应用程序代码的运行方式,此处可能需要参数skip_noralize=true。

    如果您正在使用tvmgen_default_bias_data,tvmgen_defualt_scale_data,tvmgen_default_shift_data从test_vector.c对应用程序代码中的"raw_input_test"进行规范化。 然后将其输入到tvmgen_default_run (),则需要将skip_normalalize设置为true。

    如果您没有规范化应用程序代码中的'raw_input_test'并将其直接输入模型,则需要将此参数'skip_noralize'设置为false。

    您能否将其更改为--target="c, ti-npu type=soft skip_noralize=true output_int=true"并查看是否有效? 这将编译模型以获取整数输入并返回整数输入。

    您可以在artifacts/tvmgen_default_bias_data中找到这些tvmgen_defualt_scale_data,tvmgen_default_shift_data,tvmgen_default_run。