量化因子记录文件
量化因子record文件格式,为基于protobuf协议的序列化数据结构文件,其对应的protobuf原型定义为(或查看昇腾模型压缩工具安装目录/amct_onnx/proto/scale_offset_record_onnx.proto文件):
syntax = "proto2";
message SingleLayerRecord {
    optional float scale_d = 1;
    optional int32 offset_d = 2;
    repeated float scale_w = 3;
    repeated int32 offset_w = 4;
    repeated uint32 shift_bit = 5;
    optional bool skip_fusion = 6 [default = true];
    optional bool is_tensor_quantize = 10 [default = false];
}
message MapFiledEntry {
    optional string key = 1;
    optional SingleLayerRecord value = 2;
}
message ScaleOffsetRecord {
    repeated MapFiledEntry record = 1;
}
参数说明如下:
| 消息 | 是否必填 | 类型 | 字段 | 说明 | 
|---|---|---|---|---|
| SingleLayerRecord | - | - | - | 包含了量化层所需要的所有量化因子记录信息。 | 
| optional | float | scale_d | 数据量化scale因子,仅支持对数据进行统一量化。 | |
| optional | int32 | offset_d | 数据量化offset因子,仅支持对数据进行统一量化。 | |
| repeated | float | scale_w | 权重量化scale因子,支持标量(对当前层的权重进行统一量化),向量(对当前层的权重按channel_wise方式进行量化)两种模式,仅支持Conv2d类型进行channel_wise量化模式。 | |
| repeated | int32 | offset_w | 权重量化offset因子,同scale_w一样支持标量和向量两种模式,且需要同scale_w维度一致,当前不支持权重带offset量化模式,offset_w仅支持0。 | |
| repeated | uint32 | shift_bit | 移位因子。 | |
| optional | bool | skip_fusion | 配置当前层是否要跳过Conv+BN融合,默认为false,即当前层要做上述融合。 | |
| optional | bool | is_tensor_quantize | 标识当前record文件中Tensor的量化记录,默认为false,表示该条record记录为非Tensor量化记录。 | |
| ScaleOffsetRecord | - | - | - | map结构,为保证兼容性,采用离散的map结构。 | 
| repeated | MapFiledEntry | record | 每个record对应一个量化层的量化因子记录;record包括两个成员: 
 | |
| MapFiledEntry | optional | string | key | 层名。 | 
| optional | SingleLayerRecord | value | 量化因子配置。 | 
对于optional字段,由于protobuf协议未对重复出现的值报错,而是采用覆盖处理,因此出现重复配置的optional字段内容时会默认保留最后一次配置的值,需要用户自己保证文件的正确性。
对于一般量化层需要配置包含scale_d、offset_d、scale_w、offset_w、shift_bit参数,量化因子record文件格式参考示例如下:
record {
  key: "conv"
  value {
    shift_bit: 1
    shift_bit: 1
    shift_bit: 1
    scale_d: 0.0798481479
    offset_d: 1
    scale_w: 0.007364662
    scale_w: 0.0069018262
    scale_w: 0.007323518
    offset_w: 0
    offset_w: 0
    offset_w: 0
    skip_fusion: true
  }
}
record {
  key: "maxpool_ld_default:0"
  value {
    scale_d: 0.00392156886
    offset_d: -128
    is_tensor_quantize: true
  }
}