LabHub
배우기 러닝패스 코스

AI 다이어트 실패 사건 · 동적 양자화 · 실습

보정 자료 없이 — 동적 양자화를 재어 본다

LabHub 에서 이어서 보기

목표

dyntool.py 를 만들어 자기 모델에 동적 양자화를 걸고, 그래프가 어떻게 바뀌는지, 파일이 어디서 줄고 어디가 그대로인지, 입력 분포가 달라져도 왜 버티는지, 그리고 이 방식이 맞지 않는 경우가 어떤 모습인지를 전부 숫자로 남긴다.

왜 중요한가

정적 양자화는 대표 입력을 모아야 시작할 수 있고, 그 자료를 구하는 일이 현장에서 가장 오래 걸린다. 동적 양자화는 활성의 범위를 미리 정하지 않고 추론할 때마다 그 텐서를 보고 정하므로 모델 파일 하나만 있으면 된다. 그래서 무엇을 할지 정하기 전에 먼저 걸어 보는 기준선이 된다.
대신 무엇을 얻고 무엇을 잃는지 알아야 고를 수 있다. 얻는 것은 분포가 흔들려도 버티는 성질이다 — 배치마다 자를 다시 만드니 보정 때 본 범위 밖으로 나갈 일이 없다. 잃는 것은 재현성이다. 스케일이 그 배치 전체의 최댓값으로 정해지므로 이상값 한 줄이 같은 배치의 다른 줄까지 끌어내린다. 혼자 넣으면 멀쩡하던 입력이 이웃 때문에 나빠지는 것이다.
파일 크기도 재어 봐야 안다. 줄어드는 것은 행렬뿐이고 편향은 float32 로 남으며, 줄어든 행렬 옆에는 스케일과 영점이 따라붙는다. 가중치가 작은 모델에서는 새로 들어온 노드가 줄어든 양보다 커서 파일이 오히려 커진다.
채점기는 여러분이 적어 낸 숫자를 믿지 않는다. 매번 다른 씨앗과 모양으로 모델을 새로 지어 여러분의 도구를 실제로 실행하고, DynamicQuantizeLinear 연산자의 실제 결과 그리고 채점기가 직접 돌린 추론 결과와 대조한다.

단계

1. /root/onnxq-dyn/gen_model.py 를 만들어 실행해 /root/onnxq-dyn/fp32.onnx 를 만드세요.
2. /root/onnxq-dyn/dyntool.pyquantize 를 만들어 /root/onnxq-dyn/dyn.onnx 를 만드세요.
3. sizes 를 더해 초기자별 바이트를 세고 /root/onnxq-dyn/size.json 에 적으세요.
4. dqparams 를 더해 DynamicQuantizeLinear 가 추론마다 하는 계산을 직접 구현하세요.
5. compare 를 더해 입력 배율을 바꿔 가며 오차를 재고 /root/onnxq-dyn/batches.json 에 적으세요.
6. outlier 를 더해 이상값 한 줄이 배치를 흔드는지 재고 /root/onnxq-dyn/outlier.json 에 적으세요.
7. /root/onnxq-dyn/gen_small.py 로 아주 작은 모델을 만들어 양자화하고 /root/onnxq-dyn/unfit.json 에 적으세요.
8. /root/onnxq-dyn/report.json/root/onnxq-dyn/report.md 로 한 장에 정리하세요.

참고

단계 8개

  1. 잴 대상을 손에 쥔다
  2. 명령 한 줄로 가중치만 굳히기
  3. 어디가 줄었는지 이름으로 말하기
  4. 추론마다 자를 다시 만드는 계산
  5. 입력을 1000배 흔들어 보기
  6. 이웃 한 줄이 배치를 흔든다
  7. 작은 모델에서는 오히려 커진다
  8. 얻은 것과 잃은 것을 한 장으로