LabHub
배우기 러닝패스 코스

트랜스포머 — 어텐션을 손으로 계산한다 · 정수 양자화가 정확도에 주는 영향 · 실습

int8 의 산술을 손으로 한다

LabHub 에서 이어서 보기

목표

정수 양자화의 산술을 표준 라이브러리만으로 직접 한다. 반올림 규칙을 못 박는 것에서 시작해 대칭·비대칭 양자화를 만들고, 접었다 편 값의 오차를 재고, 이상치 하나가 배율을 얼마나 망가뜨리는지 세고, 텐서 단위와 행 단위를 나란히 견주고, 코드끼리 정수로만 곱하고, 마지막으로 그 오차가 소프트맥스를 지나 확률에서 얼마가 되는지 잰다.

왜 중요한가

양자화 도구는 한 줄이다. 그 안에서 무슨 산술이 일어났는지 모르면 정확도가 떨어졌을 때 옵션을 바꿔 가며 다시 돌려 보는 것밖에 할 수 없다. 배율이 무엇으로 정해지는지, 반올림이 어느 쪽으로 가는지, 단위를 좁히면 무엇이 달라지는지를 값 여덟 개짜리 목록에서 한 번 보고 나면 큰 모델에서도 같은 자리를 짚을 수 있다.
이 실습은 도구를 쓰지 않는다. 이 파드의 시스템 파이썬에는 numpy 가 없고(numpy 는 /opt/onnx-lab/bin/python 안에만 있습니다) 모델도 부르지 않는다. 그래서 "어느 모델이 int8 에서 정확도가 몇 퍼센트 떨어진다" 같은 말은 여기서 하지 않는다. 여러분이 만든 목록과 행렬에서 잰 숫자만 쓴다.
어려운 것은 식이 아니라 세부다. 0.5 를 어느 쪽으로 보낼지, 범위 밖을 자를지 말지, 배율을 무엇의 최대값으로 잡을지가 정해져 있지 않으면 같은 입력으로도 코드가 한 칸씩 어긋난다.
채점기는 여러분이 적어 둔 설명을 믿지 않는다. 여러분의 모듈을 실제로 불러 매번 다른 입력으로 함수를 두드려 보고, 채점기가 따로 계산한 값과 대조한다. 대조의 대부분은 정수 배열끼리라 흔들림이 없다.

단계

1. /root/work/tf-quant/quant.pyQMAX = 127·UMAX = 255round_half_even(x)·round_half_away(x)·rounding_gap(values) 를 만드세요. 두 반올림 규칙이 어디서 갈리는지 눈으로 확인합니다.
2. sym_scale(values)·quantize_sym(values, scale)·dequantize_sym(codes, scale) 를 더해 대칭 양자화를 만드세요. 배율은 max(|x|) / 127 입니다.
3. affine_params(values)·quantize_affine(values, scale, zero_point)·dequantize_affine(codes, scale, zero_point) 를 더해 비대칭 양자화를 만드세요. 배율은 (max - min) / 255 입니다.
4. levels_used(codes)error_stats(original, restored) 를 더해 오차를 재는 자를 만드세요.
5. outlier_effect(values, outlier) 를 더해 큰 값 하나가 나머지 값들에게 무슨 일을 하는지 재게 하세요.
6. quantize_tensor(matrix)·quantize_rows(matrix)·granularity_gap(matrix) 를 더해 텐서 단위와 행 단위를 견주세요.
7. transpose(matrix)·int_matmul(left_codes, right_codes)·float_matmul(left, right)·quant_matmul(left, right) 를 더해 정수만으로 행렬을 곱하세요.
8. WEIGHTS·OUTLIER·QUERIES·KEYSsoftmax(scores)·attention_shift(queries, keys) 를 만들고, /root/work/tf-quant/quant_report.json/root/work/tf-quant/quant_report.md 에 결과를 기록하세요.

참고

단계 8개

  1. 반올림부터 못 박는다
  2. 대칭 양자화로 접었다 편다
  3. 비대칭 양자화로 256칸을 다 쓴다
  4. 얼마나 벌어졌는지 재는 자
  5. 큰 값 하나가 나머지에게 하는 일
  6. 텐서 하나의 배율 대 행마다의 배율
  7. 정수만으로 행렬을 곱한다
  8. 소프트맥스를 지난 뒤에 남는 것