퀴즈: 연산자별 지원과 대체
정적 QDQ 로 양자화한 모델을 열었더니 MatMul 이 그대로 보인다. 어떻게 읽어야 하는가?
- 양자화가 실패했으므로 옵션을 바꿔 다시 돌려야 한다
- QDQ 형식은 연산자를 바꾸지 않고 텐서마다 Q/DQ 를 끼우므로 정상이다
- MatMul 은 int8 을 지원하지 않는 연산자라 건너뛴 것이다
- 파일을 잘못 열었거나 원본을 덮어쓴 것이다
이 실습이 쓰는 감싸임 판정에서 float 로 남았다고 보는 연산자는?
- 출력 텐서의 이름이 원본과 달라진 모든 연산자
- 가중치가 초기값으로 파일에 들어 있는 연산자
- 입력이 DQ 에서 안 오거나 출력이 Q 로 안 가는 연산자
- 옵션에 이름을 적어 두지 않은 모든 연산자
float 섬이 많아질수록 나빠지는 것으로 이 실습이 세어 보이는 것은?
- 초기값의 개수
- 그래프의 전체 노드 이름 길이
- 섬마다 붙는 Q/DQ 경계의 수
- 모델 파일의 opset 번호
가중치에 붙은 DequantizeLinear 에는 짝이 되는 QuantizeLinear 가 없다. 그 이유는?
- 가중치는 실행할 때마다 새로 양자화되기 때문이다
- 가중치는 활성값과 달리 보정 자료가 필요 없기 때문이다
- 도구가 가중치의 QuantizeLinear 를 실수로 빠뜨린 것이다
- 가중치는 이미 int8 로 파일에 저장돼 있어 풀기만 하면 되기 때문이다
nodes_to_exclude 로 MatMul 하나를 뺀 판과 op_types_to_quantize 를 MatMul 로 좁힌 판의 차이는?
- 앞의 것은 그 노드만 섬이 되고, 뒤의 것은 그 종류 밖의 연산자들이 섬이 된다
- 앞의 것은 파일이 커지고 뒤의 것은 작아진다는 점만 다르다
- 둘은 표현만 다를 뿐 같은 그래프를 만든다
- 앞의 것은 QDQ 형식이 아니게 되고 뒤의 것만 QDQ 로 남는다
MatMul 과 Add 를 Gemm 하나로 합치면 Q/DQ 왕복이 줄어드는 까닭은?
- Gemm 이 int8 전용 연산자여서 Q/DQ 가 필요 없기 때문이다
- 둘 사이의 중간 텐서가 사라져 그 텐서에 붙던 Q/DQ 한 쌍이 없어지기 때문이다
- Gemm 이 편향을 float 로 유지해 양자화 대상에서 빠지기 때문이다
- 노드 수가 줄면 도구가 경계를 자동으로 합치기 때문이다