TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 38 READS

1975년 6502 프로세서에서 언어 모델을 돌리다: 하드웨어가 아키텍처를 정한다

1975년 6502 프로세서에서 언어 모델을 돌리다: 하드웨어가 아키텍처를 정한다
SOURCE IMAGE · HACKER NEWS

1975년 출시된 MOS 6502는 애플 II와 BBC 마이크로를 구동했던 8비트 마이크로프로세서다. 한 개발자가 아버지의 1980년대 BBC 모델 B를 물려받아, 현대 머신러닝 기법으로 이 기계에 담을 수 있는 가장 강력한 언어 모델이 무엇인지 실험했다. 결과물은 Mamba 계열의 초소형 언어 모델과 직접 구현한 8비트 삼진(ternary) 추론 엔진으로, 실제 BBC 마이크로에서 한 글자씩 텍스트를 생성한다. 화려한 성능을 자랑하는 프로젝트는 아니지만, 극단적 제약 아래에서 모델 설계가 어떻게 하드웨어에 의해 규정되는지를 보여주는 사례다.

제약은 혹독하다. 모델 가중치와 추론 코드가 25KB의 사용자 메모리 안에 모두 들어가야 했고, 최종 구성은 추론 코드 9KB, 모델 가중치 13KB였다. 6502는 8비트 정수만 다루며 곱셈 명령어조차 없다. 곱셈은 비트 시프트와 덧셈을 반복해 만들어야 하는데, 8×8 곱셈 후 누적에 약 150클록이 든다. 개발자는 CC65로 C 코드를 6502 명령어로 컴파일하고, 맥북에서 학습한 모델 바이너리를 직접 만든 3.5mm-테이프 케이블로 전송했다. 노트북 헤드폰 잭에서 나오는 오디오를 BBC가 테이프 드라이브 신호로 인식하게 만든 것이다. sim65 에뮬레이터로 C 바이너리와 파이썬 참조 구현의 결과 일치를 확인하고, jsbeeb 에뮬레이터에서 전체 추론을 검증한 뒤 실제 기계로 옮기는 방식이었다.

곱셈 없는 CPU를 위한 삼진 가중치

핵심 아이디어는 BitNet이다. 행렬 곱 Y=XW를 구성하는 내적에서 가중치 W의 값을 -1, 0, 1의 삼진 집합으로 양자화하면, 곱셈이 단순한 덧셈과 뺄셈의 나열로 바뀐다. 앞서 언급한 150클록짜리 곱셈-누적이 삼진 누적에서는 약 30클록으로 줄어, 곱셈이 없는 6502에서 추론 속도가 크게 빨라진다. 삼진 파라미터 하나는 이론상 log2(3)≈1.58비트만 필요하다. 다만 5개를 1바이트에 담으면 저장 효율은 높지만 3으로 나누는 연산을 반복해야 압축을 풀 수 있는데, 6502에는 이 명령어가 없다. 그래서 파라미터당 2비트를 배정해 4개를 1바이트에 담는 방식을 택했고, 압축 해제는 오른쪽 시프트 한 번으로 끝난다. 이 방식으로 13KB에 약 5만 2천 개의 파라미터를 담았으며, 정밀도를 낮추고 파라미터 수를 늘리는 편이 성능 대비 효율이 좋다는 것이 실험으로 확인됐다.

학습은 다른 양자화 학습과 비슷하다. 파라미터를 float32 정밀도로 저장하되 순전파에서 삼진으로 양자화하고, 역전파에서는 전 정밀도로 그래디언트를 흘려보낸다. 단, 최종 LM 헤드만은 int4로 유지했다. 출력 투영은 어휘 전체에 확률을 고르게 퍼뜨려야 해서 더 높은 해상도가 필요하기 때문이다. 어휘는 알파벳 26자와 공백 하나로 제한했는데, 이 정도 규모에서 단어·서브워드 어휘를 쓰면 인코더·디코더 계층이 파라미터 예산을 지나치게 잡아먹는다.

어텐션 대신 Mamba를 고른 이유

GPT-3 같은 전통적 모델은 어텐션으로 토큰 간 관계를 다룬다. 어텐션은 정확한 회상 능력을 주지만, 생성이 진행될수록 KV 캐시가 계층 수×은닉 차원만큼 토큰마다 커진다. 32KB RAM 예산에서 이는 가중치에 쓸 공간을 잠식한다. 반면 SSM(S4, Mamba)이나 RNN 계열(GRU, LSTM)은 상태를 고정 크기 벡터에 담아 매 순전파의 연산 형태가 동일하므로, 메모리가 제한된 6502 추론에 훨씬 적합하다. 이 작업에 필요한 것은 철자와 단순 문법을 익힐 만큼의 단기 회상뿐이라, 어텐션의 정밀한 회상은 사치였다.

그러나 순환 모델에는 그래디언트 소실·폭발 문제가 있다. 순환 단계마다 순전파 행렬의 최대 고윳값 크기로 오차가 증폭되는데, 1보다 조금만 큰 고윳값도 시퀀스가 길어지면 치명적이다. BitNet 체제에서는 순전파 행렬의 스펙트럴 반경이 대개 1을 크게 넘어, 이를 1 근처로 낮추려면 가중치의 98%가 0이어야 한다. 실제로 GRU는 학습 실행마다 발산했고, 이를 피하려면 가장 큰 행렬을 int4로 저장해야 해 모델 차원이 크게 줄었다. 반면 Mamba는 채널별 스칼라 갱신을 쓰고 감쇠값이 추론 시점에 [0,128)/128 범위로 계산되어 구조적으로 1을 넘지 못한다. 폭발이 원천적으로 불가능한 셈이라 Mamba가 채택됐다.

8비트 안에 갇힌 활성값과 샘플링

활성값은 8비트로 저장된다. 각 누적항의 크기가 128 이하이므로 최대 256개까지 16비트에 오버플로 없이 누적할 수 있는데, 이것이 모델 차원의 상한을 결정한다. 계층을 지난 뒤 활성값을 다시 8비트로 되돌릴 때는 hardtanh, 즉 clip(x,-1,1)을 쓴다. 그런데 16비트 값을 단순히 8비트로 자르면 동적 범위 대부분을 잃는다. 예컨대 64개 값을 누적하면 표준편차가 약 591에 달해 83%가 클립 경계에서 포화된다. 그래서 학습된 스케일링(shr)을 도입했는데, 이 값은 1만 바뀌어도 활성 크기가 두 배 또는 절반이 될 만큼 민감했다. 스케일 파라미터를 학습 전반부에는 변하게 두고 후반부에 고정하는 방식이 가장 안정적이었다.

샘플링에서도 하드웨어 한계가 드러난다. 그리디 방식은 로짓 최댓값을 고르면 되지만 생성이 단조로워진다. Top-k 소프트맥스는 지수 함수가 필요한데 6502에는 없으므로, 온도 T에 맞춘 지수값 룩업 테이블을 미리 계산해 정수 연산으로 대체했다. 최댓값을 빼는 안정화 기법을 적용한 뒤 16비트 의사난수를 배열 합으로 나눈 나머지로 표본을 뽑는다. 다만 6502에는 사용자 입력 없이 시드를 주입할 방법이 없어 시드가 고정되고, 그 결과 모델은 매번 같은 출력을 낸다. 이 프로젝트는 ML 설계에 '기계적 공감'이 필요함을, 그리고 사라 후커가 말한 '하드웨어 복권' 명제 — 최첨단 아키텍처는 가용 하드웨어와 함께 진화한다는 —을 실증한다. 제약이 달랐다면 선택된 구조나 옵티마이저도 달랐을 것이다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://mattbeton.com/blog/bitnet-6502.html
SHARE
처리 중...