Tech

30B 로컬 LLM을 맥북에서 돌릴 수 있을까? 1.58비트 터너리 양자화

|

November 9, 2026

|

11

분

30B 로컬 LLM을 맥북에서 돌릴 수 있을까? 1.58비트 터너리 양자화
TL;DR
노타는 30B급 LLM의 가중치를 -1, 0, +1 세 값으로만 표현하는 1.58비트 터너리 양자화로 약 60GB에서 약 10GB까지 줄여, 24GB 이상 맥북에서 돌릴 수 있게 했습니다. BF16 모델을 그대로 터너리로 바꾸면 GSM8K·HumanEval 점수가 0점까지 떨어지지만, 증류(distillation)와 경계 마스킹으로 복원해 생성형 벤치마크 7종 평균에서 원본의 89.4%를 되찾았습니다. 이 모델은 Hugging Face에 프리뷰로 공개했습니다.

LLM 양자화에서 실용적인 한계선은 흔히 4비트로 꼽힙니다. 비트를 그보다 더 낮추면 용량은 줄어들지만 답변 품질이 크게 떨어지기 때문입니다. 로컬 LLM에서는 이 제약이 더 까다롭습니다.

복잡한 코딩이나 여러 단계로 이어지는 작업을 맡기려면 보통 27B~30B급 모델부터 쓸 만하다고 봅니다. 그런데 30B 모델은 4비트로 줄여도 가중치만 16GB 안팎입니다. 런타임 메모리와 KV 캐시까지 더하면 16GB 기기에는 올라가지 않고, 24GB 맥북에서도 빠듯합니다.

그래서 노타는 30B라는 모델 크기는 그대로 두고, 비트를 4비트 아래로 낮췄습니다. NVIDIA가 공개한 Nemotron 3.5 Lightning 30B(A3B)의 가중치를 -1, 0, +1 세 값으로만 표현하는 1.58비트 양자화입니다. 모델 용량은 약 10GB로 줄었고, 성능은 생성형 벤치마크 평균 기준 원본의 89% 수준까지 복원했습니다. 이 글은 그 과정을 정리합니다.

1.58비트 양자화 전후 핵심 지표

모델 용량

가중치 파일 기준

원본 BF16
약 60GB
노타 1.58비트
약 1/6약 10GB

생성형 벤치마크 평균

7종 평균 점수

원본 BF16
93.80
노타 1.58비트
원본의 89.4%83.82
그림 1. 1.58비트 양자화 전후 핵심 지표. 막대 높이는 지표마다 원본 BF16을 100으로 둔 비율이고, 점수는 복원 학습을 마친 모델의 자체 평가(temperature 0.7 · 생성 길이 32K) 기준입니다.

1.58비트 양자화란 무엇인가

1.58비트 양자화는 LLM의 가중치를 -1, 0, +1 세 값으로만 표현하는 터너리(ternary) 양자화입니다. 세 값을 구분하는 데 필요한 이론적 최소 비트 수가 log₂3 ≈ 1.585비트이기 때문에 1.58비트라고 부릅니다. 여기서 1.58비트는 디스크에 저장되는 파일 크기가 아니라 값 하나가 담는 정보량을 뜻합니다. 실제 파일에는 가중치 외에 스케일 값(scale factor)이 함께 저장되므로 파라미터당 비트 수는 이보다 커집니다.

터너리로 바꾸면 가중치 행렬의 각 칸은 크기와 부호에 따라 -1, 0, +1 가운데 하나가 됩니다. 0에 가까운 작은 값은 0이 되고, 나머지는 부호만 남습니다.

실수 가중치 행렬을 터너리로 바꾸면

큰 숫자는 터너리 코드, 작은 숫자는 원래 값입니다. 이 예시에서 임계값 τ = 0.22

+10.92−1−0.3100.05+10.64−1−0.7300.160−0.12+10.47−1−0.8500.2100.03−1−0.52+10.710−0.06+10.38−1−0.60+10.8800.11−1−0.42+10.26+10.570−0.17−1−0.94+10.33
  • τ보다 큰 값 → +1
  • −τ보다 작은 값 → −1
  • 절댓값이 τ 이하 → 0
그림 2. 실수 가중치 행렬(설명용 예시 값)을 터너리로 바꾸는 과정. 절댓값이 임계값 τ 이하인 값은 0, 나머지는 부호에 따라 +1 또는 −1이 됩니다.

1.58비트 모델을 만드는 경로는 크게 두 가지입니다.

  • QAT(Quantization-Aware Training): BitNet b1.58처럼 무작위 초기값에서 시작해, 처음부터 가중치를 터너리로 고정한 채 사전학습합니다.
  • PTQ(Post-Training Quantization): 이미 학습이 끝난 BF16 체크포인트를 사후에 터너리로 바꿉니다.

노타는 이번에 PTQ 방식을 택했습니다. 사전학습을 처음부터 다시 하지 않고, 이미 학습된 모델을 그대로 활용할 수 있기 때문입니다.


터너리 양자화는 어떻게 하나

터너리 양자화는 세 단계로 이루어집니다. 결국 정해야 하는 것은 두 가지로, 어느 크기 이하의 가중치를 0으로 볼지(임계값 τ)와 남은 가중치를 어떤 크기로 되돌릴지(스케일 s)입니다. 아래 그림은 단계별 핵심 수식을 정리한 것입니다.

  1. 그룹별 평균 절댓값

    α=mean(|w|)
  2. 임계값으로 코드 결정

    τ=α/2q=+1 (w > τ)0 (|w| ≤ τ)−1 (w < −τ)
  3. 스케일로 복원

    s=mean(|w|) (q ≠ 0인 가중치만)ŵ=s×q
그림 3. 터너리 양자화의 세 단계. α는 그룹의 평균 절댓값, τ는 임계값, q는 터너리 코드, s는 복원 스케일입니다.

이해를 돕기 위해 가중치 8개로 이루어진 예시 그룹으로 계산을 따라가 보겠습니다. 이 그룹의 α는 0.39, 임계값 τ는 0.195, 복원 스케일 s는 0.58입니다. 아래 그림에서 각 가중치가 터너리 코드와 복원값으로 바뀌는 과정을 볼 수 있습니다.

① 임계값으로 코드 결정

α = mean(|w|) = 0.90 + 0.30 + … + 0.15 + 0.408 = 0.39τ = α / 2 = 0.195

② 그룹 스케일로 복원

s = mean(|w|, 0이 아닌 코드) = 0.90 + 0.30 + 0.60 + 0.70 + 0.405 = 0.58ŵ = s × q

  1. 원본 가중치
  2. 0.90
  3. −0.30
  4. 0.05
  5. 0.60
  6. −0.02
  7. −0.70
  8. 0.15
  9. 0.40
  1. →
  2. |0.90| > 0.195 → +1
  3. |−0.30| > 0.195, 음수 → −1
  4. |0.05| ≤ 0.195 → 0
  5. 나머지 5개도 같은 규칙으로
  6. |w| ≤ τ이면 0,나머지는 부호에 따라 ±1
  1. 터너리 코드
  2. +1
  3. −1
  4. 0
  5. +1
  6. 0
  7. −1
  8. 0
  9. +1
  1. →
  2. 0.58 × (+1) = +0.58
  3. 0.58 × (−1) = −0.58
  4. 0.58 × 0 = 0
  5. 나머지 5개도 s를 곱해 복원
  6. 복원값은 세 가지−0.58, 0, +0.58
  1. 복원 가중치
  2. +0.58
  3. −0.58
  4. 0
  5. +0.58
  6. 0
  7. −0.58
  8. 0
  9. +0.58
그림 4. 예시 그룹 8개의 변환 과정. 흐리게 표시한 원본 값은 |w| ≤ τ라서 0이 된 값입니다.

이때 중요한 것은 0이 되는 가중치의 비율입니다. 0이 너무 적으면 0에 가까운 작은 값까지 ±1로 커져 복원 오차가 늘어나고, 너무 많으면 남는 정보가 줄어 모델의 표현력이 떨어집니다. 이 비율은 임계값 τ가 정하며, 예시 그룹에서는 8개 중 3개가 0이 됐습니다.


그대로 쓰면 왜 0점이 되나

위 절차대로 진행한 PTQ는 무사히 끝났습니다. 그러나 자체 평가에서 GSM8K와 HumanEval은 0.00, 한국어 지시 이행을 평가하는 IFEval-ko는 10.36이 나왔습니다.

평가원본 BF16양자화 직후 1.58비트
GSM8K95.000.00
HumanEval96.340.00
IFEval-ko89.4610.36
표 1. 사후 변환 직후의 자체 평가. 복원 전에는 생성형 점수가 0 수준입니다.

직접적인 원인은 반올림 오차입니다. 앞의 예시에서 0.90이 복원 뒤 0.58로 바뀌는 것처럼, 가중치마다 복원 오차가 생기고 이 오차가 층을 거치며 누적됩니다. 트랜스포머처럼 수십 개 층을 쌓아 다음 토큰을 예측하는 구조에서는 층별 오차가 최종 출력 확률에 반영되고, 토큰을 하나씩 생성해 채점하는 생성형 벤치마크에서는 정답을 거의 맞히지 못하는 결과로 나타납니다.

사실 이는 2비트 이하의 극단적 저비트 양자화에서 흔히 발생하는 현상입니다. 도입에서 4비트를 LLM 양자화의 실용적인 한계선으로 소개한 것도 같은 맥락입니다. 비트 수를 줄여 파일을 작게 만드는 것과 모델의 능력을 유지하는 것은 별개의 문제이고, 비트 수가 낮을수록 그 차이가 커집니다.

그렇다면 0점이 된 모델은 어떻게 되돌릴 수 있을까요? 노타는 두 단계로 접근했습니다.


복원 1단계: on/off-policy distillation

첫 번째 기법은 증류(distillation)입니다. 보통은 교사 모델이 미리 생성한 답변을 학생이 따라가는 off-policy distillation을 많이 사용합니다. 다만 이 방식만으로는 학생이 양자화 때문에 실제로 만들어내는 출력이 학습 신호에 거의 반영되지 않고, 양자화 뒤 출력 분포가 크게 달라진 터너리 모델에서는 이 차이가 더 커집니다. 그래서 이번에는 off-policy distillation에 on-policy distillation을 함께 적용했습니다.

여기서 on-policy는 학생이 직접 만든 문맥을 바탕으로 배운다는 뜻입니다. 학생(터너리 모델)이 답변 토큰을 생성하면, BF16 교사가 같은 문맥에서 다음 토큰의 확률 분포를 계산합니다. 학생은 교사의 분포와 자기 분포의 차이를 학습 신호로 받습니다. 비유하면 학생이 쓴 풀이를 선생님이 한 줄씩 따라가며, 줄마다 "나라면 다음에 이렇게 썼을 것"을 알려 주는 방식입니다. on-policy를 함께 적용한 것도 양자화로 달라진 출력 분포를 교사 쪽으로 다시 맞추기 위해서입니다.

누가 쓴 문장으로 배우는가

보통 쓰는 방식 · off-policy

교사가 쓴 문장을 따라 씁니다

연습 자료: 교사(원본 BF16)가 쓴 문장

  • 서울은
  • 한국의
  • 수도
  • 입니다

학생은 교사의 문장만 보며 다음 단어를 맞히는 연습을 합니다. 그래서 자기가 "한국의" 다음에 다른 단어로 빠지는 상황은 연습할 기회가 없습니다.

함께 적용한 방식 · on-policy

학생이 쓴 문장을 첨삭받습니다

연습 자료: 학생(터너리 모델)이 직접 쓴 문장

  • 서울은
  • 한국의
  • 중심
  • 입니다
교사
"한국의" 다음 단어 예측 → 수도 70% · 중심 10%
학생
"한국의" 다음 단어 예측 → 중심 55% · 수도 30%

교사가 학생의 문장을 따라가며 각 위치에서 다음 단어의 분포를 계산합니다. 학생은 자기 분포를 교사 쪽으로 맞춥니다.

그림 5. off-policy와 on-policy 증류의 차이. 문장과 확률은 설명용 예시입니다.

남은 문제는 양자화된 가중치를 미분할 수 없다는 점입니다. 이를 위해 STE(Straight-Through Estimator)를 씁니다. 순전파(forward pass)에서는 터너리 코드를 그대로 쓰고, 역전파(backward pass)에서는 양자화 함수를 항등 함수(identity function)로 간주해 기울기를 잠재 가중치에 전달합니다. 잠재 가중치는 터너리 코드 뒤에 실수로 남겨 둔 값으로, 작은 업데이트가 쌓이면서 조금씩 바뀌다가, 임계값 τ를 넘는 순간 양자화된 코드가 바뀝니다.

이 구조 때문에 1에폭(학습 데이터 전체를 한 번 학습하는 단위) 동안 실제로 코드가 바뀐 가중치는 전체의 약 5~7%였습니다. 복원은 모델에 새 지식을 넣는 작업이 아니라, 양자화로 바뀐 소수의 코드를 원본 출력에 맞게 고치는 작업에 가깝다는 뜻입니다. 실제로 복원한 모델에 한국어로 자기소개를 요청하면, 모델은 자신을 NVIDIA 연구진이 만든 Nemotron이라고 답합니다. 복원 과정에서 원본 모델의 정체성이 그대로 유지됐다는 간접 신호입니다.


복원 2단계: 경계 마스킹

증류와 STE만으로도 1~2에폭 사이에서는 성능이 크게 올라옵니다. 1에폭과 2에폭을 거치며 GSM8K는 82.56, 87.57, HumanEval은 72.56, 80.49, IFEval-ko는 61.79, 68.39까지 올랐습니다.

하지만 에폭을 늘리는 것만으로는 성능이 계속 오르지 않았습니다. 같은 조건에서 3에폭까지 학습하자 GSM8K는 85.90, IFEval-ko는 64.82로 다시 내려갔습니다. 모델을 바꿔 실험해도 같은 패턴이 나타났습니다. STE가 모든 잠재 가중치에 신호를 전달하면서, 바뀔 필요가 없는 값까지 계속 갱신되어 노이즈로 코드가 바뀌는 것으로 보였습니다. 그래서 학습할 가중치의 범위를 좁혀 보았습니다.

PTQ 초기값이 임계값 τ의 ±10% 범위 안에 있는 가중치, 즉 전체의 약 5.9%만 학습하고 나머지 잠재 가중치는 동결했습니다. 경계 근처로 좁힌 것은 그 범위의 가중치만 작은 업데이트로 코드가 실제로 바뀔 수 있기 때문입니다. 경계에서 먼 값은 학습해도 코드가 바뀌기 어렵고, 노이즈만 더할 수 있습니다. 이 방식을 경계 마스킹이라고 부릅니다.

복원 단계별 자체 평가 점수

마스킹 = 3에폭 + 경계 마스킹

GSM8K

3에폭 85.90 → 마스킹 88.32

PTQ 직후
0.00
1에폭
82.56
2에폭
87.57
3에폭
85.90
마스킹
88.32

HumanEval

3에폭 82.93 → 마스킹 87.80

PTQ 직후
0.00
1에폭
72.56
2에폭
80.49
3에폭
82.93
마스킹
87.80

IFEval-ko

3에폭 64.82 → 마스킹 68.39

PTQ 직후
10.36
1에폭
61.79
2에폭
68.39
3에폭
64.82
마스킹
68.39
그림 6. 복원 단계별 자체 평가. 막대 높이는 점수(100점 만점)입니다. 3에폭에서 떨어진 지표가 경계 마스킹으로 다시 올라갑니다.

같은 3에폭에서 경계 마스킹을 적용하면 GSM8K는 85.90에서 88.32로, IFEval-ko는 64.82에서 68.39로 다시 올라옵니다. 학습을 더 오래 하는 것보다 어디를 학습할지 정하는 쪽이 효과가 컸다는 뜻입니다.


결과: 생성형 벤치마크 평균 89.4%

복원을 마친 모델은 생성형 벤치마크 7종 평균에서 원본 93.80점 대비 83.82점, 원본의 89.4%를 기록했습니다. 사후 변환 직후 0.00점이었던 GSM8K도 89.31점으로, 원본의 94% 수준까지 회복했습니다.

벤치마크원본 BF16노타 1.58비트회복률
GSM8K수학95.0089.3194.0%
MATH500수학97.6081.6083.6%
HumanEval코드96.3490.8594.3%
IFEval지시 이행92.0583.3690.6%
영어 4종 평균95.2586.2890.6%
HRM8K수학91.0583.2491.4%
HumanEval-ko코드95.1285.3789.7%
IFEval-ko지시 이행89.4673.0481.6%
한국어 3종 평균91.8880.5587.7%
표 2. 복원을 마친 1.58비트 모델의 생성형 벤치마크 결과. 위 탭에서 영어·한국어를 고를 수 있습니다. 벤치마크별 수치는 Hugging Face 모델 카드와 같고, 언어별 평균은 이를 바탕으로 계산한 값입니다.

벤치마크별로 보면 수학(GSM8K)과 코드(HumanEval)는 원본의 94% 수준을 기록했고, 7종 중 5종은 원본의 89% 이상이었습니다. 회복률이 상대적으로 낮은 항목은 풀이가 긴 MATH500과 한국어 지시 이행(IFEval-ko)으로, 앞으로 더 개선할 부분입니다.


맥북에서 직접 써 보기

그렇다면 몇 GB 맥북이면 이 모델을 돌릴 수 있을까요? 맥에서는 통합 메모리 전체를 GPU가 쓰지 않고, 기본 설정에서는 대략 2/3~3/4까지만 씁니다. 보수적으로 2/3로 계산하면 16GB 맥북의 GPU 한도는 약 10.7GB, 24GB 맥북은 약 16GB입니다.

이 모델의 가중치는 약 10GB이지만, 실행하려면 KV 캐시와 Mamba 상태, 런타임 버퍼가 더 필요합니다. Nemotron 3.5 Lightning은 Mamba 층과 Attention 층을 함께 쓰는 하이브리드 구조로, KV 캐시가 필요한 Attention 층은 6개라서 128K 토큰 문맥에서도 KV 캐시가 약 0.8GB를 차지합니다. 공개 설정 파일로 계산하면 가중치 외 메모리는 최대 약 2.4GB, 전체는 최대 약 12.4GB입니다. 16GB 맥북의 한도보다는 크고, 24GB 맥북의 한도보다는 작습니다.

이 모델이 쓰는 메모리 약 12.4GB

GPU 한도 구간(기본 약 2/3)을 아래에 확대했습니다

16GB 맥북

GPU 기본 한도높인 GPU 한도
GPU 외 용도 약 5.3GB시스템 여유 약 2.5GB
가중치 10GB실행 메모리GPU 한도 +2.8GB넘침 약 1.7GB계산상 들어감GPU 기본 한도 약 10.7GB → 높인 한도 약 13.5GB

24GB 맥북

GPU 기본 한도
GPU 외 용도 약 8GB
가중치 10GB실행 메모리여유 약 3.6GBGPU 기본 한도 약 16GB
그림 7. 맥북 GPU 한도 구간에 이 모델을 채운 모습(계산값). 16GB는 넘친 뒤 한도를 약 13.5GB로 높였고, 실행 메모리는 최대 2.4GB 기준입니다.

16GB 맥북도 macOS 설정으로 GPU 메모리 한도를 높이면 계산상 들어가지만, 그만큼 시스템과 다른 앱이 쓸 메모리가 크게 줄어듭니다. 그래서 24GB 이상 맥북을 권장합니다.

이 모델은 Hugging Face에 공개돼 있어, 아래 저장소에서 받아 직접 실행해 볼 수 있습니다. 현재 공개한 모델은 성능 복원을 이어 가고 있는 프리뷰 체크포인트이며, 모델 카드에 저장 포맷과 평가 조건이 함께 정리돼 있습니다.

Related