专栏算法工具链LSTM模型进行训练后量化PTQ

LSTM模型进行训练后量化PTQ

已解决
默认819202024-11-14
145
10

搭建LSTM模型并进行训练,模型的输入类型为 50*16 。使用PTQ的方式进行量化,已经转换为onnx模型,onnx模型精度正常。使用hb_mapper makertbin命令进行转换。

 

1.系统软件版本:j5_1.19.1

 

2.在写配置文件时,input_parameters 中 input_type_rt设置为featuremap,input_layout_rt 只能设置为NCHW/NHWC,需要更改输入类型吗?在模型搭建时将输入更改为[1,1,50,16]?

 

3.calibration_parameters:现有参考资料中输入主要为图像,如果是50*16形式的数据使用什么格式进行保存,读取方式是怎样?

 

4.使用fast-perf 模式可以成功转换模型,生成4个onnx文件和一个bin文件,但是验证模型精度时,输入不同的数据,模型的输出格式正确,数值均为同一个数。

 

以上,求问如何解决,或者从哪个方面考虑。

算法工具链
征程5
评论3
0/1000
  • DR_KAN
    Lv.4

    好的,因为cal_data_type这个参数是没有默认值的,所以配置的时候可以手动添加上去。一般来说,不管是图像还是featuremap类型,都是float32用的更多一点。

    2024-11-18
    1
    0
  • Huanghui
    Lv.5

    收到,我看看哈~

    2024-11-14
    0
    0
  • Huanghui
    Lv.5

    你好,

    1. fast-perf成功后,会在转换目录生成.fast_perf目录,里面有yaml文件,自己看一下吧。
    2.自行编写python代码实现校准数据预处理可以使用 numpy.tofile 命令将其保存为float32格式的二进制文件, 工具链校准时会基于 numpy.fromfile 命令进行读取。
    3.验证模型精度的问题你需要根据模型的input chape 和 type准备数据,4个onnx中的*_original_float_model.onnx就是你的原始模型,你可以input_type_rt设置为featuremap,所有模型的输入准备都按照原始模型的输入来准备就OK。
    2024-11-14
    1
    7
    • 默认81920回复Huanghui:

      好的,谢谢解答!现关于校准数据还有一些疑问。

      1、查看.fast_perf目录中yaml文件,发现删除了一些节点,可能是性能不好的原因。


      remove_node_type: Quantize;Transpose;Dequantize;Cast;Reshape;Softmax;DequantizeFilter

      2、还是不太理解如何写配置文件,如下写是否可行:


      model_parameters:
      onnx_model: 'model_LSTM1.onnx' march: "bayes" layer_out_dump: False working_dir: 'model_output1' output_model_file_prefix: 'LSTM-50-16'
      input_parameters:
      input_name: "input" input_type_rt: 'featuremap' input_layout_rt: 'NCHW' #可选参数 input_type_train: 'featuremap' input_layout_train: 'NCHW' input_shape: '50x16' # input_batch: 1 norm_type: 'no_preprocess'
      # 模型量化相关参数# -----------------------------# model calibration parameterscalibration_parameters:
      cal_data_dir: 'cali_data' preprocess_on: False# 编译器相关参数# ----------------------------# compiler related parameterscompiler_parameters:
      compile_mode: 'latency' debug: True optimize_level: 'O3'

      3、关于校准数据的准备,当前的数据使用csv的格式,存放N个[50,16]的数据和对应的标签(0,1,2表示)。按照上述说明是要将csv数据保存为float32格式的二进制文件吗?


      使用上述yaml文件进行hb_mapper makertbin报错如下:

      2024-11-14
      0
    • 默认81920回复Huanghui:
      2024-11-14 17:06:55,090 WARNING Input node input's input_source not set, it will be set to ddr by default
      2024-11-14 17:06:55,093 WARNING can not get nhwc info from shape: [50, 16]
      2024-11-14 17:06:55,093 WARNING Please note that the calibration file data type is set to uint8, determined by the name of the calibration dir name suffix.
      2024-11-14 17:06:55,093 WARNING if you need to set it explicitly, please configure the value of cal_data_type in the calibration_parameters group in yaml.
      2024-11-14 17:06:55,093 INFO *******************************************
      2024-11-14 17:06:55,093 INFO First calibration picture name: 1.csv
      2024-11-14 17:06:55,093 INFO First calibration picture md5:
      987f22ff50bbee600f4209b3ef9ab843/open_explorer/ddk/samples/ai_toolchain/horizon_model_convert_sample/001_LSTM/cali_data/1.csv
      2024-11-14 17:06:55,100 INFO *******************************************
      2024-11-14 17:06:55,101 ERROR load cal data for input 'input' error
      2024-11-14 17:06:55,102 ERROR cannot reshape array of size 11324 into shape (50,16)
      2024-11-14
      0
    • Huanghui回复默认81920:

      1.你说的没错,

      删除一些节点就是为了更好的利用BPU的资源。被删除的这些节点都是位于模型尾部的,移除之后可以大大提高模型的推理速度,提高BPU的利用率。业务层可以将这些逻辑融入后处理的业务流程中。2.配置文件不是fast-perf已经帮你写完了吗,你只需要在之基础上添加一些校准逻辑等就可以了,具体配置项以及含义你需要通过用户手册了解熟悉一下。3. 关于前处理,你的PYTHON模型代码中应该是有推理逻辑的呀,你需要看看推理时是怎么准备模型input数据的,然后把推理之前的ndarray这些通过保存成到文件作为校准数据就OK。总结下来就是,校准数据用的就是你正常推理时所用的的数据。

      2024-11-14
      1
    • 默认81920回复Huanghui:

      好的,非常感谢您的解答!我再试试

      2024-11-15
      0
    • 默认81920回复Huanghui:

      在准备校准数据的时候将数据保存为float32保存为二进制格式,使用校准数据的时候仍然出了问题,数据预处理只进行了格式的转换。能帮忙看一下代码吗?谢谢

      转换的input_info_array.bin为校准数据。数据处理代码:

      模型转换时出现错误,不明白如何出现的3200。

      2024-11-16 11:07:48,057 ERROR load cal data for input 'input' error
      2024-11-16 11:07:48,058 ERROR cannot reshape array of size 3200 into shape (50,16)
      2024-11-16
      0
    • DR_KAN回复默认81920:

      calibration_parameters设置下cal_data_type: 'float32' 再试一下呢

      2024-11-18
      1
    • 默认81920回复DR_KAN:
      成功了,非常感谢!fighting_org.svg
      2024-11-18
      0