record记录文件
record文件,为基于protobuf协议的序列化数据结构文件,记录量化场景量化因子Scale/Offset,稀疏场景各稀疏层间的级联关系等,通过该文件、压缩配置文件以及原始网络模型文件,生成压缩后的模型文件。
record原型定义
record文件对应的protobuf原型定义为(或查看AMCT安装目录/amct_pytorch/proto/scale_offset_record_pytorch.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;
    repeated float tensor_balance_factor = 6;
    optional bool skip_fusion = 9 [default = true];
    optional string dst_type = 10 [default = 'INT8'];
    optional string act_type = 11 [default = 'INT8'];
    optional string wts_type = 12 [default = 'INT8'];
}
message MapFiledEntry {
    optional string key = 1;
    optional SingleLayerRecord value = 2;
}
message ScaleOffsetRecord {
    repeated MapFiledEntry record = 1;
    repeated PruneRecord prune_record = 2;
}
message PruneRecord {
    repeated PruneNode producer = 1;
    repeated PruneNode consumer = 2;
    optional PruneNode selective_prune = 3;
}
message PruneNode {
    required string name = 1;
    repeated AMCTProto.AttrProto attr = 2;
}
参数说明如下:
| 消息 | 是否必填 | 类型 | 字段 | 说明 | 
|---|---|---|---|---|
| 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 | 移位因子。保留参数,shift_bit参数不会写入record文件。 | |
| optional | bool | skip_fusion | 配置当前层是否要跳过Conv+BN融合,默认为false,即当前层要做上述融合。 | |
| optional | string | dst_type | 量化位宽,包括INT8和INT4两种量化类型。该字段仅量化感知训练场景使用。 | |
| repeated | float | tensor_balance_factor | 均衡量化因子。该字段仅量化数据均衡预处理场景使用。 | |
| optional | string | act_type | 数据量化位宽,包括INT8和INT16两种量化类型。当前版本仅支持INT8量化。 | |
| optional | string | wts_type | 权重量化位宽,仅支持INT8量化类型。 | |
| ScaleOffsetRecord | - | - | - | map结构,为保证兼容性,采用离散的map结构。 | 
| repeated | MapFiledEntry | record | 每个record对应一个量化层的量化因子记录;record包括两个成员: 
 | |
| MapFiledEntry | optional | string | key | 层名。 | 
| optional | SingleLayerRecord | value | 量化因子配置。 | |
| PruneRecord | - | - | - | 稀疏信息的记录。 | 
| repeated | PruneNode | producer | 稀疏的producer,可稀疏结点间级联关系的根节点。 例如conv1>bn>relu>conv2都可以稀疏,且bn、relu、conv2都会受到conv1稀疏的影响,则bn、relu、conv2是conv1的consume;conv1是bn、relu、conv2的producer。 | |
| repeated | PruneNode | consumer | 稀疏的consumer,可稀疏结点间级联关系的下游节点。 例如conv1>bn>relu>conv2都可以稀疏,且bn、relu、conv2都会受到conv1稀疏的影响,则bn、relu、conv2是conv1的consume;conv1是bn、relu、conv2的producer。 | |
| optional | PruneNode | selective_prune | 4选2结构化稀疏节点。 | |
| PruneNode | - | - | - | 稀疏的节点。 | 
| required | string | name | 节点名称。 | |
| repeated | AMCTProto.AttrProto | attr | 节点属性。 | 
对于optional字段,由于protobuf协议未对重复出现的值报错,而是采用覆盖处理,因此出现重复配置的optional字段内容时会默认保留最后一次配置的值,需要用户自己保证文件的正确性。
record记录文件
最终生成的record文件格式为record.txt,文件内容根据特性不同划分如下。
- 量化特性record文件对于一般量化层配置需要包含scale_d、offset_d、scale_w、offset_w参数,文件内容示例如下: record { key: "conv1" value { scale_d: 0.0798481479 offset_d: 1 scale_w: 0.00297622895 offset_w: 0 skip_fusion: true dst_type: "INT8" } } record { key: "layer1.0.conv1" value { scale_d: 0.00392156886 offset_d: -128 scale_w: 0.00106807391 scale_w: 0.00104224426 offset_w: 0 offset_w: 0 dst_type: "INT4" } }
- 量化数据均衡预处理特性record文件,内容示例如下:record { key: "linear_1" value { scale_d: 0.00784554612 offset_d: -1 scale_w: 0.00778095098 offset_w: 0 tensor_balance_factor: 0.948409557 tensor_balance_factor: 0.984379828 } } record { key: "conv_1" value { scale_d: 0.00759239076 offset_d: -4 scale_w: 0.0075149606 offset_w: 0 tensor_balance_factor: 1.04744744 tensor_balance_factor: 1.44586647 } }
- 通道稀疏record文件记录各稀疏层间的级联关系,文件内容示例如下:prune_record { producer { name: "conv1" attr { name: "type" type: STRING s: "Conv2d" } attr { name: "begin" type: INT i: 0 } attr { name: "end" type: INT i: 64 } } consumer { name: "BN_1" attr { name: "type" type: STRING s: "FusedBatchNormV3" } attr { name: "begin" type: INT i: 0 } attr { name: "end" type: INT i: 64 } } }
- 结构化稀疏record文件内容示例如下:prune_record { selective_prune { name: "conv1" attr { name: "mask_shape" type: INTS ints: 3 ints: 3 ints: 3 ints: 32 } } }