Local AI
모든 AI 개발자의 꿈.
그것은 바로 로컬에서 나만을 위해 돌아가는 AI일 것이다.
RAG을 구축하고, DB를 통해 나만을 기억해 주는 개쩌는 로컬 AI
uncensered 를 활용해서 제한 없이 자쥬 자제로 고성능의 AI를 휘두루는 맛은 한번 중독되면 벗어나기 힘들다.
아무리 Gemma-4 나 Nemotron-3 같은 가정? 로컬용 모델들이 나와도 당장 5060ti 16GB 만 해도 100가까지 가는 현 상황에선
30B 모델조차 부담스러운 상황이다.
이런 당신을 위해 존재하는 양자화.
말 그대로 모델의 가중치를 일부 덜어내서 돌리는 방식이라 해상도가 떨어지므로 모델 성능이 떨어지게 된다.
하지만 이걸 또 해결하는 NF4 양자화.
자세히 알아보자.
Quantization
기존에 사용하던 양자화는 INT4 방식이였다.
이건 최대, 최소값을 기준으로 구간을 $2^4$으로 나누어 버린다.
하지만, 실제 모델의 W는 균등하게 분포하지 않고, 평균이 0인 정규분포를 따르는 경향이 있다. 이는 0 근처에 가중치의 90% 이상이 몰려 있고 양끝 극단에는 별로 없다는 거다.
근데 균등하게 16등분 하면 중앙에 있는 귀중한 가중치들 다 토막나 죽어보린다. 이러니까 기존 방식이 모델 바보 만드는 거였다.
반면, NF4는 샤넌 엔트로피를 극대화 시키는 방법을 사용한다.
이건 균등이 아니라 각 구간에 들어가는 데이터 개수를 똑같이 나눈다. 분위수 양자화라고도 하더라.
대충 갈겨보면,
가중치 텐서가 표준 정규분포 $X \sim \mathcal{N}(0, 1)$을 따른다고 가정할 때, 정규분포의 확률밀도함수(PDF)는 다음과 같다.
누적분포함수(CDF) $\Phi(x)$를 써서, 확률 공간 $p \in [0, 1]$을 동일한 면적으로 분할한다.
이년도 마찬가지로 16개로 분할 하기는 한다.
근데 막하지는 않고 각 구역의 대푯값 계산해서 고정된 데이터 타입으로 만든다.
익숙한거 같죠 MHL 생각나죠.
CDF의 역함수인 분위수 함수 $Q(p)$를 사용하면 다음과 같다.
\[Q(p) = \Phi^{-1}(p)\]$2^k$개의 양자화 수준 $q_i$를 구하기 위해 확률 공간을 다음과 같이 나눈다.
\[q_i = \Phi^{-1}\left( \frac{i + 0.5}{2^k} \right) \quad \text{for } i = 0, 1, \dots, 2^k - 1\]거 논문에선 근사 오차 줄일려고 $\frac{i}{2^k+1}$ 형태의 분할 사용한 다음에 평균낸다.
자 근데 생각해 보면,
신경망 돌 때 정확히 0 인 노드는 무조건 있어야 한다.
그래야 패딩 드롭아웃 연산할 때 지랄나지 않는데, 앞선 것처럼 분할하면 0이 $q_i$ 중 하나로 안떨어지니까 과적합이 조온나 날 수 밖에 없다.
이걸 쳐내려고 비대칭 데이터 타입을 쓴다.
이게 뭐냐면
규분포를 음수 부분 $[-1, 0]$과 양수 부분 $[0, 1]$로 자른다.
음수 부분을 ($x \le 0$): $2^{k-1}$ 8개의 분위수를 할당한다.
양수 부분을 ($x \ge 0$): $2^{k-1} + 1$ 9개의 분위수를 할당한다.
이렇게 하면 양 쪽 배열이 모두 0을 포함하며 겹치게 되는데,
겹치는거 빼면 0 포함하면서도 정규분포 형태를 보존하게 16등분이 가능해진다.
이 값들이 $[-1, 1]$ 범위로 정규화되어 하드코딩되는거다.
위 내용이 원리고, 실제 Gradio 에선 bitsandbytes로 쌀먹하는데 이게 어캐 작동하냐면,
-
블록별 최대값 정규화 가중치 블록 절대값 중 가장 큰 값을 스케일링 팩터로 한다.
\(c = \max(|W|)\) -
가중치를 c로 나누어 -1 ~ 1 범위로 한다.
\(W_{norm} = \frac{W}{c}\) -
양자화 정규화된 가중치를 앞서 계산된 16개의 NF4 상수 테이블 $q \in \text{NF4}$ 중 가장 가까운 값으로 맵핑한다. 이때 4bit 메모리만 소비된다.
- 추론할 때 역양자화 사용자 텍스트 처리할 때 모델은 저장된 4-bit 값 $W^{Q}$를 다시 16-bit(BF16) 스케일로 복원하여 행렬 곱셈을 수행한다.
bnb_4bit_compute_dtype=torch.bfloat16 이런식으로 연산타입 지정하면 쓸 수 있다.
결론
개쩔죠
이게 요물이다.
5060ti + 3070 족보없는 조합으로도 별의별 모델 다 돌릴 수 있다.
이것 말도고 디테일은 엄청 많으니 천천히 풀어보도록 하겠다.