AI가 자체 추론 하드웨어를 개발할 수 있게 되다
요약
openTPU는 AI 에이전트가 하드웨어 설계에 참여하여 자체 추론 가속기를 개발할 수 있음을 보여주는 오픈 소스 프로젝트입니다. 이 시스템은 SystemVerilog, 명령어 세트, 커널 언어 등 전 과정을 포함하며, 실제 PCIe 카드에서 최신 모델들을 구동하는 성능을 입증했습니다.
핵심 포인트
- AI 에이전트를 활용한 하드웨어 설계 가능성 제시
- SystemVerilog부터 호스트 소프트웨어까지 전체 스택 공개
- 실제 FPGA 카드를 이용해 여러 LLM의 추론 가속기 구현
- Gemma 4 등 최신 모델에서 높은 디코딩 성능 측정
openTPU
AI가 개발한 오픈 소스 AI 가속기입니다.
openTPU는 auto-arch-tournament의 교훈을 AI 가속기에 적용합니다. 이 프로젝트는 두 가지 질문을 던집니다: AI 에이전트는 하드웨어 설계에서 얼마나 멀리 갈 수 있는가, 그리고 스스로 추론을 실행하는 칩을 만들 수 있는가?

otpu-chat이 FPGA 카드(왼쪽)에서 LFM2.5-230M을 실행하고 있으며, otpu-smi는 카드의 활용률과 DRAM 대역폭을 보여줍니다(오른쪽).
학습할 수 있는 장소
openTPU는 또한 학습 프로젝트입니다. 전체 가속기는 하나의 작은 모노레포에 존재하며, 여기서 끝까지 읽어볼 수 있습니다: 하드웨어 설계(SystemVerilog), 명령어 세트, 비트 단위 시뮬레이터, 커널 언어와 그 컴파일러, 그리고 실제 PCIe 카드를 구동하는 호스트 소프트웨어입니다. 만약 Python의 matmul부터 와이어 레벨까지 AI 가속기가 어떻게 작동하는지 이해하고 싶다면, 이곳이 시작하기 좋은 곳입니다.
결과
이 설계는 Inspur YPCB-00338 카드(Xilinx Kintex-7 xc7k480t, DDR3 채널 2개)에서 실제 가중치를 가진 열 가지 최신 모델을 실행하며, 카드는 시뮬레이터와 비트 단위로 동일한 토큰을 생성합니다.
| Model | Weights | Decode, device | Decode, wall | Prefill, device | DRAM while decoding |
|---|---|---|---|---|---|
| LFM2.5-230M | int8 | 59.0 tok/s | 52.3 tok/s | 295.6 tok/s | 14.5 GB/s (85% of peak) |
| ... | |||||
*측정된 내용: 2026-09-29에 생산 이미지 deploy_champ_e698dcd7로 측정된 상위 세 가지 모델은 LFM2-2.6B, SmolLM3-3B 및 Phi-4-mini입니다. 그리고 2026-09-30에는 Qwen3.5-2B와 4B, 2026-10-01에는 Gemma 4를 빌드 B로 측정했으며, 이 이미지는 이후부터 생산에 사용되었습니다. | |||||
| 빌드 B는 e698dcd7보다 LFM2-2.6B, SmolLM3 및 Phi-4-mini에서 각각 8 |
- 이미지: 메인 e698dcd는 133.33 MHz에서 작동하며, 모든 모델에 대해 하나의 비트스트림을 가집니다. 이에는 메모리 코어 내부의 작은 CPU가 보정하는 LiteDRAM 컨트롤러, 4열 시스톨릭 매트릭스 유닛 및 스트림 엔진(docs/stream.md)이 포함되어 있습니다. DDR3-1066이며 피크는 17.1 GB/s입니다.
- 호스트: 카드는 opentpu (Intel Core i7-4790)에 장착됩니다.
- *방법,
tools/qual/perf.py: 디코딩은 512 토큰 프롬프트 이후의 64개 그리디(greedy) 토큰을 사용하며, 루프 내에서 호스트의 argmax를 사용합니다 (스트리밍 아님).
카드 자체 디코드 루프에서 (카드가 토큰을 하나씩 선택하는 방식) Gemma 4가 더 빠르게 디코드합니다: E2B
11.01 / 12.73 tok/s (int8 / 4-bit head), E4B 3.83 tok/s, 장치에서 측정.*
- 모든 구성은 시뮬레이터 토큰과 위치별로, 그리고 상주 디코드 프로그램으로 일치합니다. 자세한 내용은 docs/board.md를 참조하십시오.
카드가 실행되는 동안 로짓(logits)이 스트리밍되어 돌아올 때 (tools/decode_profile.py, 96 토큰), 4-bit 디코드가 장치 / 벽 시간 tok/s로 더 빠릅니다:
- LFM2: 89.5 / 84.5;
- Qwen3: 33.7 / 33.3;
- Qwen3.5: 24.6 / 24.2;
- LFM2-2.6B: 11.07 / 11.02 (build B);
- SmolLM3-3B: 8.92 / 8.89 (build B);
- Phi-4-mini: 6.69 / 6.67 (build B).
이전 프로덕션 이미지인 se-cand3는 Xilinx MIG, 두 개의 컬럼 매트릭스 유닛 및 120.755 MHz 클럭으로 빌드되었습니다. 동일한 방식으로 측정한 새로운 이미지는 다음과 같습니다:
- 디코드: 모든 구성에서 se-cand3의 성능과 2.3% 이내입니다. 디코드는 DRAM에 의해 제한되며, LiteDRAM은 MIG가 했던 것처럼 DDR3 피크의 82-85%로 읽어옵니다.
- 프리필(prefill): 1.3배 (Qwen3.5)에서 2.0배 (LFM2 4-bit) 더 빠릅니다.
- 캘리브레이션(calibration): 이미지가 시작될 때, 코어의 CPU는 호스트 개입 없이 DDR3 채널 두 개를 12초 만에 캘리브레이션합니다.
이전 이미지와 그 수치는 docs/board.md의 섹션 5에 있습니다.
Mixture-of-experts (MoE) 모델은 카드 용량 4 GiB보다 큰 크기임에도 불구하고, 전문가(expert)들을 호스트 스토리지에서 스트리밍하여 구동됩니다 (docs/offload.md, 섹션 10). 카드는 토큰마다 각 전문가를 라우팅하고 계산하며, 이 전문가들은 DRAM의 레이어별 슬롯에 유지됩니다. 호스트는 링크 속도(section 10.1)로 누락된 전문가들만 풀 파일에서 해당 슬롯으로 복사합니다. 2026-10-01일자 빌드 B (79c5707a) 기준으로 측정했을 때, 카드가 자체 디코딩 루프를 통해 모든 토큰을 처리하고, 4비트 전문가와 int8 헤드를 사용한 결과는 다음과 같습니다:
- LFM2.5-8B-A1B (파라미터 8.5B, 활성 파라미터 1.7B): 160개 토큰 동안 10.6 tok/s를 기록했습니다. 전문가 사용량의 98.5%가 슬롯에 도달했으며, 토큰당 5.2 MB가 스트리밍되었습니다.
- Qwen3.5-35B-A3B (파라미터 34.7B, 활성 파라미터 3.0B): Hugging Face의 16개 그리디 토큰을 사용하여 3.95 tok/s를 기록했습니다. 전문가 사용량의 62%가 도달했으며, PCIe를 통해 토큰당 153 MB(1.41 GB/s)가 스트리밍되었습니다 (section 10.3).
- 두 모델 모두 시뮬레이터와 비트 단위로 일치합니다.
4비트 가중치(docs/quant.md)는 FP4 값을 사용하며 이중 레벨 블록 스케일링을 통해 가중치당 4.25비트를 사용하고, 정확도를 위해 LM 헤드는 int8로 유지합니다. 이를 통해 토큰당 바이트 수를 약 3분의 1 줄이고 디코딩 속도는 40%(Qwen3.5)에서 최대 45%(Qwen3, LFM2)까지 향상되었으며, 이는 docs/quant.md에 보고된 모델별 퍼플렉서티(perplexity) 비용이 발생합니다.
호스트의 개입은 거의 사라졌습니다. LFM2와 Qwen3의 경우 카드는 한 번 컴파일된 디코딩 프로그램을 실행하여, 레지스터에서 위치를 읽고 자체 임베딩 및 RoPE 행을 조회하며, 카드가 계속 작동하는 동안 로짓(logits)이 스트리밍됩니다: 호스트는 omarchy에서 토큰당 0.170.30 ms를, opentpu에서는 0.451.3 ms를 추가합니다.
Qwen3.5의 경우 디코딩에 대해 동일하게 작동하며, 프리필(prefill) 단계에서도 여전히 호스트에서 각 청크의 프로그램을 컴파일합니다.
작동 방식
Kernels in ol mlp, attention, full model layers
| @ol.jit
Language + compiler layouts, affine loop addressing, fusion
...
이 장치는 의도적으로 단순합니다. 시퀀서가 사이클당 몇 개의 유닛에 하나의 명령을 내립니다: DMA는 데이터를 이동시키고, 행렬 유닛은 DRAM에서 스트리밍되는 int8 가중치를 곱하며, 벡터 유닛은 fp32 연산을 수행하고, 양자화기(quantizer)는 결과를 다시 int8로 변환합니다. 캐시나 숨겨진 스케줄링이 없습니다: 모든 데이터 이동이 명령이기 때문에 추적(trace)을 통해 사이클이 정확히 어디에 쓰이는지 알 수 있습니다. docs/isa.md에서 전체 명령어 세트(instruction set)를 설명합니다.
커널은 다음과 같습니다:
from opentpu import language as ol
@ol.jit
...
모든 데이터 이동이 명령이기 때문에, 실행의 추적은 그 속도를 설명해 줍니다. 프로파일러인 Lens는 RTL(Register Transfer Level), 시뮬레이터 또는 카드로부터 실행을 기록하고 브라우저에서 열어주며, 루프라인(roofline), 타임라인(timeline) 및 명령어별 테이블(docs/lens.md)을 제공합니다.

Lens가 Qwen3 디코드 단계의 일부를 재현하는 모습입니다. 색상은 각 유닛이 매 사이클마다 무엇을 하고 있는지 보여줍니다: 바쁨(busy), DRAM 대기, 또는 다른 명령 대기.
사용해 보기
카드 외의 모든 것은 노트북에서 실행됩니다.
pip install -e .
pip install pytest torch transformers
python3 -m pytest -q # RTL 테스트에는 Verilator 5도 필요합니다
...
카드가 있다면, 비트스트림을 빌드(boards/ypcb-00338에서 make bit)하고 JTAG를 통해 로드한 다음, sudo otpu-setup 및 otpu-chat --backend board를 실행합니다. docs/board.md에서 초기 설정(bring-up) 과정을 안내합니다.
| 명령어 | 기능 |
|---|---|
otpu-chat | Qwen3-0.6B, LFM2.5-230M (--model lfm2), Qwen3.5-0.8B (--model qwen35), LFM2-2.6B (lfm2-2.6b), SmolLM3-3B (smollm3), Phi-4-mini (phi4-mini) 또는 Qwen3.5-2B / 4B (qwen35-2b, qwen35-4b)와 채팅합니다 |
| ... |
읽기 시작할 곳
- docs/isa.md: 명령어 집합(instruction set). 다른 모든 것은 이것을 기반으로 구축됩니다.
opentpu/kernels와 docs/compiler.md: 커널이 어떻게 명령어로 변환되는지.opentpu/isasim.py: 사양(spec)인 시뮬레이터.rtl/:rtl/top/otpu_top.sv부터 시작하는 하드웨어.- docs/lfm2.md, docs/qwen35.md, docs/llama.md, docs/benchmarks.md: 전체 모델과 그 사이클이 어디에 사용되는지.
- docs/board.md: 클럭부터 PCIe까지 물리적인 카드.
향후 계획 (What's next)
- DRAM의 마지막 몇 퍼센트. 디코딩(Decode)은 DRAM 효율성에 의해 제한됩니다. DDR3-1066 피크의 82%에서 85%를 읽습니다. LiteDRAM 경로의 효율성 개선 작업이 진행 중입니다.
- 타이밍 마진 및 면적. 설계는 128바이트 포트가 두 개의 DDR3 채널과 일치하는 클럭인 133.33 MHz에서 완료되지만, 간신히(WNS +0.032 ns) 그 수준입니다. Vivado 토너먼트는 여전히 마진과 면적에 대해 작업하고 있습니다. 디코딩은 DRAM에 의해 제한되므로, 더 빠른 클럭은 주로 프리필(prefill)에 도움이 됩니다.
- 더 빠른 프리필. 4열 시스토릭 매트릭스 유닛(systolic matrix unit)은 프로덕션 이미지에 포함되어 있으며, 프리필은 여전히 이 매트릭스 유닛의 곱셈 속도(multiply rate)에 의해 제한됩니다.
기여 (Contributing)
이슈 및 풀 리퀘스트를 환영하며, 대부분의 작업은 FPGA가 아닌 Python과 Verilator만 필요합니다. ISA, 시뮬레이터 또는 RTL을 변경할 때는 python3 -m pytest -q가 통과해야 하며, 성능 주장은 어떻게 측정되었는지 명시해야 합니다.
라이선스 (License)
Apache License 2.0. LICENSE를 참조하십시오.
AI 자동 생성 콘텐츠
본 콘텐츠는 HN AI Posts의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기