量化因子记录文件
量化因子record文件格式,为基于protobuf协议的序列化数据结构文件,通过该文件、量化配置文件以及原始网络模型文件,生成量化后的模型文件。
- convert_model接口量化场景下对应的protobuf原型定义为(或查看昇腾模型压缩工具安装目录/amct_tensorflow/proto/scale_offset_record_tf.proto文件):
syntax = "proto2"; package AMCTTensorflow; // this proto is designed for convert_model API message SingleLayerRecord { optional float scale_d = 1; optional int32 offset_d = 2; repeated float scale_w = 3; repeated int32 offset_w = 4; // convert_model does not support this field [shift_bit] yet repeated uint32 shift_bit = 5; optional bool skip_fusion = 9 [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)、Depthwise卷积层(DepthwiseConv2dNative)、反卷积层(Conv2DBackpropInput)类型进行channel_wise量化模式。
repeated
int32
offset_w
权重量化offset因子,同scale_w一样支持标量和向量两种模式,且需要同scale_w维度一致,当前不支持权重带offset量化模式,offset_w仅支持0。
repeated
uint32
shift_bit
移位因子。convert_model接口场景下预留字段,当前不支持,不需要配置。
optional
bool
skip_fusion
配置当前层是否要跳过Conv+BN融合、Depthwise_Conv+BN融合、Group_conv+BN融合、BatchNorm融合,默认为false,即当前层要做上述融合。
ScaleOffsetRecord
-
-
-
map结构,为保证兼容性,采用离散的map结构。
repeated
MapFiledEntry
record
每个record对应一个量化层的量化因子记录;record包括两个成员:
- key为所记录量化层的layer name。
- value对应SingleLayerRecord定义的具体量化因子。
MapFiledEntry
optional
string
key
层名。
optional
SingleLayerRecord
value
量化因子配置。
- 量化感知训练或稀疏场景下由昇腾模型压缩工具生成的量化因子对应的protobuf原型定义为(或查看昇腾模型压缩工具安装目录/amct_tensorflow/proto/inner_scale_offset_record_tf.proto文件):
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; } 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包括两个成员:
- key为所记录量化层的layer name。
- value对应SingleLayerRecord定义的具体量化因子。
repeated
PruneRecord
prune_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文件
对于一般量化层需要配置包含scale_d、offset_d、scale_w、offset_w、shift_bit参数,对于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 shift_bit: 1 dst_type: "INT8" } } 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 shift_bit: 1 shift_bit: 1 shift_bit: 1 skip_fusion: true dst_type: "INT4" } } 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 shift_bit: 1 shift_bit: 1 shift_bit: 1 dst_type: "INT4" } }
- 通道稀疏record文件记录各稀疏层间的级联关系,其格式参考示例如下:
prune_record { producer { name: "conv_1" 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: "conv2d/Conv2D" attr { name: "mask_shape" type: INTS ints: 3 ints: 3 ints: 3 ints: 32 } } }