Qwenputer는 Qwen 3.5 4B 앞에 11개 레이어를 추가해 32비트 RISC-V CPU를 구현한 프로젝트다. 제작자는 Gated DeltaNet의 상태를 특정 방식으로 설정해 정확한 메모리로 사용했으며, 산술 문제에서 자체 테스트상 97.5~100%의 정확도를 기록했다고 밝혔다. 다만 실행 속도는 초당 수백~약 1,000개 명령 수준으로 느리다.

divagr.com의 원문 설명에 따르면 CPU는 RV32IM 코어에 Zba 확장과 큰 정수 연산 장치를 더한 구성이다. 제작자는 공식 riscv-tests를 통과했고, 1,800만 개 명령을 오류 없이 실행했다고 밝혔다. 가중치는 학습하지 않고 컴파일러로 계산했으며, Qwen의 기존 가중치는 바꾸지 않았다. 체크포인트 크기는 18.8GB로 기본 Qwen의 약 두 배이며, 24GB GPU 한 대에서 실행된다. 가중치는 Hugging Face에 공개돼 있다.

Qwenputer는 모델이 학습된 형식으로 calc 도구 호출을 출력하면 이를 외부 프로그램에 전달하는 대신 추가 레이어 안의 CPU가 읽고 실행한다. CPU 명령은 주소와 값, 단계 표시를 담은 몇 개의 토큰으로 표현된다. 계산 결과도 모델이 토큰을 생성해 출력한다.

핵심은 Qwen 3.5의 Gated DeltaNet 레이어가 토큰마다 갱신하는 상태 행렬이다. 제작자는 게이트 값 알파를 1로 두어 기존 값을 유지하고, 쓰기 강도 베타를 1로 설정해 이전 값을 완전히 지운 뒤 새 값으로 덮어썼다. 키를 한 자리만 1인 원-핫 벡터로 만들면 쓰기가 지정된 슬롯 하나에만 적용된다. 제작자는 이 설정으로 각 주소에 마지막으로 쓴 값을 정확히 읽을 수 있다고 설명한다. 베타가 0.5이거나 키가 원-핫이 아니면 값이 섞이거나 다른 슬롯이 손상될 수 있다는 점을 간단한 NumPy 예제로 보였다.

메모리는 주소의 하위 비트로 헤드를 고르고 나머지 비트로 행을 선택하는 방식으로 배치한다. 각 행은 바이트 하나를 비트로 저장하며, 레지스터와 프로그램 카운터, 호출 스택도 각각 별도 헤드를 사용한다. 제작자에 따르면 이 상태는 대화가 길어져도 커지지 않아 메모리 크기와 토큰당 비용이 고정된다. 게이트를 한 토큰 동안 0으로 두면 헤드 전체를 지울 수 있고, 0.5로 두면 값이 매 단계 절반으로 줄어드는 특성을 카운터에 활용했다.

제작자의 테스트는 각 문제 세트 40개를 대상으로 탐욕적 디코딩을 사용했다. 기본 Qwen에는 도구를 주지 않았고, 비교 대상에는 호스트에서 실제 Python 인터프리터를 호출하는 기본 Qwen을 포함했다.

문제 세트기본 QwenQwenputerPython 도구 사용
DeepMind mul_big55.0%97.5%100%
DeepMind div_big72.5%97.5%95.0%
DeepMind add_or_sub_big87.5%97.5%97.5%
DeepMind mul_div_multiple_longer90.0%100%97.5%

제작자는 CPU 출력 약 23만 개 위치를 기준 모델로 재생해 불일치가 없었다고 보고했다. Qwen의 텍스트 동작은 기본 모델과 거의 차이가 없었다고 설명하며, KL 발산은 6e-4, 잡음 기준선은 5e-4라고 제시했다. 이 수치들은 제작자의 자체 테스트 결과이며, 원문 설명에서는 별도로 재실행하지 않았다고 밝혔다.

실행기는 Nvidia L4 한 대에서 초당 약 3,200개의 추적 토큰을 처리한다. 명령 하나에 토큰이 몇 개 드는지는 고정돼 있지 않다. 제작자가 제시한 주소·값·단계 토큰을 기준으로 명령당 3~6개 토큰이라고 가정하면 초당 약 530~1,070개 명령이다. 초당 1,000개 명령으로 계산할 때 1,800만 개 명령 실행에는 약 5시간이 걸린다. 따라서 빠른 소프트웨어 실행 수단이라기보다, 모델의 순전파 과정 안에서 외부 샌드박스나 도구 서버, 네트워크 호출 없이 정확한 계산을 수행하는 사례에 가깝다.

일반 도구 호출은 모델 밖의 실행 환경이 필요하지만 빠르고 호스트가 허용하는 작업을 수행할 수 있다. Qwenputer는 별도 도구 실행 환경이 필요 없지만 느리고, 구현된 CPU와 메모리에 맞는 작업만 실행할 수 있다. 실험적 변형은 DeltaNet 상태에 파일시스템을 추가해 최대 512개 파일을 저장하며 put, append, get, list, delete를 지원한다. 대화 사이에 바뀐 사실을 다룬 테스트에서 정확도는 90%였고, 이전 대화를 다시 입력했을 때는 30%였다고 제작자는 보고했다.

이 프로젝트는 선형 어텐션을 이용한 모델 내부의 정확한 계산 사례를 살펴보려는 연구자나, 도구 실행 환경 없이 산술을 처리하려는 개발자가 검토할 수 있다. 사용하려면 24GB GPU가 필요하며, GitHub 저장소에 빠른 시작 안내가 있다. 다만 GitHub API에서 저장소 라이선스는 NOASSERTION으로 표시돼 재사용 조건이 불분명하다. 기본 Qwen 가중치에는 Qwen 라이선스가 적용된다. 다른 선형 어텐션 기반 하이브리드 모델에서도 같은 방식이 통하는지는 원문에서 시험하지 않았다.

참고 자료: 프로젝트 원문, GitHub 저장소, Hugging Face 모델, Hacker News 토론

부록: 원문 예시

text
import numpy as np
def write(S, k, v, alpha=1.0, beta=1.0):
 # gated delta rule: fade by alpha, erase what key k held, write v at k
 return alpha * (S - beta * np.outer(S @ k, k)) + beta * np.outer(v, k)

e = np.eye(4)
S = np.zeros((4, 4))
S = write(S, e[1], np.array([1, 0, 1, 1.]))
S = write(S, e[1], np.array([0, 1, 0, 0.])) # overwrite cell 1
print(S @ e[1]) # [0. 1. 0. 0.] exact

S2 = np.zeros((4, 4)) # same writes, beta = 0.5
S2 = write(S2, e[1], np.array([1, 0, 1, 1.]), beta=0.5)
S2 = write(S2, e[1], np.array([0, 1, 0, 0.]), beta=0.5)
print(S2 @ e[1]) # [0.25 0.5 0.25 0.25] a blend

S3 = write(np.zeros((4, 4)), e[0], np.array([1, 1, 1, 1.]))
S3 = write(S3, np.array([.8, .6, 0, 0]), np.array([0, 0, 0, 1.]))
print(S3 @ e[0]) # [0.36 0.36 0.36 1.16] cell 0 damaged
text
Executor speed (author, one Nvidia L4): about 3,200 trace tokens a second
Tokens per instruction (author): "a few": an ADDR, a VAL, then a STEP
If an instruction takes 3 tokens: about 1,070 instructions a second
If it takes 6 tokens: about 530 instructions a second
Longest clean run (author): 18 million instructions
At 1,000 instructions a second that is: about 5 hours of decoding