AI 모델 및 플랫폼
마이크로소프트의 추론 프레임워크, 1비트 대형 언어 모델을 로컬 장치로 가져옵니다
2024년 10월 17일, 마이크로소프트는 BitNet.cpp를 발표했습니다. 이는 1비트 양자화된 대형 언어 모델(Large Language Models, LLM)을 실행하기 위한 추론 프레임워크입니다. BitNet.cpp는 제네릭 AI에서 1비트 LLM을 효율적으로 표준 CPU에서 실행할 수 있도록 하는 중요한 발전입니다. 이 개발은 LLM에 대한 접근성을民主화하고 다양한 장치에서 사용할 수 있게 하며, 온디바이스 AI 애플리케이션에 새로운 가능성을 제공합니다.
1비트 대형 언어 모델 이해
대형 언어 모델은 전통적으로 높은 정밀도의 부동소수점 숫자(일반적으로 FP16 또는 BF16)를 모델 가중치에 사용하기 때문에 상당한 계산 리소스가 필요합니다. 이는 LLM을 배포하는 것을 비싼 것으로 만들고 에너지 소비를 증가시킵니다.
1비트 LLM의 핵심은 모델 가중치를 나타내는 데만 3개의 가능한 값을 사용한다는 것입니다. -1, 0, 및 1이므로 “1.58비트”라고 합니다(3개의 상태를 인코딩하는 데 약간 더 많은 비트가 필요하기 때문입니다).
3진 가중치 시스템
개념
BitNet.cpp의 1비트 양자화는 3진 가중치 시스템입니다. BitNet은 각 매개변수에 대해 3개의 가능한 값만을 사용합니다.
- -1 (음수)
- 0 (중립)
- 1 (양수)
이로 인해 매개변수당 약 1.58비트의 저장 요구사항이 발생하여 BitNet b1.58라는 이름이 붙게 됩니다. 매개변수 비트 너비의 이 급격한 감소는 메모리 사용량과 계산 복잡성의 감소로 이어지며, 대부분의 부동소수점 곱셈이 단순한 덧셈과 뺄셈으로 대체되기 때문입니다.
수학적 기초
1비트 양자화는 가중치와 활성화를 다음과 같은 단계를 통해 3진 표현으로 변환합니다.
1. 가중치 이진화
가중치를 이진화하는 것은 가중치를 평균(α)을 중심으로 이동시켜 3진 표현을 생성하는 것을 포함합니다. 이 변환은 수학적으로 다음과 같이 표현됩니다.
Wf=Sign(W−α)
여기서:
- W는 원래 가중치 행렬입니다.
- α는 가중치의 평균입니다.
- Sign(x)는 x > 0인 경우 +1을 반환하고, 그렇지 않으면 -1을 반환합니다.
2. 활성화 양자화
활성화를 양자화하면 입력이 지정된 비트 너이로 제한됩니다.
x^e=Quant(x)=Clip(γx×Qb,−Qb+ϵ,Qb−ϵ)
여기서:
- Qb = 2(b−1)2^{(b-1)}는 b비트 너이의 최대 양자화 수준입니다.
- γ는 x의 최대 절대값(표기법 ∣∣x∣∣∞).
- ε는 계산 중 오버플로를 방지하기 위한 작은 숫자입니다.
3. 비트 선형 연산
비트 선형 레이어는 전통적인 행렬 곱셈을 다음과 같은 단순한 연산으로 대체합니다.
y=Wf×x^e×(Qbβγ)
여기서:
- β는 근사 오차를 최소화하기 위한 스케일링 인자입니다.
- γ는 활성화를 스케일링합니다.
- Q_b는 양자화 인자입니다.
이 변환은 계산을 효율적으로 수행할 수 있으면서 모델 성능을 유지합니다.
성능 영향
메모리 효율성
3진 가중치 시스템은 메모리 요구사항을 크게 줄입니다.
- 전통적인 LLM: 가중치당 16비트
- BitNet.cpp: 가중치당 1.58비트
이 감소는 전통적인 16비트 모델에 비해 약 90%의 메모리 절약을 의미하며, 동일한 하드웨어 제약 조건 내에서 더 큰 모델을 수용할 수 있습니다.
1. 추론 속도: CPU에서 더 빠름
추론 속도는 초당 처리되는 토큰 수로表示됩니다. 다음은 관찰 결과입니다.
- Apple M2 Ultra에서: BitNet.cpp는 더 큰 모델(30B)에서 Llama.cpp에 비해 최대 5.07배의 속도 향상을 달성하며, 125M 모델에서는 593.43 토큰/초의 피크 속도를 달성하여 1.37배의 속도 향상을 보입니다. 더 큰 모델인 3.8B 및 7B에서는 BitNet.cpp가 84.77 토큰/초 이상의 속도를 유지하며, 모든 규모에서 효율성을 보여줍니다.
- 인텔 i7-13700H에서: BitNet.cpp는 훨씬 더 극적인 속도 향상을 달성합니다. 7B 모델 크기에서 BitNet.cpp는 Llama.cpp에 비해 5.68배의 속도 향상을 달성합니다. 더 작은 모델인 125M에서는 389.08 토큰/초의 속도를 달성하여 Llama.cpp에 비해 2.37배 더 빠릅니다.
2. 에너지 효율성: 에지 장치의 게임 체인저
제공된 그래프는 또한 에너지 비용 비교를 보여주며, 토큰당 에너지 소비의 상당한 감소를 나타냅니다.
- Apple M2 Ultra에서: BitNet.cpp의 에너지 절감은 상당합니다. 700M 모델에서는 BitNet.cpp가 토큰당 55.4% 더 적은 에너지를 소비하며, 0.314에서 0.140으로 떨어집니다. 이 추세는 더 큰 모델에서도 계속되며, 70B 모델에서는 70.0%의 에너지 소비 감소를 보입니다.
- 인텔 i7-13700H에서: BitNet.cpp는 700M 모델에서 71.9%의 에너지 절감을 달성하며, 소비량이 1.367에서 0.384로 떨어집니다. Llama.cpp의 70B 모델에 대한 에너지 데이터는 사용할 수 없지만, BitNet.cpp는 효율적으로 유지되며, 70B 모델에서 17.33의 에너지 소비를 보입니다.
3. 인간 읽기 속도 벤치마크 초과
이 그래프에서 가장 흥미로운 통찰 중 하나는 인간 읽기 속도를 나타내는 참조선입니다. 이는 5-7 토큰/초로 표시됩니다. 이 빨간 선은 BitNet.cpp와 같은 구현이, 특히 더 큰 모델에서도 인간 읽기 속도를 쉽게 초과할 수 있음을 보여줍니다.
- Apple M2 Ultra에서, BitNet.cpp는 모든 모델 크기에서 인간 읽기 속도를 초과하며, 70B 모델에서 8.67 토큰/초의 최저 속도를 보입니다.
- 인텔 i7-13700H에서, 100B 모델은 1.70 토큰/초를 달성하며, 거의 인간 읽기 속도의 하위 범위에 도달합니다. 더 작은 모델은 모두 이 벤치마크를 초과합니다.
학습 고려 사항
직접 전달 추정기 (STE)
1비트 양자화는 비미분 함수를 도입하므로, 학습에는 특수한 기술인 직접 전달 추정기 (STE)가 필요합니다. 이 접근법에서, 기울기는 비미분 가능성 점을 통해 변경되지 않은 상태로 흐릅니다. 다음은 파이썬에서 간단한 구현입니다.
class StraightThroughEstimator(Function): @staticmethod def forward(ctx, input): return input.sign() @staticmethod def backward(ctx, grad_output): return grad_output
혼합 정밀도 학습
학습 중에 안정성을 유지하기 위해 혼합 정밀도가 사용됩니다.
- 가중치 및 활성화: 1비트 정밀도로 양자화됩니다.
- 기울기 및 최적화 상태: 더 높은 정밀도로 저장됩니다.
- 잠재 가중치: 높은 정밀도로 유지되어 학습 중에 정확한 업데이트를 허용합니다.
대형 학습률 전략
1비트 모델의 고유한 도전은 작은 업데이트가 이진화된 가중치를 영향을 미치지 않을 수 있다는 것입니다. 이를 완화하기 위해, 학습률을 증가시켜 더 빠른 수렴과 전통적인 접근법보다 더 나은 최적화를 보장합니다.
그룹 양자화 및 정규화
BitNet.cpp는 모델 병렬성을 향상시키기 위해 그룹 양자화 및 정규화를 도입합니다. 전체 가중치 행렬에 대한 매개변수를 계산하는 대신, BitNet은 가중치와 활성화를 여러 그룹(G)으로 나눕니다.
이 그룹화는 추가적인 그룹 간 통신 없이 효율적인 병렬 처리를 허용하여, 대규모 모델 학습 및 추론을 가능하게 합니다.
구현 노트 및 최적화
CPU 최적화
BitNet.cpp는 최고의 CPU 성능을 달성하기 위해 여러 저수준 최적화를 활용합니다.
- 벡터화된 연산: SIMD 명령을 사용하여 비트 조작을 효율적으로 수행합니다.
- 캐시 친화적 메모리 접근: 데이터를 캐시 누락을 최소화하도록 구조화합니다.
- 병렬 처리: 작업을 여러 CPU 코어에 효과적으로 분산합니다.
다음은 BitNet의 핵심 함수 중 하나입니다. 이는 양자화 및 추론을 구현합니다.
지원 모델
현재 BitNet.cpp 릴리스는 다음 Hugging Face에서 사용 가능한 1비트 LLM을 지원합니다.
- bitnet_b1_58-large (0.7B 파라미터)
- bitnet_b1_58-3B (3.3B 파라미터)
- Llama3-8B-1.58-100B-tokens (8.0B 파라미터)
이 모델은 프레임워크의 추론 기능을 보여주기 위해 공개적으로 제공됩니다. 공식적으로 마이크로소프트에서 훈련되거나 릴리스되지 않았지만, 프레임워크의 유연성을 보여줍니다.
설치 가이드
BitNet.cpp를 시작하려면 다음 단계를 따르세요.
전제 조건
- 파이썬 >= 3.9
- CMake >= 3.22
- Clang >= 18
- Conda (권장)
윈도우 사용자의 경우, 다음 구성 요소를 포함하여 Visual Studio를 설치해야 합니다.
- 데스크톱 개발용 C++
- 윈도우용 C++-CMake 툴
- 윈도우용 Git
- 윈도우용 C++-Clang 컴파일러
- LLVM 툴셋용 MS-Build 지원 (Clang)
데비안/우분투 사용자의 경우, 자동 설치 스크립트가 제공됩니다.
단계별 설치
- 리포지토리 클론:
- 의존성 설치:
- 프로젝트 빌드 및 준비: 모델을 직접 다운로드하여 양자화된 형식으로 변환할 수 있습니다.
또는 모델을 수동으로 다운로드하고 변환할 수 있습니다.
BitNet.cpp로 추론 실행
추론을 실행하려면 다음 명령을 사용합니다.
설명:
-m은 모델 파일 경로를 지정합니다.-p는 프롬프트 텍스트를 정의합니다.-n은 예측할 토큰 수를 설정합니다.-temp은 추론 중 샘플링 난이도(온도)를 조정합니다.
출력 예시
BitNet.cpp의 기술 세부 사항
비트 선형 레이어
BitNet.cpp는 수정된 트랜스포머 아키텍처를 구현하며, 표준 행렬 곱셈을 비트 선형 연산으로 대체합니다. 이 접근법은 가중치를 중앙값으로 이동시킨 다음 스케일링하여 근사 오차를 최소화합니다. 핵심 변환 함수는 다음과 같습니다.
# 1비트 가중치의 이진화 함수 def binarize_weights(W): alpha = W.mean() W_binarized = np.sign(W - alpha) return W_binarized
중앙값으로 이동한 가중치와 스케일링의 조합은 양자화 오차를 최소화하여 성능을 유지합니다.
산업 영향
BitNet.cpp는 LLM 배포에 далеко 갈음하는 영향을 미칠 수 있습니다.
- 접근성: 표준 장치에서 LLM을 실행할 수 있도록 하여 강력한 AI에 대한 접근성을民主화합니다.
- 비용 효율성: 비싼 GPU의 필요성을 줄여서 채택 장벽을 낮춥니다.
- 에너지 효율성: 표준 CPU 기반 추론을 활용하여 에너지를 절약합니다.
- 혁신: 클라우드 의존성 없이 실시간 언어 번역, 음성 조수, 개인 정보 보호 중심 애플리케이션과 같은 온디바이스 AI의 새로운 가능성을 열어줍니다.
도전 과제 및 미래 방향
1비트 LLM은 약속을 가지고 있지만, 여러 도전 과제가 남아 있습니다. 이는 다양한 작업을 위한 강력한 1비트 모델의 개발, 1비트 연산을 위한 하드웨어 최적화, 개발자의 이 새로운 패러다임에 대한 채택을 포함합니다. 또한, 컴퓨터 비전 또는 오디오 작업을 위한 1비트 양자화를 탐색하는 것은 흥미로운 미래 방향입니다.
결론
마이크로소프트의 BitNet.cpp 출시는 중요한 발전입니다. 표준 CPU에서 효율적인 1비트 추론을 가능하게 함으로써, BitNet.cpp는 AI의 접근성과 지속 가능성을 창조합니다. 이 프레임워크는 더 휴대용하고 비용 효율적인 LLM을 위한 무대를 설정하며, 온디바이스 AI와 함께 가능성이 무엇인지 보여줍니다.














