소식

수천 단어의 기술 정보! LLM 엔지니어가 꼭 읽어야 할 정량화 가이드, 시각적 일러스트레이션을 통해 대형 모델을 압축하는 방법을 알 수 있습니다.

2024-07-31

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


새로운 지혜 보고서

편집자: 편집부

[새로운 지혜 소개] LLM의 매개변수 규모가 점차 확대되는 상황에 직면하여 H100이 없는 개발자와 연구자들은 이를 보완할 수 있는 다양한 방법을 고안해 냈으며 "정량화" 기술이 그 중 하나입니다. 이 비주얼 가이드는 다양한 그림을 사용하여 "정량화"의 기본 개념과 분기 방법을 종합적으로 요약합니다.

LLM(대형 언어 모델)은 소비자급 하드웨어에서 실행하기에는 너무 큰 경우가 많습니다. 이러한 모델에는 수십억 개가 넘는 매개변수가 있을 수 있으며 추론 프로세스 속도를 높이기 위해 대용량 메모리를 갖춘 GPU가 필요한 경우가 많습니다.

따라서 훈련 방법을 개선하거나 어댑터를 사용하는 등 모델을 축소하는 방법에 초점을 맞춘 연구가 점점 더 많아지기 시작했습니다. 이 분야의 주요 기술 중 하나는 양자화(Quantization)입니다.

ML 엔지니어 Maarten Grootendorst는 언어 모델링의 맥락에서 수량화 기술을 구체적으로 소개하고 시각적 방법을 통해 관련 개념을 하나씩 탐색하여 기술에 대한 직관적인 이해를 구축하는 데 도움이 되는 블로그 게시물을 작성했습니다.


이 블로그 게시물에서 Maarten은 다양한 방법, 사용 사례 및 정량화의 기본 원칙을 살펴봅니다.

기사의 목차와 내용은 아래 그림과 같습니다. AI에 대한 기본 지식이 있는 독자는 학습 후 정량화(PTQ)와 양자화 인식 학습(QAT)의 두 가지 방법을 주로 소개합니다. 대칭 양자화 부분에 직접:


1부: LLM의 "문제"

"대형 언어 모델"은 모델 매개변수의 수 측면에서 크며 일반적으로 규모(주로 가중치)가 수십억에 이릅니다.

이러한 매개변수의 저장 비용이 상당히 높을 뿐만 아니라 추론 단계의 계산량도 큽니다.

추론 시 활성화 값은 입력과 가중치의 곱이므로 가중치 개수가 많을수록 활성화 값도 커집니다.


따라서 우리는 수십억 개의 값을 최대한 효율적으로 표현하여 매개변수를 저장하는 데 필요한 공간을 최소화하고자 합니다.

최적화하기 전에 처음부터 값이 어떻게 표현되는지 살펴보겠습니다.

숫자 값을 표현하는 방법

숫자 값은 일반적으로 소수점이 있는 양수 또는 음수인 부동 소수점 숫자(또는 단순히 부동 소수점)로 저장됩니다.

이 값은 각 비트에 이진수로 표시됩니다.

IEEE-754 표준은 각 숫자의 숫자가 특정 값을 나타내는 방법을 설명합니다. 특히 부호, 지수 또는 소수(가수)의 세 가지 매핑이 있습니다.


이 세 부분을 결합하여 비트 값 집합을 기반으로 표현된 값을 계산할 수 있습니다.


더 많은 자릿수를 사용할수록 숫자 값이 더 정확해집니다. 예를 들어 FP32 형식은 FP16보다 소수점 이하 자릿수가 더 정확할 수 있습니다.


메모리 제한

사용 가능한 자릿수가 많을수록 값이 더 정확할 뿐만 아니라 표현할 수 있는 값의 범위도 넓어집니다.


비트 수와 표현이 주어지면 표현할 수 있는 값의 범위를 동적 범위라고 하며, 인접한 두 값 사이의 거리를 정밀도라고 합니다.


이 표현의 뛰어난 특징은 장치가 주어진 값을 저장하는 데 필요한 메모리 양을 계산할 수 있다는 것입니다.

메모리의 각 바이트는 8비트를 포함하므로 대부분의 부동 소수점 숫자 형식에 대한 기본 공식을 만들 수 있습니다.


실제 애플리케이션에는 컨텍스트 크기, 모델 아키텍처 등 추론 중에 필요한 그래픽/메모리 양에 영향을 미치는 더 많은 요소가 있습니다.

이제 700억 개의 매개변수가 있는 모델이 있다고 상상해 보세요. 대부분의 모델 자체는 32비트 부동 소수점 숫자(종종 완전 정밀도라고도 함)를 사용하여 표현되며, 모델을 로드하려면 280GB의 메모리가 필요합니다.


그러나 모든 매개변수를 16비트 부동소수점 숫자로 표현할 수 있다면 필요한 메모리 크기를 직접적으로 1배로 줄일 수 있다.

따라서 (추론뿐만 아니라 훈련을 위해서도) 모델 매개변수의 표현 수를 최소화하는 것은 매우 매력적입니다.

그러나 이 접근 방식에는 비용이 발생하지 않습니다. 모델의 정확도는 일반적으로 표현 비트 수가 감소하여 정확도가 감소함에 따라 감소합니다.

우리는 정확성을 유지하면서 값을 표현하는 데 사용되는 자릿수를 줄이고 싶습니다. 이것이 양자화 기술이 유용한 곳입니다.

2부: 정량화 소개

이제 우리는 양자화의 목적이 더 높은 비트 폭(예: 32비트 부동 소수점 숫자)에서 더 낮은 비트 폭(예: 8비트 정수)으로 모델 매개변수의 정확도를 줄이는 것임을 알고 있습니다.


원래 매개변수를 나타내는 비트 수를 줄이면 일반적으로 일부 정밀도(세분성)가 손실됩니다.

이 효과를 보다 직관적으로 만들기 위해 사진 색상을 비유로 사용할 수 있습니다. 예를 들어 이미지를 선택하고(왼쪽) 8가지 색상만 사용합니다(오른쪽).


확대된 쿠키는 원본보다 더 "거칠게" 보입니다.

마찬가지로, 양자화의 주요 목표는 원래 매개변수의 정밀도를 최대한 유지하면서 원래 매개변수를 표현하는 데 필요한 비트(색상) 수를 줄이는 것입니다.

일반적인 데이터 유형

먼저, 일반적인 데이터 유형과 이를 32비트(완전 정밀도 또는 FP32라고 함) 표현 대신 사용할 경우의 영향을 살펴보겠습니다.

FP16

첫 번째는 32비트에서 16비트(반정밀도 또는 FP16이라고 함) 부동 소수점으로 이동하는 예입니다.


FP16의 가능한 값 범위는 FP32의 값 범위보다 훨씬 작습니다.

비에프16

원래 FP32와 유사한 수치 범위를 얻기 위해 bfloat 16은 "잘린 FP32" 유형으로 도입되었습니다.


BF16은 FP16과 동일한 비트 수를 사용하지만 지수 비트를 추가하기 때문에 더 넓은 범위의 값을 얻을 수 있어 딥러닝 분야에서 자주 사용됩니다.

인티8

비트 수를 더 줄이면 표현은 부동 소수점 숫자보다는 정수에 더 가까워집니다. 예를 들어, FP32에서 8비트만 있는 INT8로 이동하면 원래 비트 수의 1/4에 불과합니다.


비트 수가 줄어들 때마다 원래 FP32 표현을 더 적은 수의 비트로 "압축"하기 위해 매핑이 수행됩니다.

그러나 실제 작업에서는 전체 FP32 범위 [-3.4e38, 3.4e38]를 INT8에 매핑할 필요가 없습니다. 실제 모델 매개변수의 데이터 범위를 INT8에 매핑하는 방법을 찾으면 됩니다.

일반적인 압축/매핑 방법에는 대칭 양자화와 비대칭 양자화가 포함되며 둘 다 선형 매핑입니다.

다음으로 논의할 것은 FP32에서 INT8까지의 양자화 방법이다.

대칭 양자화

대칭 양자화에서는 원래 부동 소수점 값의 범위가 양자화 공간의 0을 중심으로 하는 대칭 범위에 매핑되며, 양자화 전후 범위의 중간점은 0입니다.

이는 부동 소수점 공간의 원래 0이 양자화된 공간에 매핑된 후 정확히 0이 됨을 의미합니다.


대칭 양자화의 전형적인 예는 절대 최대(absmax) 양자화입니다.

값 목록이 주어지면 선형 매핑을 수행할 범위로 가장 높은 절대값(α)을 사용합니다.


[-127, 127]은 제한된 범위를 나타내며, 양자화 방법에 따라 제한되지 않은 범위는 [-128, 127]입니다.

이는 0을 중심으로 하는 선형 맵이므로 공식은 간단합니다.

먼저 다음 공식을 사용하여 축척 계수를 계산합니다.

- b는 양자화하려는 바이트 수입니다(8).

- α는 가장 높은 절대값입니다.

그런 다음 s를 사용하여 입력 x를 양자화합니다.


위 그림에서 볼 수 있듯이 최대 절대값 α는 10.8입니다. FP32를 INT8에 매핑하면 다음 공식이 얻어집니다.


원래 FP32 값을 복원하려는 경우 역양자화를 위해 이전에 계산된 배율 인수를 사용할 수도 있습니다.


먼저 양자화한 다음 역양자화하여 원래 값을 복원합니다. 전체 프로세스는 다음과 같습니다.


3.08, 3.02 등 일부 값은 INT8로 양자화하면 둘 다 36임을 알 수 있습니다. 따라서 FP32로 다시 역양자화하면 정밀도가 어느 정도 떨어지고 더 이상 구별할 수 없습니다.

원래 값과 역양자화된 값의 차이를 양자화 오류라고 합니다. 일반적으로 양자화 결과의 비트 수가 적을수록 오류가 커집니다.


비대칭 양자화

대칭 양자화와 달리 비대칭 양자화는 0 중심 대칭이 아닙니다. 대신 부동 소수점 범위의 최소값(β)과 최대값(α)을 각각 양자화된 범위의 최소값과 최대값에 매핑합니다.

여기서 탐구하는 방법을 영점 양자화(Zero-Point Quantization)라고 합니다.


0의 위치가 어떻게 이동했는지 확인하세요. 이것이 비대칭 양자화라고 불리는 이유입니다. [-7.59, 10.8] 범위에서는 최대값과 최소값이 0과 다른 거리에 있습니다.

영점 위치의 오프셋으로 인해 선형 매핑을 수행하려면 INT8 범위에서 영점을 계산해야 합니다. 이전과 마찬가지로 축척 계수도 계산해야 하지만 INT8 범위 [-128, 127]의 차이를 사용합니다.


가중치를 이동하려면 INT8 범위에서 영점(z)을 계산해야 하기 때문에 이는 약간 복잡합니다.

이전과 마찬가지로 수식을 채워보겠습니다.


INT8에서 다시 FP32로 양자화된 값을 역양자화하려면 이전에 계산된 스케일 팩터(s)와 영점(z)을 사용해야 합니다.

그렇지 않으면 역양자화는 간단합니다.


대칭 및 비대칭 양자화를 나란히 놓으면 두 방법의 차이점을 빠르게 확인할 수 있습니다.


위 그림에서 대칭 양자화의 제로 중심 특성과 비대칭 양자화의 오프셋을 볼 수 있습니다.

범위 매핑 및 클리핑(Clipping)

이전 예에서는 주어진 벡터의 값 범위를 낮은 비트 표현으로 매핑하는 방법을 살펴보았습니다. 이는 벡터 값의 전체 범위를 매핑할 수 있지만 이상치라는 한 가지 주요 단점이 있습니다.

다음 값을 포함하는 벡터가 있다고 가정해 보겠습니다.


다른 모든 값보다 훨씬 큰 값은 이상값으로 간주될 수 있습니다. 전체 벡터 범위를 매핑하면 모든 작은 값이 동일한 하위 표현으로 매핑되어 고유성을 잃게 됩니다.


이전에 사용했던 Absmax 방식입니다.클리핑 없는 비대칭 양자화에서도 같은 일이 발생합니다.

대신 특정 값을 자르도록 선택할 수 있습니다. 클리핑(Clipping)이란 원래 값의 동적 범위를 다르게 설정하여 모든 이상값이 동일한 값으로 설정되는 것을 말합니다.

아래 예에서는 동적 범위를 [-5, 5]로 수동으로 설정하고 이 범위 밖의 모든 값은 실제 값에 관계없이 -127 또는 127로 매핑됩니다.


이 접근 방식의 가장 큰 장점은 이상값이 아닌 항목에 대한 양자화 오류가 크게 줄어든다는 것입니다. 그러나 이상치에 대한 양자화 오류가 증가하게 됩니다.

구경 측정

위의 예에서는 동적 범위를 [-5, 5]로 무작위로 설정했지만, 양자화 오류를 최소화하면서 최대한 많은 값을 포함하는 적절한 범위를 찾기 위해서는 "보정" 과정을 통해 결정이 이루어져야 합니다.

교정 단계의 구체적인 실행은 매개변수 유형에 따라 다릅니다.

가중치(및 편향)

LLM(대형 언어 모델)의 가중치 및 편향은 모델을 실행하기 전에 알려져 있기 때문에 정적 값으로 생각할 수 있습니다. 예를 들어 Llama 3의 ~20GB 파일은 대부분 가중치와 편향으로 구성됩니다.

편향 변수의 수(수백만 개)가 가중치(십억 개)보다 훨씬 적기 때문에 편향은 일반적으로 더 높은 정확도를 유지하는 반면(예: INT16) 양자화에 대한 주요 작업은 가중치에 중점을 둡니다.

알려진 정적 가중치의 경우 범위 선택을 위한 교정 기술에는 다음이 포함됩니다.

- 입력 범위의 백분위수를 수동으로 선택

- 원래 가중치와 양자화된 가중치 간의 평균 제곱 오차(MSE) 최적화

- 원래 값과 양자화된 값 사이의 엔트로피를 최소화합니다(KL 발산).


예를 들어, 백분위수를 선택하면 앞에서 본 것과 비슷한 클리핑 동작이 발생합니다.

활성화 값

대규모 언어 모델 전체에서 지속적으로 업데이트되는 입력을 종종 활성화라고 합니다.


일반적으로 Sigmoid 또는 Relu와 같은 일부 활성화 함수를 거치기 때문에 활성화 값이라고 합니다.

가중치와 달리 활성화는 추론 중에 입력 데이터에 따라 변경되므로 정확하게 수량화하기가 어렵습니다.

이러한 값은 각 히든 레이어 이후에 업데이트되므로 입력 데이터가 모델을 통과할 때까지 추론 단계에서 구체적인 값을 알 수 없습니다.


일반적으로 모델의 여러 단계에 적용되는 가중치 및 활성화를 보정하는 두 가지 방법이 있습니다.

- 훈련 후 양자화(PTQ)

- 이름에서 알 수 있듯이 훈련 후 정량화하는 것입니다.

- 양자화 인식 훈련(QAT)

- 학습 중 양자화/미세 조정

파트 3: 훈련 후 정량화(PTQ)

PTQ(Post-training Quantization)는 가장 널리 사용되는 양자화 기술 중 하나입니다. 모델 훈련이 완료된 후 모델의 매개변수(가중치 및 활성화 값 포함)를 수량화합니다.

가중치의 양자화는 대칭 양자화 또는 비대칭 양자화를 사용할 수 있습니다.

그러나 활성화 값의 정량화에는 해당 범위를 미리 알 수 없기 때문에 기본 분포를 얻기 위한 추론 단계가 필요합니다.

활성화 값의 양자화에는 두 가지 형태가 있습니다.

- 동적 양자화

- 정적 양자화

동적 양자화

데이터가 히든 레이어를 통과한 후 활성화 값을 수집하고 각 레이어의 최대값(α)과 최소값(β)을 비교합니다.


그런 다음 이러한 활성화의 분포를 사용하여 양자화된 출력에 필요한 영점(z) 및 스케일 팩터(s) 값을 계산합니다.


이 프로세스는 데이터가 새로운 네트워크 계층을 통과할 때마다 반복됩니다. 따라서 각 레이어는 자체적으로 독립적인 z 및 s 값을 가지므로 서로 다른 양자화 방식을 사용합니다.

정적 양자화

동적 양자화와 달리 정적 양자화는 추론 중에 영점(z)과 스케일 팩터(s)를 계산하지 않고 추론 전에 이러한 값을 계산합니다.

이러한 값을 찾기 위해 교정 데이터세트를 사용하고 이를 모델에 입력하여 활성화 값의 기본 분포를 수집합니다.


이러한 분포가 수집되면 추론 중 정량화에 필요한 s 및 z 값을 계산할 수 있습니다.

실제 추론 시간에 s 및 z 값은 다시 계산되지 않지만 이를 양자화하기 위해 모든 활성화에 걸쳐 전역적으로 사용됩니다.

전체적으로 각 히든 레이어의 s 및 z 값을 계산하는 동적 양자화가 더 정확한 경향이 있습니다. 다만, 이러한 값은 추론 시점마다 계산해야 하므로 계산 시간이 늘어날 수 있습니다.

반면 정적 양자화는 동적 양자화만큼 정확하지는 않지만 양자화에 사용되는 s, z 값을 미리 알고 있기 때문에 속도가 더 빠릅니다.

4비트 정량적 필드

8비트 미만의 양자화는 비트가 손실될 때마다 양자화 오류가 증가하기 때문에 항상 어려운 문제였습니다. 다행스럽게도 비트 수를 6, 4 또는 2비트로 줄이는 몇 가지 영리한 방법이 있습니다(비록 비트 수를 4비트 미만으로 줄이는 것은 일반적으로 권장되지 않지만).

HuggingFace에 대한 두 가지 일반적인 방법을 살펴보겠습니다.

- GPTQ(전체 모델은 GPU에서 실행됨)

- GGUF(레이어를 CPU로 오프로드할 수도 있음)

한국어

GPTQ는 실제 응용 분야에서 가장 유명한 4비트 양자화 방법 중 하나라고 할 수 있습니다.

비대칭 양자화를 사용하고 이를 레이어별로 처리하여 다음 레이어로 이동하기 전에 각 레이어를 독립적으로 처리합니다.


이 레이어별 양자화 프로세스에서는 먼저 레이어의 가중치를 역 헤시안 행렬로 변환합니다. 역 헤시안 행렬은 모델 손실 함수의 2차 미분이며 각 가중치 변화에 대한 모델 출력의 민감도를 나타냅니다.

간단히 말해서, 본질적으로 각 레이어의 가중치의 중요성(역 중요성)을 보여줍니다.

헤세 행렬의 값 가중치가 작을수록 더 중요합니다. 왜냐하면 이러한 가중치의 작은 변화가 모델 성능에 큰 변화를 가져올 수 있기 때문입니다.


역 헤세 행렬에서는 값이 낮을수록 "중요한" 가중치를 더 많이 나타냅니다.

다음으로 가중치 행렬의 첫 번째 행을 양자화 및 역양자화합니다.


이 프로세스를 통해 우리는 이전에 계산된 역 헤시안 값(h_1)을 사용하여 가중치를 적용할 수 있는 양자화 오류(q)를 계산할 수 있습니다.

본질적으로 우리는 가중치의 중요성을 기반으로 가중치가 부여된 양자화 오류를 생성합니다.


다음으로, 이 가중치 양자화 오류를 행의 다른 가중치에 재분배합니다. 이는 네트워크의 전반적인 기능과 출력을 유지하는 데 도움이 됩니다.

예를 들어 두 번째 가중치(예: x_2=0.3)에 대해 이 작업을 수행하면 양자화 오류(q)에 두 번째 가중치(h_2)의 역 헤세 행렬을 곱하고 여기에 추가합니다.


다음으로, 주어진 행의 세 번째 가중치에 대해 동일한 작업을 계속합니다.


이러한 가중 양자화 오차 q를 재분배하는 과정은 모든 값이 양자화될 때까지 반복됩니다.

이 방법은 일반적으로 가중치가 서로 관련되어 있기 때문에 효과적입니다. 따라서 가중치에 양자화 오류가 있는 경우 역헤시안을 통해 해당 가중치가 그에 맞게 업데이트됩니다.

구프

GPTQ는 GPU에서 전체 LLM(대형 언어 모델)을 실행하는 데 좋은 양자화 방법이지만 해당 하드웨어 조건이 없으면 LLM의 모든 계층을 GGUF를 통해 CPU로 오프로드할 수도 있습니다.

이는 비디오 메모리(VRAM) 부족을 보완하기 위해 모델을 CPU와 GPU에서 동시에 실행하는 것과 같습니다.

양자화 방식 GGUF는 자주 업데이트되며 구체적인 양자화 비트 수에 따라 달라지지만 기본 원리는 다음과 같습니다.

먼저, 주어진 레이어의 가중치는 "수퍼 블록"으로 나뉘며, 각 슈퍼 블록은 "하위 블록" 세트를 포함합니다. 이러한 "하위 블록"에서 축척 계수와 알파 값을 계산합니다.


주어진 "하위 블록"을 양자화하려면 앞서 언급한 absmax 양자화를 사용하여 주어진 가중치에 배율 인수(s_sub)를 곱하면 됩니다.


스케일 팩터 s_sub는 "하위 블록"의 정보를 사용하여 계산되지만 "수퍼 블록"의 s_super 정보를 사용하여 양자화됩니다.


요약하면, 이 블록별 양자화는 "수퍼 블록"(s_super)의 스케일 인수를 사용하여 "하위 블록"(s_sub)의 스케일 인수를 양자화합니다.

각 스케일 팩터의 양자화 수준은 다를 수 있으며 "수퍼 블록" 스케일 팩터는 일반적으로 "서브 블록" 스케일 팩터보다 정밀도가 더 높습니다.

이를 설명하기 위해 여러 양자화 수준(2비트, 4비트, 6비트)을 살펴보겠습니다.


양자화 유형에 따라 영점을 조정하기 위해 추가적인 최소값(m)도 필요하며, 이는 스케일 팩터(s)뿐만 아니라 양자화됩니다.

4부: 정량적 인식 교육(QAT)

세 번째 부분에서는 훈련 후 모델을 양자화하는 방법을 설명합니다. 이 방법의 단점은 실제 훈련 과정을 고려하지 않는다는 것입니다.

이것이 바로 정량적 인식 교육(QAT)이 유용한 곳입니다. 훈련 후 정량화(PTQ)와 달리 QAT의 목표는 훈련 중에 양자화 과정을 배우는 것입니다.


QAT는 훈련 과정에서 이미 양자화가 고려되기 때문에 PTQ보다 더 정확한 경향이 있습니다. 작동 방식은 다음과 같습니다.

훈련 과정에서 소위 "가짜" 양자화가 도입됩니다. 예를 들어 먼저 가중치를 INT4로 양자화한 다음 다시 FP32로 역양자화합니다.


이 프로세스를 통해 모델은 훈련 단계에서 손실을 계산하고 가중치를 업데이트할 때 양자화 오류를 고려할 수 있습니다.

아래 그림에 표시된 것처럼 QAT는 양자화 오류를 줄이기 위해 "넓은" 최소값의 경우 손실 값을 탐색하려고 시도합니다. 왜냐하면 "좁은" 최소값은 종종 더 큰 양자화 오류로 이어지기 때문입니다.


역전파 동안 양자화가 고려되지 않는다고 가정하면 경사 하강 과정은 손실 값이 가장 작은 가중치를 선택합니다. 그러나 최소값이 "좁으면" 양자화 오류가 더 커집니다.

대조적으로, 양자화를 고려한다면, 양자화 오류가 훨씬 더 작은 "넓은" 최소값에서 다른 업데이트 가중치가 선택됩니다.


따라서 PTQ 방식은 고정밀도(예: FP32)에서 손실값이 낮지만, QAT 역시 우리가 추구하는 낮은 정밀도(예: INT4)에서 손실값이 낮습니다.

1비트 시대: BitNet

우리는 양자화 정확도를 4비트로 줄이는 것이 이미 매우 작다는 것을 보았지만, 더 줄이면 어떻게 될까요?

BitNet이 등장하는 곳이며, 모델의 가중치를 -1 또는 1의 단일 비트로 표현하고 양자화 프로세스를 Transformer 아키텍처에 직접 주입하여 이를 수행합니다.

Transformer 아키텍처는 대부분의 LLM의 기초이며 선형 레이어와 관련된 계산으로 구성됩니다.


이러한 선형 레이어는 일반적으로 FP16과 같이 더 높은 정밀도로 표현되며 대부분의 가중치가 있는 위치입니다.

BitNet은 이러한 선형 레이어를 BitLinear 레이어로 대체합니다.


BitLinear 레이어는 일반 선형 레이어와 동일하게 작동하며 가중치에 활성화 값을 곱하여 출력을 계산합니다.

그러나 차이점은 BitLinear 레이어는 모델의 가중치를 표현하기 위해 1비트만 사용하고 활성화 값을 표현하기 위해 INT8을 사용한다는 것입니다.


QAT(양자화 인식 훈련)와 같은 BitLinear 레이어는 훈련 중에 일종의 "가짜" 양자화를 수행하여 가중치와 활성화의 양자화 효과를 분석합니다.


BitLinear를 단계별로 이해해 봅시다.

체중 정량화

훈련 중에 가중치는 INT8로 저장된 다음 signum 함수라는 기본 전략을 사용하여 1비트로 양자화됩니다.

기본적으로 가중치 분포를 0을 중심으로 이동한 다음 0보다 작은 모든 값을 -1로, 0보다 큰 모든 값을 1로 할당합니다.


또한 나중에 역양자화 프로세스에서 사용할 값 β(평균 절대값)를 추적합니다.

활성화 양자화

활성화를 정량화하기 위해 BitLinear는 더 높은 정밀도의 행렬 곱셈(×)이 필요하므로 절대 최대값 방법(absmax)을 사용하여 활성화를 FP16에서 INT8로 변환합니다.


또한 나중에 역양자화 프로세스에서 사용할 값 α(최대 절대값)를 추적합니다.

역양자화

우리는 활성화를 다시 FP16으로 역양자화하는 데 도움이 되는 α(활성화의 최대 절대값) 및 β(가중치의 평균 절대값)를 추적합니다.

출력 활성화는 {α, γ}를 사용하여 다시 스케일링되어 원래 정확도로 역양자화됩니다.


이 프로세스는 상대적으로 간단하며 모델을 -1 또는 1의 두 가지 값으로만 ​​표현할 수 있습니다.

저자는 이 접근 방식을 통해 모델 크기가 커짐에 따라 1비트 훈련과 FP16 훈련 간의 성능 격차가 점점 작아지는 것을 관찰했습니다.

그러나 이는 더 큰 모델(>30B 매개변수)에만 적용되며 더 작은 모델 간의 격차는 여전히 큽니다.

모든 LLM은 1.58비트입니다.

앞서 언급한 확장성 문제를 개선하기 위해 BitNet 1.58b가 도입되었습니다.

이 새로운 접근 방식에서는 모델의 각 가중치가 -1 또는 1일 수 있을 뿐만 아니라 0도 취할 수 있어 각 변수를 삼항으로 만들 수 있습니다.

흥미롭게도 0을 추가하는 것만으로도 BitNet이 크게 향상되고 계산 프로세스 속도가 빨라지는 간단한 작업입니다.

0 전력

0을 추가하는 것이 왜 중요한 개선입니까?

이것은 행렬 곱셈과 관련이 있습니다!

먼저, 행렬 곱셈의 기본 작동 방식을 살펴보겠습니다.

출력을 계산할 때 가중치 행렬과 입력 벡터를 곱합니다. 다음은 가중치 행렬의 첫 번째 레이어의 첫 번째 행 곱셈을 시각화한 것입니다.


이 곱셈에는 단일 가중치를 입력과 곱한 다음 모두 추가하는 두 가지 작업이 포함됩니다.

이와 대조적으로 BitNet 1.58b는 세 가지 값의 가중치가 기본적으로 다음을 알려주기 때문에 곱셈 작업을 방지합니다.

- 1: 이 값을 추가하고 싶습니다.

- 0: 이 값을 원하지 않습니다.

- -1: 이 값을 빼고 싶습니다.

따라서 가중치가 1.58비트로 양자화되면 추가 작업만 수행하면 됩니다.


이를 통해 계산 속도가 크게 향상될 뿐만 아니라 기능 필터링도 가능해집니다.

주어진 가중치를 0으로 설정하는 것은 1비트처럼 입력값을 더하거나 빼는 것이 아니라 입력을 무시하는 것과 같습니다.

정량화하다

가중치 양자화를 수행하기 위해 BitNet 1.58b는 이전에 본 최대 절대값 양자화(absmax)의 변형인 평균 절대값 양자화(absmean)를 사용합니다.

단순히 가중치 분포를 압축하고 절대 평균(α)을 사용하여 값을 수량화합니다. 그런 다음 -1, 0 또는 1로 반올림합니다.


BitNet과 비교하여 활성화 양자화는 한 가지 측면을 제외하고 동일합니다. 즉, 활성화를 [0, 2ᵇ⁻1] 범위로 확장하는 대신 최대 절대값 방법을 사용하여 [-2ᵇ⁻1, 2ᵇ⁻1]로 확장합니다.

요약하자면, 1.58비트 양자화에는 주로 두 가지 기술이 포함됩니다.

- 0을 추가하여 세 가지 값 표현 [-1, 0, 1]을 생성합니다.

- 가중치의 절대 평균 정량화

BitNet 논문은 다음과 같은 결론을 내렸습니다. "13B BitNet b1.58은 대기 시간, 메모리 사용량 및 에너지 소비 측면에서 3B FP16 LLM보다 더 효율적입니다."


논문 주소: https://arxiv.org/abs/2402.17764

계산적으로 효율적인 비트가 1.58개뿐이므로 경량 모델을 얻을 수 있습니다.

참고자료:

https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-퀀트화