264KB diffusion model, FPGA를 붙이자 3배 느려진 이유

264KB SRAM을 가진 보드에서 diffusion model이 32×32 pixel 이미지를 만든다. 더 흥미로운 결과는 FPGA 가속을 붙인 뒤였다. RP2040 MCU만 쓸 때 한 장에 74초가 걸렸지만, FPGA MAC unit 하나를 쓰면 약 140초, 두 개를 쓰면 220초로 느려졌다. 병렬 계산 장치가 늘수록 전체 inference가 악화된 셈이다.

Sir Pixelot은 Shrike Lite 보드의 RP2040과 ForgeFPGA를 함께 사용한다. 개발자는 multiply-accumulate 연산을 FPGA로 옮기고, hard DSP block이나 BRAM 없이 LUT만으로 두 개의 INT8 MAC channel을 만들었다. 계산 core 자체는 병렬로 동작한다. 문제는 weight와 activation을 보관할 FPGA 내부 memory가 거의 없다는 점이었다.

모든 operand를 RP2040에서 FPGA로 계속 보내야 했고, 통신은 software로 구현한 bit-banged SPI에 의존했다. 133MHz CPU는 byte를 전송할 때마다 지연 loop에서 멈췄다. FPGA가 곱셈과 누산을 빨리 끝내더라도 다음 data가 도착할 때까지 기다리는 시간이 더 길었다. 두 번째 MAC unit은 계산량을 나눴지만 bus traffic과 전송 대기를 줄이지 못했다.

여기서 중요한 값은 MAC unit의 단독 처리 속도가 아니라 arithmetic intensity다. 한 번 전송한 weight로 얼마나 많은 계산을 반복할 수 있는지가 낮으면 bus 비용이 이득을 삼킨다. 작은 FPGA에 cache나 충분한 on-chip memory가 없었던 탓에 같은 종류의 data가 계속 선을 오갔다. 가속기가 쉬는 시간이 늘면서 병렬화의 장점도 사라졌다.

이 결과는 accelerator benchmark를 볼 때 연산 처리량만 확인하면 안 되는 이유를 보여준다. model weight를 가까운 memory에 cache할 수 있는지, activation을 재사용하는지, host와 accelerator 사이 link가 충분한지가 실제 latency를 결정한다. 프로젝트가 제안한 다음 단계도 이 부분에 집중한다. RP2040의 PIO와 DMA로 serial 통신을 hardware 처리하고, FPGA에 4~8개 항목의 작은 register file을 넣어 weight를 재사용하는 방안이다.

INT8 quantization과 제한된 activation 정밀도는 생성 이미지에도 흔적을 남겼다. 결과에는 noise가 많지만, 목표는 고품질 이미지 제품이 아니라 극단적으로 작은 hardware에서 end-to-end 생성 pipeline이 실제로 도는지 확인하는 데 있었다. 저가 보드에서 기능하는 inference core를 완성한 동시에, 계산보다 data 이동이 더 비싸다는 교훈을 얻었다.

이 게시물의 `created_utc`는 2026년 8월 18일 09:26:21 UTC로 RSS에서 검증됐다. JSON endpoint에서 score를 확인할 수 없어 인기 점수 대신 기술 자료의 구체성과 재현 가능한 benchmark를 기준으로 골랐다. 작은 실패가 hardware AI의 병목을 선명하게 보여준 사례다.

전체 case study · Reddit 게시물