$250 KV260 FPGA에서 TinyStories LLM이 60k tokens/s 달성

핵심 요약

3.16M 파라미터의 INT4 LLM이 $250 AMD KV260 FPGA의 3MB 온칩 SRAM에 탑재되어, 라이브 웹 데모에서 측정된 59,965 tokens/s (200 MHz, 16개 병렬 스트림) 및 사용 가능한 19,200 tokens/s (단일 스트림, 전체 KV cache)를 기록했습니다. 이는 온칩 가중치 저장이 소형 모델의 DDR 대역폭 병목 현상을 극복할 수 있음을 보여줍니다.


온칩 메모리가 중요한 이유

KV260의 ARM A53 코어와 프로그래밍 가능한 로직(PL)은 약 20 GB/s로 제한된 단일 오프칩 DDR 컨트롤러를 공유합니다. 모델 가중치가 DDR에 상주할 경우, 모든 토큰 생성 시 AXI 버스를 통한 비용이 큰 왕복 과정이 발생하여 시스템이 연산 중심이 아닌 메모리 대역폭 제한을 받게 됩니다. 전체 가중치 행렬을 온칩 SRAM(URAM ~18 Mb + BRAM ~5 Mb)에 저장하면 유효 대역폭이 수백 GB/s로 높아져 병목 현상이 제거됩니다. 이러한 통찰은 Taalas, Groq, Cerebras의 접근 방식과 유사하며, 이들 모두 메모리 벽을 탈출하기 위해 대규모 온칩 메모리 예산을 할당합니다.

모델 피팅 전략

  • 모델 크기 – 3.16M 파라미터 × 4 bits = ~1.5 MiB로, KV260의 ~3 MiB 온칩 예산 내에 여유롭게 들어옵니다.
  • 가중치 형식 – INT4 양자화는 연산을 단순하게 유지하면서 필요한 밀도를 제공합니다.
  • 코퍼스 – TinyStories (≈2.1M 개의 간단한 어린이용 이야기)는 토이 채팅 모델에 충분한 언어적 다양성을 제공합니다.
  • Lemmatised variant – Kevin 스타일의 전처리 단계는 코퍼스 길이를 약 30% 감소시켰으나(371.7M → 260.5M 단어), 파라미터 수를 줄이지는 않았습니다. 이는 토큰당 생성되는 문자의 수를 줄여 생성 속도만 높입니다.

아키텍처 및 구현

  • Dual-ported URAM – 가중치 이미지를 보유하며, 두 그룹이 동시에 가중치를 읽을 수 있는 “split-brain” 설계를 가능하게 합니다.
  • BRAM – 활성화(activations), 스크래치 공간 및 KV cache를 저장합니다.
* **Custom GEMV** – 고수준 합성(HLS) 도구를 사용하지 않고 Verilog로 직접 구현된 와이드 워드 행렬-벡터 곱셈입니다.
* **Parallel streams** – 최대 16개의 독립적인 토큰 스트림이 단일 가중치 패스를 공유하며, 각 스트림은 왕복 횟수를 최소화하기 위해 T = 1의 어텐션 윈도우를 사용합니다. 이를 통해 헤드라인인 59,965 tok/s의 총합 속도를 달성합니다.
* **Full-context stream** – 전체 KV cache(이전의 모든 토큰에 대한 어텐션)를 가진 단일 스트림은 ~19,200 tok/s(카운트된 사이클) 및 실측 ~21,300 tok/s로 사용 가능한 채팅을 제공합니다.

성능 단계

단계 구성 Tokens / s (silicon) 비고
A53 baseline ARM A53 전용 11 CPU 전용, DDR 제한
GPU reference RTX 3050 Ti (torch) 719
Single-stream PL 패브릭 내 전체 포워드, 전체 KV cache 19,242 (카운트) ≈ 21,300 (실측)
4-16 parallel streams T = 1, KV cache 없음 59,965 (16-스트림 총합)

이 단계는 각 최적화가 특정 지연 시간 원인을 제거함을 보여줍니다: matmul을 PL로 이동, CPU-패브릭 핸드셰이크 제거, 그리고 마지막으로 병렬 스트림 간의 가중치 패스 통합.

한계 및 확장성

  • 온칩 용량 – KV260은 ~3 MiB를 제공합니다. ~6.3M 파라미터보다 큰 모델은 DDR로 넘어가게 되어 대역폭 벽이 다시 나타납니다.
  • DSP 리소스 – 칩에는 1,248개의 DSP48E2 블록이 있으며, 각 블록은 두 개의 INT4×INT8 MAC를 수행할 수 있습니다. 더 큰 모델을 위한 필요한 MAC를 채우는 것은 가용 DSP를 초과하게 되어, 이 아키텍처의 실질적인 처리량을 62k–78k tok/s로 제한합니다.
  • 사용성 – 16-스트림 총합 속도는 어텐션 윈도우가 한 토큰일 때 달성되므로 무의미한 출력을 생성합니다. 단일 스트림, 전체 컨텍스트 모드가 ~21k tok/s의 속도로 일관된 대화를 생성하는 유일한 구성입니다.

ASIC 및 대규모 솔루션과의 비교

  • Taalas ASIC – 가중치를 ROM에 저장하여 더 높은 절대 처리량을 달성하지만, 제조 후 재프로그래밍이 불가능합니다.
  • Cerebras Wafer-Scale Engine – 웨이퍼당 44 GB SRAM을 제공하여 DDR 병목 현상 없이 훨씬 더 큰 모델을 가능하게 합니다.
  • Groq – 칩당 ~230 MB의 온칩 SRAM을 할당하여 수백 메가바이트 규모의 모델을 지원합니다.

KV260은 동일한 메모리 벽 원리가 예산에 관계없이 적용됨을 보여줍니다. 온칩 가중치 저장은 $250 개발 보드에서도 수십 배의 속도 향상을 가져옵니다.

커뮤니티 피드백 하이라이트

"문제는 당신의 모델이 빠르다는 것이 아닙니다. GPU는 학습과 추론 모두에서 확장이 잘 되며 기술적 진입 장벽은 낮습니다. FPGA 설계는 깊은 하드웨어 전문 지식을 필요로 합니다." – stevefan1999

"모든 연결이 하나의 스트림을 공유하고 있는데, 2,000개 연결 스윕이 일정하게 유지될 줄은 몰랐습니다. 사용자당 지연 시간은 어떻게 되나요?" – haeseong

"개념적으로는 멋진 아이디어입니다. 실제로는 결과가 import random; print(random.choice(list(my_dict)))만큼 일관성이 없어 보이는데... 이렇게 작은 모델이 실질적인 용도가 있을까요?" – serf

"정말 멋진 프로젝트입니다. LLM 추론의 미래가 어떨지 궁금하네요... 더 큰 모델을 위해서는 새로운 메모리 기술이 필요할 수도 있겠습니다." – variadix

이러한 댓글들은 원시 속도와 모델 품질 사이의 트레이드오프, FPGA 개발의 가파른 학습 곡선, 그리고 온칩 메모리 혁신이 미래의 LLM 추론을 어떻게 형성할 것인가에 대한 광범위한 질문을 강조합니다.

재현 방법

Verilog RTL, Keviniser 전처리 스크립트, INT4 양자화된 TinyStories 모델 및 서빙 스택을 포함한 전체 소스 코드는 **github.com/MichaelAyles/kev-gpt**에서 확인할 수 있습니다. 빌드 흐름은 20코어 i7에서 Xilinx Vivado CLI를 사용하며, 전체 합성, 배치 및 라우팅(place-and-route), 비트스트림 생성에는 약 30분이 소요됩니다.

결론

저가형 FPGA의 온칩 SRAM에 소형 INT4 LLM을 완전히 저장하면 DDR 대역폭 벽을 제거하여 측정된 60k tokens/s의 총 처리량을 얻을 수 있으며, 단일 스트림 전체 컨텍스트 구성으로도 부하가 많은 상황에서 여전히 사용 가능한 ~21k tokens/s를 제공합니다. 이 실험은 예산에 관계없이 온칩 가중치 저장이 메모리 예산 내에 들어오는 모델의 추론 속도를 극적으로 가속화할 수 있다는 핵심 가설을 검증합니다.

Sources

관련

  • Dispatch
  • 프로젝트
  • Dispatch
  • Dispatch
  • Dispatch