Block-wise Quantization
Quantization을 간단히 공부한적은 있지만, Block-wise Quantization에 대해서는 처음 들었다.
어제 Quantization을 공부할때 당시에 나머지는 -10~10에 몰려있는데, 하나의 값만 1000에 있는 경우, 나머지 값들이 분별력이 없어진다는 한계점을 확인했었다. Block wise Quantization이 바로 이 이상치로 인한 한계를 해결할 수 있는 방안이라고 한다.
Block-wise Quantization은 데이터를 작은 block 단위로 쪼갠다. 보통 64 혹은 128개를 하나의 그룹으로 한다. 그리고 각 그룹마다 S를 구해서, quantization을 수행한다.
- 이 그룹을 나누는 기준은 단순 크기 순일까?
아니다. 크기순으로 나누지 않고, 그냥 가중치 행렬이 메모리에 저장된 순서대로 그룹을 나누다. 왤까? 보통 GPU에서는 fp16 연산이 수행된다. 그렇다면, 가중치를 int4,8로 quantization한다고 해도 결국 행렬곱은 fp16으로 되어야 하고, de-quantization을 해야한다. 만약에 크기 순으로 처리하게 된다면, 각 가중치맵과 동일한 크기의 어떤 그룹에 속하는지 적혀있는 그룹맵이 필요하게 된다. 메모리를 줄이려다가 오히려 더 크게 만드는 셈이다. 그래서 quantization은 순서대로 그룹핑하게 된다. 그래서 0~63 인덱스는 1번그룹, 64~127 인덱스는 2번 그룹.. 이런식으로 하게 된다.
하지만, 이 방법에도 단점은 존재한다.
- 그룹별로 S를 구함에 따라, 기존에 비해 n배 많아진다. 만약 데이터가 100만개라면, S가 15625개나 필요하다.. 이에 따라, 메모리도 증가한다. 한개의 S가 32비트라고 하면, 500,000비트가 추가적으로 필요하다. 하지만, 전체 용량 대비 1~2%로 크지 않지만 PPL을 획기적으로 지킬 수 있어서 사용된다.
여튼, 이 방법을 통해, 이상치가 존재하더라도 전체 데이터에 영향을 미치는 것이 아니라, 하나의 그룹에만 영향을 미치게 되어 전체 가중치가 뭉개지는 그런 문제점은 해결하게 된것이다! 운이 안좋게도, 모든 그룹에 이상치가 하나씩 존재하는게 아니고선, 이 방법이 전체를 하나의 그룹으로 보는 방식보다 성능이 좋다!