record记录文件
record文件,为基于protobuf协议的序列化数据结构文件,记录量化场景量化因子scale/offset等,通过该文件、压缩配置文件以及原始网络模型文件,生成压缩后的模型文件。
量化场景record原型定义
syntax = "proto2";
import "amct_tensorflow/proto/basic_info.proto";
package AMCTTensorflow;
// this proto is designed for amct tools
message InnerSingleLayerRecord {
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;
// the cluster of nuq, only nuq layer has this field;
repeated int32 cluster = 6;
optional bool skip_fusion = 9 [default = false];
optional string dst_type = 10 [default = 'INT8'];
repeated string prune_producer = 11;
repeated string prune_consumer = 12;
repeated float tensor_balance_factor = 13;
optional string act_type = 14 [default = 'INT8'];
optional string wts_type = 15 [default = 'INT8'];
}
message InnerMapFiledEntry {
optional string key = 1;
optional InnerSingleLayerRecord value = 2;
}
message InnerScaleOffsetRecord {
repeated InnerMapFiledEntry 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;
}
该场景下对应参数说明如下:
消息 |
是否必填 |
类型 |
字段 |
说明 |
|---|---|---|---|---|
InnerSingleLayerRecord |
- |
- |
- |
包含了量化层所需要的所有量化因子记录信息。 |
optional |
float |
scale_d |
数据量化scale因子,仅支持对数据进行统一量化。 |
|
optional |
int32 |
offset_d |
数据量化offset因子,仅支持对数据进行统一量化。 |
|
repeated |
float |
scale_w |
权重量化scale因子,支持标量(对当前层的权重进行统一量化),向量(对当前层的权重按channel_wise方式进行量化)两种模式,仅支持卷积层(Conv2D)、Depthwise卷积层(DepthwiseConv2dNative)、反卷积层(Conv2DBackpropInput)类型进行channel_wise量化模式。 |
|
repeated |
int32 |
offset_w |
权重量化offset因子,同scale_w一样支持标量和向量两种模式,且需要同scale_w维度一致,当前不支持权重带offset量化模式,offset_w仅支持0。 |
|
repeated |
uint32 |
shift_bit |
移位因子。预留字段,当前不支持,不需要配置。 |
|
repeated |
int32 |
cluster |
聚类中心。只有非均匀量化场景下需要使能该字段,该版本不支持该字段。 |
|
optional |
bool |
skip_fusion |
配置当前层是否要跳过Conv+BN融合、Depthwise_Conv+BN融合、Group_conv+BN融合、BatchNorm融合,默认为false,即当前层要做上述融合。 |
|
optional |
string |
dst_type |
量化位宽,包括INT8和INT4两种量化类型。该版本暂不支持该字段。 |
|
InnerScaleOffsetRecord |
- |
- |
- |
map结构,为保证兼容性,采用离散的map结构。 |
repeated |
InnerMapFiledEntry |
record |
每个record对应一个量化层的量化因子记录;record包括两个成员:
|
|
InnerMapFiledEntry |
optional |
string |
key |
层名。 |
optional |
InnerSingleLayerRecord |
value |
量化因子配置。 |
|
PruneRecord |
- |
- |
- |
稀疏信息的记录。不支持该特性。 |
repeated |
PruneNode |
producer |
稀疏的producer,可稀疏结点间级联关系的根节点。 例如conv1>bn>relu>conv2都可以稀疏,且bn、relu、conv2都会受到conv1稀疏的影响,则bn、relu、conv2是conv1的consumer;conv1是bn、relu、conv2的producer。 |
|
repeated |
PruneNode |
consumer |
稀疏的consumer,可稀疏结点间级联关系的下游节点。 例如conv1>bn>relu>conv2都可以稀疏,且bn、relu、conv2都会受到conv1稀疏的影响,则bn、relu、conv2是conv1的consumer;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。
对于一般量化层配置需要包含scale_d、offset_d、scale_w、offset_w参数,对于AvgPool因为没有权重,因此不能配置scale_w、offset_w参数。量化因子record文件内容示例如下(如下示例以inner_scale_offset_record.proto原型文件对应的量化因子为例进行说明):
record {
key: "fc4/Tensordot/MatMul"
value {
scale_d: 0.0798481479
offset_d: 1
scale_w: 0.00297622895
offset_w: 0
}
}
record {
key: "depthwise"
value {
scale_d: 0.00962011795
offset_d: 1
scale_w: 0.00787108205
scale_w: 0.00787108205
scale_w: 0.00787108205
offset_w: 0
offset_w: 0
offset_w: 0
skip_fusion: true
}
}
record {
key: "conv2d/Conv2D"
value {
scale_d: 0.00392156886
offset_d: -128
scale_w: 0.00106807391
scale_w: 0.00104224426
scale_w: 0.0010603976
offset_w: 0
offset_w: 0
offset_w: 0
}
}