Someone built a 32-bit RISC-V CPU directly inside Qwen's model weights so it can execute instructions internaly!
Qwen 모델 가중치 안에 32비트 RISC-V CPU를 구현했습니다
Qwenputer는 Qwen 3.5 4B의 Gated DeltaNet 상태를 RAM으로 쓰고, 추가 가중치에 RV32IM CPU를 컴파일한 실험 모델입니다. 산술 벤치마크에서 Python 도구를 쓴 모델과 비슷한 점수를 냈지만 체크포인트가 18.8GB로 커지고 실행도 느립니다.
- 주제
에디터 노트
이 실험이 보여주는 성과는 산술 결과의 정확성과 모델 안에서 계산이 이뤄지는 구조입니다. 기준 머신과 23만 개 출력 위치가 일치했고, 일부 산술 평가에서는 Python 도구 사용 모델과 비슷하거나 높은 점수를 냈습니다. 반면 실행마다 여러 토큰을 디코딩하고 체크포인트가 18.8GB로 커집니다. 일반 계산 도구를 대체할 효율성은 아직 입증되지 않았습니다. 댓글에서 제기된 도구 호출과의 차이도 분명히 볼 필요가 있습니다. 현재 Qwen은 학습된 도구 호출 형식으로 내부 CPU에 요청을 전달하며, 작성자 설명에 따르면 계산은 외부 런타임 없이 순전파 안에서 처리합니다. 따라서 호출 방식은 기존 도구 형식에 기대지만 실행 위치는 모델 내부입니다. 댓글의 더 안전하다는 주장이나 장기적 활용 가능성은 제안 수준이며, 이 글의 평가가 입증한 범위는 산술 정확도와 제한된 파일 저장 기능입니다.
AI 요약
Qwenputer는 Qwen 3.5 4B의 가중치와 구조를 바탕으로, 모델 내부에서 작동하는 32비트 RISC-V CPU와 메모리를 추가한 실험 모델입니다. 별도 학습 없이 CPU 회로를 트랜스포머 층의 가중치로 컴파일했습니다. 산술 연산과 C, MicroPython 코드를 실행하며 파일 저장 기능도 실험적으로 구현했습니다.
Gated DeltaNet 상태를 RAM으로
Qwen 3.5의 Gated DeltaNet(GDN)은 각 헤드가 상태 행렬을 유지하는 선형 순환 신경망입니다. 작성자는 게이트를 1로 고정해 상태가 감쇠하지 않게 하고, 쓰기 강도 beta를 1로 설정한 뒤 원-핫(one-hot) 주소를 사용했습니다. 이렇게 하면 지정한 행에 값을 정확히 덮어쓰고, 주소에 해당하는 값을 읽을 수 있습니다. 대화가 길어져도 상태 크기가 변하지 않아 KV 캐시를 RAM처럼 쓰는 방식보다 비용이 낮다고 설명합니다. 기본 Qwen 3.5는 GDN에 값을 정확히 보존하지 않으며, 이를 가능하게 하도록 모델 구조를 수정했습니다.
가중치로 컴파일한 CPU
CPU는 RV32IM에 Zba 확장과 큰 정수 연산 장치를 더한 32비트 RISC-V 코어입니다. Qwen의 기존 32개 층 앞에 11개 층을 추가했습니다. 컴파일러는 회로의 각 동작을 층에 배치합니다. 어텐션 헤드는 값을 조회하고, 피드포워드 유닛은 산술을 수행하며, DeltaNet 헤드는 RAM을 유지합니다. CPU는 모델의 토큰 생성 과정에서 실행됩니다. 명령마다 메모리 주소를 나타내는 ADDR 토큰, 값을 담는 VAL 토큰, 명령 종료를 알리는 STEP 토큰을 생성해 실행 흔적을 만듭니다.
CPU는 공식 riscv-tests를 통과했고, 프로그램 실행 결과가 QEMU와 일치했습니다. 작성자는 기준 머신의 보정 없이 1,800만 개 명령을 연속 실행해 오류가 없었으며, CPU 출력 약 23만 위치를 기준 머신과 비교해 불일치가 없었다고 보고합니다. C와 MicroPython도 실행하지만 속도는 느립니다.
모델 연동과 평가
Qwen은 별도 사후 학습 없이 기존 도구 호출 형식을 사용해 CPU에 명령을 보냅니다. 작은 드라이버인 RvChat이 GDN 상태에 펌웨어를 적재하고 CPU 실행 흔적 토큰을 Qwen의 층에 노출되지 않게 처리합니다. 계산 자체에는 외부 도구나 런타임을 쓰지 않지만, 일반적인 generate() 호출만으로 실행할 수는 없습니다.
DeepMind 산술 평가에서 Qwenputer는 큰 정수 나눗셈 97.5%, 곱셈 97.5%, 여러 차례의 곱셈·나눗셈 100%, 큰 수 덧셈·뺄셈 97.5%를 기록했습니다. Python 도구를 연결한 Qwen 3.5 4B는 각각 95%, 100%, 97.5%, 97.5%였고, 기본 모델은 72.5%, 55%, 90%, 87.5%였습니다. NUPA 장정수 연산 점수는 기본 모델 48.6%에서 100%로 올랐으며 Python 도구 사용 모델과 같았습니다. 일반 텍스트 출력은 기본 모델과 거의 같았다고 보고합니다(KL 6e-4, 잡음 기준 5e-4).
실험용 파일 시스템과 한계
파일 시스템은 파일 이름을 해시해 1,024개 디렉터리 슬롯 중 하나에 배치하고, 충돌하면 다음 슬롯을 확인합니다. 텍스트는 다른 헤드에 토큰 단위로 저장합니다. 최대 512개 파일, 약 5만 3천 토큰을 보관하며 파일을 찾는 데는 대략 2~3단계가 걸립니다. 대화가 끝난 뒤 상태를 저장해 다음 대화에서 불러오는 기능도 구현했습니다. 변경된 사실을 묻는 평가에서 정답률은 90%로, 이전 대화를 붙여 넣은 경우의 30%보다 높았고 Python 기반 메모리 도구를 쓴 경우의 83.3%와 78.9%를 웃돌았습니다. 작성자는 이 기능이 실험 단계라고 밝혔습니다.
추가 층과 넓어진 은닉 차원 때문에 체크포인트는 18.8GB로 기본 모델의 약 두 배입니다. 상당 부분은 제로 패딩이며, CPU 명령마다 여러 토큰을 디코딩하므로 큰 계산은 밀리초가 아니라 초 단위로 걸립니다. L4에서 벡터화한 실행기는 초당 약 3,200 CPU 토큰을 처리했습니다. 작성자는 MicroPython 실행과 CPU 가속을 다음 과제로 제시했습니다.
Reddit 반응
- @Toooooool — 제가 이해할 만큼 똑똑해서 이게 교묘한 도구 호출과 JSON인지, 아니면 실제로 토큰 수준에서 실행하는 것인지 판단할 수 있었으면 좋겠습니다. 어느 쪽이든 정말 멋져 보입니다.
- @annodomini — 제 이해가 맞다면 둘 다입니다. 실제로 Qwen 3.5 구조 안에서 CPU와 RAM을 에뮬레이션하는 방법을 만들었습니다. 다만 Qwen에 통합하려고 학습하는 대신 도구 호출 형식을 흉내 내도록 기능을 더했습니다. LLM 부분이 도구 호출 형식으로 요청을 만들면 CPU 부분이 실행하고 도구 응답처럼 결과를 돌려줍니다. 실제로는 아주 느린 RISC-V 에뮬레이터에 도구 호출을 보내는 셈입니다. 일반 도구 호출로도 할 수 있는 일이며, 대부분 더 나은 구현 방법이 있습니다. 그래서 재미를 위한 실험에 가깝습니다.
- @-dysangel- — 모델이 어떤 식으로든 도구 호출을 해야 시작되는 것 같습니다. 그러면 아주 비효율적인 도구 호출의 참신한 형태로 볼 수 있겠네요. 확인해 보니 그렇습니다. 모델이 calc, put, get, list 같은 요청을 하면 컴퓨터 층이 순전파 안에서 요청을 가로채 가상 RISC-V 프로세서에서 실행하고, 토큰 단위로 응답을 작성합니다. 재미있는 아이디어지만 일반 도구 호출보다 나은 상황이 있는지는 모르겠습니다. 이 환경에서 실행을 강하게 격리하므로 더 안전한 도구 호출일 가능성은 있겠네요.
- @RevealIndividual7567 — 작성자입니다. 모델이 이 내부 기능을 사용하도록 학습되지 않은 기본 Qwen이라, 모델이 이미 학습한 도구 사용 형식을 빌려 CPU를 표현합니다. 후처리 학습이 필요한 무호출 방식도 거의 완성했지만, 컴퓨팅 자원이 제한돼 시간이 걸리고 있습니다. 실제 계산은 외부 런타임이나 도구를 전혀 쓰지 않고 모델의 순전파 안에서 이뤄집니다.
- @Spectrum1523 — 모델이 외부 도구를 호출하는 것보다 나은 점이 있나요? 모델 구조가 이 CPU를 본래 사용하도록 설계된 것도 아니지 않나요?
- @ieatrox — 도구도 기능을 수행할 수 있지만 결과를 비결정적인 시스템인 LLM이 해석해야 합니다. LLM은 어느 시점에서든 환각할 수 있습니다. 이 방식은 적절한 경우 모델 안에서 해당 기능을 처리할 방법을 제공해야 합니다.
- @jasminUwU6 — 샌드박스 실행에는 이미 WASM이 있습니다.
- @-dysangel- — 계산에 쓰는 컴퓨터가 커질수록 토큰 입력 비용도 비슷하게 늘어날 것 같습니다. 신경망으로 CPU 전체를 시뮬레이션하는 방식은 실제 CPU에서 계산하는 것보다 매우 비효율적입니다. 실제 CPU 명령을 실행하면 토큰 비용을 크게 줄일 수 있겠지만 공격자가 시스템을 해킹할 직접 경로도 생깁니다. 작은 VM에서 명령을 실행하는 중간 방식이 나을 수도 있습니다.
- @Certain-Cod-1404 — 왜 전통적인 도구 호출 대신 이걸 만들었나요? 모델 크기가 커지고 디코딩이 느려지는데 Python보다 약간 나은 정도라면, 더 큰 목표가 있는 건가요 아니면 재미를 위한 실험인가요? CPU를 어떻게 결정적으로 작동하게 했는지도 궁금합니다. 시드, 온도, CUDA 버전, 배치 크기를 바꿔 시험했나요?
- @Top-Evidence174 — CPU를 가중치에 컴파일했다니 정말 놀랍습니다. CPU만을 위해 층 11개를 추가한 비용은 상당하네요. 대단한 기술 과시지만 저는 당분간 Python 도구 호출을 쓰겠습니다.
- @LatentSpacer — 이것은 첫 프로토타입입니다. 내부에 튜링 완전 기계를 둔 채 처음부터 학습한 모델을 상상해 보세요. LLM을 더 결정적으로 만들 수 있습니다.
- @alberto_467 — 도구 호출로 쓸 수 있다면 이미 그런 방식은 수천 가지가 있고, 수년 전부터 존재했습니다.
원문: https://divagr.com/blog/qwenputer / 번역·요약: Trawling