Files
2026-07-13 13:33:03 +08:00

120 lines
3.3 KiB
Protocol Buffer

syntax = "proto2";
package MNN.Compression;
message QuantizeParams {
enum RoundMode {
ROUND_TOWARDS_ZERO = 0;
ROUND_AWAY_FROM_ZERO = 1;
ROUND_HALF_TO_EVEN = 2;
}
optional RoundMode round_mode = 1 [default = ROUND_AWAY_FROM_ZERO];
// Quantization parameters for each layer that needs to be quantized.
// For a block composed of several operators, such as
// `Convolution` + `BatchNorm` + `Relu`, it should be considered as a
// single layer.
repeated LayerQuantizeParams layer = 4;
}
message LayerQuantizeParams {
// Activation quantization parameters.
// Both symmetric and asymmetric mode are supported for activation,
// and `zero_point` should always be zero if symmetric mode.
message ActivationParams {
// Activation tensor name.
required string name = 1;
optional int32 bits = 2 [default = 8];
repeated float scales = 3;
optional int32 zero_point = 4 [default = 0];
optional int32 clamp_min = 5 [default = -128];
optional int32 clamp_max = 6 [default = 127];
}
// Weight quantization parameters.
// Only symmetric mode is supported. Both channel-wise and tensor-wise
// quantization are supported, depending on whether `scales` length is
// equal to output channels.
message WeightParams {
// Weight tensor name.
required string name = 1;
optional int32 bits = 2 [default = 8];
repeated float scales = 3;
optional int32 clamp_min = 4 [default = -128];
optional int32 clamp_max = 5 [default = 127];
optional bool asymmetric = 6 [default = false];
optional int32 block_size = 7 [default = 0];
}
message WinogradParams {
required int32 version = 1 [default = 0];
// units_attr: {kyStart, kxStart, subKy, subKx, unitY, unitX} x N
repeated int32 units_attr = 4;
}
enum QuantMethod {
QAT = 0;
OverflowAware = 1;
WinogradAware = 2;
}
message ConvolutionInfo {
required int32 input_channel = 1;
required int32 output_channel = 2;
repeated int32 kernel_size = 3;
}
repeated ActivationParams input = 1;
repeated WeightParams weight = 2;
repeated ActivationParams output = 3;
optional QuantMethod method = 4 [default = QAT];
optional WinogradParams wino_params = 5;
optional string op_name = 6;
optional string subgraph_name = 7;
optional ConvolutionInfo conv = 8;
}
message LevelPrunerParams {
repeated string weight_tensor_names = 1;
repeated float prune_ratios = 2;
repeated string layer_names = 3;
}
message SIMDOCPrunerParams {
repeated string weight_tensor_names = 1;
repeated float prune_ratios = 2;
repeated string layer_names = 3;
repeated int32 oc_blocks = 4;
}
message PruneParams {
enum PruneType {
RANDOM = 0;
SIMD_OC = 1;
FILTER = 2;
}
optional PruneType type = 1 [default = RANDOM];
optional LevelPrunerParams level_pruner_params = 2;
optional SIMDOCPrunerParams simd_oc_pruner_params = 3;
}
message CompressionAlgo {
enum CompressionType {
QUANTIZE = 0;
PRUNE = 1;
}
optional CompressionType type = 1 [default = QUANTIZE];
optional QuantizeParams quant_params = 2;
optional PruneParams prune_params = 3;
}
// Model compression algorithm pipeline.
message Pipeline {
required string version = 1 [default = "0.0.0"];
repeated CompressionAlgo algo = 2;
optional string mnn_uuid = 3;
optional bool for_guide = 4 [default = false];
}