测验:动态量化
한국어 원문으로 표시합니다.
동적 양자화에 보정 자료가 필요 없는 이유로 가장 정확한 것은?
- 가중치만 바꾸고 활성은 float32 그대로 두기 때문이다
- 활성의 스케일을 추론할 때마다 그 텐서를 보고 정하기 때문이다
- 정수 커널이 범위를 자동으로 넓혀 포화가 나지 않기 때문이다
- 변환기가 모델 파일 안에 저장된 학습 통계를 읽어 쓰기 때문이다
MLP 하나를 동적 양자화했더니 파일이 오히려 커졌다. 가장 그럴듯한 설명은?
- 가중치가 원래 작아서 새로 든 노드와 스케일 초기자가 줄어든 양보다 크다
- int8 저장이 float32 보다 자리를 더 쓰는 형식이라 그렇다
- 양자화가 실패해 원본 가중치가 한 벌 더 들어갔다
- 보정 자료가 모델 안에 함께 저장되었다
동적 양자화한 모델에 같은 입력 열두 줄을 넣었다. 한 번은 그대로, 한 번은 값이 아주 큰 한 줄을 아래에 붙여서. 앞의 열두 줄의 결과는?
- 두 경우가 정확히 같다. 줄마다 따로 계산하므로 이웃의 영향을 받지 않는다
- 붙인 줄이 있는 쪽이 오히려 더 정확하다. 범위가 넓어져 포화가 줄기 때문이다
- 붙인 줄이 있는 쪽이 나빠진다. 스케일이 그 배치 전체의 최댓값으로 정해지기 때문이다
- 붙인 줄이 있는 쪽에서 오류가 난다. 배치 안의 값 범위가 너무 넓기 때문이다
MatMul 두 개짜리 모델을 동적 양자화한 뒤 그래프를 열었다. 무엇을 보게 되는가?
- MatMul 두 개가 그대로 있고 앞뒤에 QuantizeLinear 와 DequantizeLinear 가 붙어 있다
- MatMul 이 사라지고 DynamicQuantizeLinear 와 MatMulInteger 가 들어와 있다
- MatMul 이 QLinearMatMul 하나로 바뀌어 있고 스케일이 속성으로 박혀 있다
- MatMul 이 Gemm 으로 합쳐지고 가중치만 int8 초기자로 바뀌어 있다
DynamicQuantizeLinear 가 범위를 잡을 때 자료의 최솟값과 최댓값에 0 을 함께 넣는 이유는?
- uint8 이 음수를 담지 못해 최솟값을 0 으로 올려야 하기 때문이다
- 스케일이 0 으로 나뉘는 것을 막기 위한 안전장치이기 때문이다
- 0 이 표현 가능한 눈금 위에 정확히 앉아야 패딩과 ReLU 의 0 이 되살아나기 때문이다
- 영점을 0 으로 고정해 정수 커널에서 뺄셈을 없애기 위해서이다
동적 양자화한 모델의 초기자를 세어 보니 편향이 여전히 float32 였다. 이것은?
- 변환기 결함이므로 편향도 int8 로 바꾸도록 옵션을 주어야 한다
- 가중치 자료형을 QUInt8 이 아니라 QInt8 로 주어서 생긴 차이다
- 전처리를 건너뛰어 편향이 상수 접기에서 빠진 결과다
- 정상이다. 줄어드는 것은 행렬이고 편향은 그대로 남으며 그 옆에 스케일과 영점이 붙는다