record记录文件
record文件,为基于protobuf协议的序列化数据结构文件,记录量化因子Scale/Offset等,通过该文件、压缩配置文件以及原始网络模型文件,生成压缩后的模型文件。
record原型定义
record文件对应的protobuf原型定义为:
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 uint32 channels = 6;
    optional uint32 height = 7;
    optional uint32 width = 8;
    optional bool skip_fusion = 9 [default = false];
}
message ScaleOffsetRecord {
    message MapFiledEntry {
        optional string key = 1;
        optional SingleLayerRecord value = 2;
    }
    repeated MapFiledEntry record = 1;
}
参数说明如下:
消息  | 
是否必填  | 
类型  | 
字段  | 
说明  | 
|---|---|---|---|---|
ScaleOffsetRecord  | 
-  | 
-  | 
-  | 
map结构,为保证兼容性,采用离散的map结构。  | 
repeated  | 
MapFiledEntry  | 
record  | 
每个record对应一个量化层的量化因子记录;record包括两个成员: 
  | 
|
SingleLayerRecord  | 
-  | 
-  | 
-  | 
包含了量化层所需要的所有量化因子记录信息。  | 
optional  | 
float  | 
scale_d  | 
数据量化scale因子,仅支持对数据进行统一量化。  | 
|
optional  | 
int32  | 
offset_d  | 
数据量化offset因子,仅支持对数据进行统一量化。  | 
|
repeated  | 
float  | 
scale_w  | 
权重量化scale因子,支持标量(对当前层的权重进行统一量化),向量(对当前层的权重按channel_wise方式进行量化)两种模式,仅支持卷积层(Convolution),反卷积层(Deconvolution)类型进行channel_wise量化模式。  | 
|
repeated  | 
int32  | 
offset_w  | 
权重量化offset因子,同scale_w一样支持标量和向量两种模式,且需要同scale_w维度一致,当前不支持权重带offset量化模式,offset_w仅支持0。  | 
|
repeated  | 
uint32  | 
shift_bit  | 
移位因子。convert_model接口场景下预留字段,当前不支持,不需要配置。  | 
|
optional  | 
uint32  | 
channels  | 
由于AMCT不支持整网infer_shape,需要配置当前层的输入shape信息,该字段用于配置输入的channel大小;  | 
|
optional  | 
uint32  | 
height  | 
由于AMCT不支持整网infer_shape,需要配置当前层的输入shape信息,该字段用于配置输入的height大小。  | 
|
optional  | 
uint32  | 
width  | 
由于AMCT不支持整网infer_shape,需要配置当前层的输入shape信息,该字段用于配置输入的width大小。  | 
|
optional  | 
bool  | 
skip_fusion  | 
配置当前层是否要跳过Conv+BN+Scale、Deconv+BN+Scale、BN+Scale+Conv、FC+BN+Scale融合操作,默认为false,即当前层要做上述融合。  | 
对于optional字段,由于protobuf协议未对重复出现的值报错,而是采用覆盖处理,因此出现重复配置的optional字段内容时会默认保留最后一次配置的值,需要用户自己保证文件的正确性。
record记录文件
最终生成的record文件格式为record.txt。对于一般量化层配置需要包含scale_d、offset_d、scale_w、offset_w、channels、height、width、shift_bit参数,对于AVE Pooling因为没有权重,因此不能配置scale_w、offset_w参数。量化因子record文件内容示例如下:
record {
    key: "conv1"
    value: {
        scale_d: 0.01424
        offset_d: -128
        scale_w: 0.43213
        scale_w: 0.78163
        scale_w: 1.03213
        offset_w: 0
        offset_w: 0
        offset_w: 0
        shift_bit: 1
        shift_bit: 1
        shift_bit: 1
        channels:3
        height: 144
        width: 144
        skip_fusion: true
    }
}
record {
    key: "pool1"
    value: {
        scale_d: 0.532532
        offset_d: 13
        channels:256
        height: 32
        width: 32
    }
}
record {
    key: "fc1"
    value: {
        scale_d: 0.37532
        offset_d: -67
        scale_w: 0.876221
        offset_w: 0
        shift_bit: 1
        channels:1024
        height: 1
        width: 1
    }
}