MCPcopy Create free account
hub / github.com/alibaba/MNN / computeScaleADMM

Method computeScaleADMM

tools/quantization/TensorStatistic.cpp:236–277  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

234}
235
236std::pair<float, int8_t> TensorStatistic::computeScaleADMM() {
237 const int count = mOriginTensor->elementSize();
238 float max = 0;
239 const float bound = mFeatureClampValue;
240 const float* originData = mOriginTensor->host<float>();
241
242 for (int i = 0; i < count; i++) {
243 float absData = std::fabs(originData[i]);
244 if (absData > max) {
245 max = absData;
246 }
247 }
248 float alpha = max / (bound * 2.5);
249
250 // DLOG(INFO) << "alpha init: " << alpha;
251
252 const int maxStep = 300;
253 float sum1 = 0;
254 float sum2 = 0;
255 float invAlpha;
256
257 for (int i = 0; i < maxStep; i++) {
258 sum1 = 0;
259 sum2 = 0;
260 invAlpha = 1 / alpha;
261
262 for (int i = 0; i < count; i++) {
263 auto origin = originData[i];
264 auto dataQuant = std::roundf(origin * invAlpha);
265 dataQuant = std::fmin(bound, std::fmax(-bound, dataQuant));
266 sum1 += (dataQuant * origin);
267 sum2 += (dataQuant * dataQuant);
268 }
269
270 alpha = sum1 / sum2;
271 }
272 // DLOG(INFO) << "alpha final: " << alpha;
273 mScale = alpha;
274 mVisited = true;
275 mZeroPoint = 0;
276 return std::make_pair(mScale, mZeroPoint);
277}
278
279std::pair<std::vector<float>, float> TensorStatistic::fakeQuantFeature() {
280 const int count = mOriginTensor->elementSize();

Callers 1

Calls 3

fabsFunction · 0.85
fminFunction · 0.85
fmaxFunction · 0.85

Tested by

no test coverage detected