LabHub
배우기 러닝패스 코스

AI 다이어트 실패 사건 · 연산자별 지원과 대체 · 실습

float 섬을 세어 본다 — 연산자별 지원과 대체

LabHub 에서 이어서 보기

목표

같은 모델을 다섯 가지로 내보낸 뒤, 그래프에서 int8 로 감싸인 연산자와 float 로 남은 섬을 세는 분석기 graphscan.py 를 만든다. 범위를 좁히는 두 가지 옵션의 효과를 숫자로 확인하고, 모델을 Gemm 으로 고쳐 Q/DQ 왕복을 줄인다.

왜 중요한가

양자화 도구는 자기가 아는 연산자만 int8 모양으로 바꾼다. QDQ 형식에서는 연산자 이름이 그대로 남고 텐서마다 QuantizeLinear 와 DequantizeLinear 가 끼워질 뿐이다. 그래서 "양자화했다" 와 "int8 로 돈다" 는 다른 말이고, 둘을 가르려면 그래프를 세어야 한다.
이 실습은 판정 규칙을 이렇게 고정한다. 모든 입력이 DequantizeLinear 에서 오고 모든 출력이 QuantizeLinear 로만 가는 연산자를 int8 로 감싸인 것으로 본다. 나머지는 float 로 남고, 이어진 것끼리 묶으면 float 섬이 된다.
섬은 개수보다 경계가 문제다. 섬마다 들어오는 DQ 와 나가는 Q 가 붙고, 경계마다 값을 옮겨 담는 일과 반올림이 한 번씩 더 생긴다. 섬을 줄이는 길은 둘이다. 범위를 좁혀 어긋나는 노드를 아예 빼거나, 모델을 고쳐 양자화되는 모양으로 만들거나.
채점기는 여러분이 적은 숫자를 믿지 않는다. 매번 다른 층 수·모양·제외 노드로 자기 모델을 임시 디렉터리에 만들어 여러분의 분석기를 실제로 실행하고, 채점기가 같은 규칙으로 센 값과 대조한다. 6·7단계는 여러분이 만든 모델 파일을 채점기가 직접 읽어 다시 셉니다.

단계

1. /root/ops/gen_models.py 를 만들어 실행해 /root/ops 아래 모델 다섯 개를 만드세요.
2. /root/ops/graphscan.pynodes 를 만들어 연산자 census 와 초기값 자료형을 세게 하세요.
3. qdq 를 더해 QuantizeLinear·DequantizeLinear 와 Q/DQ 왕복을 세게 하세요.
4. islands 를 더해 int8 로 감싸인 연산자와 float 섬을 가르게 하세요.
5. boundary 를 더해 섬마다 드나드는 경계를 세게 하세요.
6. diff 를 더해 두 모델의 차이를 내게 하고, 범위를 좁힌 결과를 /root/ops/scope.json 에 적으세요.
7. MatMul 과 Add 를 Gemm 으로 합친 /root/ops/gemm.onnx 와 그것을 양자화한 /root/ops/gemm_full.onnx 를 만들고 /root/ops/fuse.json 에 적으세요.
8. /root/ops/ops_report.md 를 네 절로 쓰세요.

참고

단계 8개

  1. 같은 모델을 다섯 가지로 내보내기
  2. 무엇이 들어 있는지부터 세기
  3. Q/DQ 왕복을 세기
  4. float 로 남은 섬 가려내기
  5. 섬마다 경계를 세기
  6. 범위를 좁히면 무엇이 달라지는가
  7. 모델을 고쳐 왕복을 줄이기
  8. 그래프로 답할 수 있게 적기