LabHub
배우기 러닝패스 코스

AI 다이어트 실패 사건 · 보정 자료가 범위를 정한다 · 실습

보정 자료가 정확도를 정한다 — 좁게·맞게·넓게 세 번

LabHub 에서 이어서 보기

목표

CalibrationDataReader 를 직접 구현하고, 같은 모델을 좁은·맞는·넓은 보정 자료 세 벌로 정적 양자화해 그래프에 박히는 입력 스케일과 자기가 잰 최대 절대 오차를 나란히 남긴다. 그리고 어긋난 보정은 표본 수로 못 고친다는 것과, QDQ 와 QOperator 가 같은 계산의 다른 모양이라는 것을 재어서 확인한다.

왜 중요한가

정적 양자화는 활성의 스케일을 변환 시점에 못박고, 그 스케일은 보정 자료가 정한다. 그래서 보정 자료는 설정값이 아니라 입력값이다. 같은 모델과 같은 명령이라도 보정 자료가 다르면 완전히 다른 모델이 나온다. 그런데 그 자료는 코드에도 로그에도 남지 않는다.
무너지는 방향은 둘이다. 보정이 본 범위가 실제보다 좁으면 밖으로 나간 값이 정수 자료형의 끝에 붙어 버리고 역양자화로 돌아오지 않는다. 넓으면 잘리지는 않지만 쓰이지도 않는 범위에 눈금을 나눠 주므로 실제로 값이 사는 구간의 해상도가 떨어진다. 어느 쪽인지는 오차 하나만 봐서는 모르고, 세 벌로 재어 봐야 갈린다.
그리고 표본 수로 못 고치는 종류가 있다. 보정 자료의 분포 자체가 어긋나 있으면 그 자료를 512배로 늘려도 관찰 범위는 조금밖에 안 넓어진다. 수가 아니라 분포가 문제일 때를 구분할 수 있어야 시간을 엉뚱한 곳에 쓰지 않는다.
채점기는 여러분이 적어 낸 숫자를 믿지 않는다. 여러분의 공급기를 직접 몰아 계약을 지키는지 보고, 채점기가 지은 모델에 여러분의 도구를 걸어 보고, 적어 낸 오차를 여러분의 모델 파일로 다시 계산해 대조한다.

단계

1. /root/onnxq-calib/gen_model.py 를 만들어 실행해 /root/onnxq-calib/fp32.onnx 를 만드세요.
2. /root/onnxq-calib/reader.pymake_reader(arrays, input_name) 를 만드세요.
3. /root/onnxq-calib/calibtool.pyquantizescales 를 만들어 /root/onnxq-calib/int8_match.onnx/root/onnxq-calib/match.json 을 만드세요.
4. error 를 더하고 좁은 보정으로 /root/onnxq-calib/int8_narrow.onnx/root/onnxq-calib/narrow.json 을 만드세요.
5. 넓은 보정으로 /root/onnxq-calib/int8_wide.onnx/root/onnxq-calib/wide.json 을 만드세요.
6. 셋을 한자리에 모아 /root/onnxq-calib/calib_report.json 을 만드세요.
7. 좁은 보정을 1·8·64·512 묶음으로 늘려 보고 /root/onnxq-calib/samples.json 에 적으세요.
8. 같은 보정으로 QOperator 형식도 뽑아 /root/onnxq-calib/format.json/root/onnxq-calib/report.md 를 만드세요.

참고

단계 8개

  1. 잴 대상을 손에 쥔다
  2. 변환기에 자료를 흘려 넣는 계약
  3. 맞는 보정으로 한 번
  4. 좁은 보정 — 잘린다
  5. 넓은 보정 — 뭉개진다
  6. 셋을 한자리에 놓기
  7. 표본 수로는 못 고치는 것
  8. 같은 계산, 다른 모양