@@ -60,46 +60,63 @@ class AutoOptConfig {
6060 return calibration_step_;
6161 }
6262
63- inline void insert_or_updata_observer (std::string op_name, std::vector<float > max_values) {
63+ inline void insert_or_updata_observer (std::string op_name,
64+ std::vector<float > input_min_max_values, std::vector<float > output_min_max_values) {
6465 num_ops_id++;
6566 if (observers_.size () < num_ops_id) {
66- // Operator op = {num_ops_id - 1, op_n};
67- Observer new_observer = {num_ops_id - 1 , op_name, max_values };
67+ // this path is that user not set int8 op's configure, using default configures
68+ Observer new_observer = {num_ops_id - 1 , op_name, input_min_max_values, output_min_max_values };
6869 observers_.push_back (new_observer);
6970 } else {
70- for (auto i = 0 ; i < max_values.size (); i++)
71- observers_[num_ops_id -1 ].max_values [i] = std::max (observers_[num_ops_id -1 ].max_values [i], max_values[i]);
71+ // user has set configure or have run one interation
72+ auto input_pre = observers_[num_ops_id - 1 ].Input_min_max_values ;
73+ auto output_pre = observers_[num_ops_id - 1 ].Output_min_max_values ;
74+ if (observers_[num_ops_id - 1 ].Algorithm == " min_max" ) {
75+ observers_[num_ops_id - 1 ].Input_min_max_values [0 ] = std::min (input_pre[0 ], input_min_max_values[0 ]);
76+ observers_[num_ops_id - 1 ].Input_min_max_values [1 ] = std::max (input_pre[1 ], input_min_max_values[1 ]);
77+ observers_[num_ops_id - 1 ].Output_min_max_values [0 ] = std::min (output_pre[0 ], output_min_max_values[0 ]);
78+ observers_[num_ops_id - 1 ].Output_min_max_values [1 ] = std::max (output_pre[1 ], output_min_max_values[1 ]);
79+ } else if (observers_[num_ops_id -1 ].Algorithm == " moving_averager_min_max" ){
80+ auto c = observers_[num_ops_id - 1 ].Averaging_constant ;
81+ observers_[num_ops_id - 1 ].Input_min_max_values [0 ] = (1 - c) * input_pre[0 ] + c * input_min_max_values[0 ];
82+ observers_[num_ops_id - 1 ].Input_min_max_values [1 ] = (1 - c) * input_pre[1 ] + c * input_min_max_values[1 ];
83+ observers_[num_ops_id - 1 ].Output_min_max_values [0 ] = (1 - c) * output_pre[0 ] + c * output_min_max_values[0 ];
84+ observers_[num_ops_id - 1 ].Output_min_max_values [1 ] = (1 - c) * output_pre[1 ] + c * output_min_max_values[1 ];
85+ }
7286 }
7387 }
7488
89+ /*
7590 inline void print_observer() {
7691 for (auto i = 0; i< observers_.size(); i++) {
7792 for (auto j = 0; j < observers_[i].max_values.size(); j++)
7893 std::cout<<observers_[i].max_values[j]<<std::endl;
7994 }
8095 }
81-
96+ */
8297 inline void print_indicator () {
8398 for (auto i = 0 ; i< indicators_.size (); i++) {
8499 auto scales = indicators_[i].get_indicator_scales ();
85100 for (auto j = 0 ; j< scales.size (); j++)
86101 std::cout<<scales[j]<<std::endl;
87102 }
88103 }
89-
104+
90105 inline void add_indicators () {
91106 num_ops_id = 0 ;
92107 // default used is s8
93108 for (auto i = 0 ; i < observers_.size (); i++) {
94109 std::vector<float > scales;
95- std::vector<bool > uint8_used;
96- for (auto j = 0 ; j < observers_[i].max_values .size (); j++) {
97- scales.push_back (127.5 / observers_[i].max_values [j]);
98- uint8_used.push_back (false );
99- }
100- // zero_points not used now, zero_points = 0 for u8 and 128 for s8.
101- // zero_point = 128;
102- Indicator new_indicator (observers_[i].Id , observers_[i].Name , scales, uint8_used, true );
110+ std::vector<float > input_values = observers_[i].Input_min_max_values ;
111+ std::vector<float > output_values = observers_[i].Output_min_max_values ;
112+
113+ scales.push_back (127.5 / std::max (std::abs (input_values[0 ]), input_values[1 ]));
114+ scales.push_back (127.5 / std::max (std::abs (output_values[0 ]), output_values[1 ]));
115+ // zero_points not used now, zero_points = 0 for u8 and 128 for s8.
116+ // zero_point = 128;
117+ Indicator new_indicator (observers_[i].Id , observers_[i].Name , observers_[i].Algorithm ,
118+ observers_[i].Weight_granularity , scales, {observers_[i].Input_dtype_uint8 , observers_[i].Output_dtype_uint8 },
119+ observers_[i].Quantized );
103120 indicators_.push_back (new_indicator);
104121 }
105122 observers_.clear ();
0 commit comments