곰이 춤을 추다: RTX 3090 한 대로 3주간 구동한 Qwen 27B
The bear can dance: Qwen 3.8 27B on one 3090 for 3 weeks
핵심 요약
RTX 3090 한 대에서 3주간 자율 에이전트 루프를 통해 CUDA 추론 엔진을 개발한 실험기입니다.
- 자율 에이전트 루프 — RTX 3090 한 대에서 3주 동안 스스로 CUDA 커널을 작성하고 벤치마킹함
- 리소스 경쟁 문제 — 에이전트 구동용 vLLM과 테스트용 엔진이 GPU를 공유하며 발생하는 '자살 루프' 해결
- 성능 결과 — llama.cpp 대비 prefill 성능은 절반 수준이나, 장기간 목표를 유지하며 실제 코드를 생성함
- 오픈 소스 공유 — 실험에 사용된 프로토콜과 에이전트 규칙, 벤치마크 데이터를 허깅페이스에 공개함
세 줄 요약: 로컬 에이전트 루프, 약 21일 소요, RTX 3090 한 장 사용. 과제는 대충 *"이 GPU 아키텍처에 최적화된 CUDA 추론 엔진을 직접 만들어라"*였음. 커널이랑 벤치마크까지는 뽑아냈는데, llama.cpp를 이기진 못함. 사람이 개입한 메시지는 12번 정도. 압축(Compaction)에만 83시간 날림.
옛날 농담: 곰이 춤을 얼마나 잘 추는지 따지지 마라, 곰이 춤을 춘다는 사실 자체에 놀라야 한다.
세팅: Qwen 3.8 27B Q4, Q8 KV, 200k 컨텍스트, deepseek 하네스, 규칙집 작성: 역할, 업무 인수인계, 나를 호출할 타이밍, llama.cpp 베끼지 말 것, 혼자서 불가능하다고 징징대지 말 것. 난 CUDA 코드 못 짬. 힌트는 대충 "llama.cpp는 이 카드로 prefill 700 정도 나오는데 넌 250이 뭐냐, 좀 더 분발해라" 수준이었음.
실행: 며칠 동안은 그냥 방치하다가 규칙에 따라 보고하게 함. 6일 차쯤 되니까 커널 몇 개 뽑아내고 prefill은 250 tps 근처에서 고착됨; 나중에도 똑같았음. 멈추는 건 대부분 프로토콜 때문이지 모델이 딴짓해서 그런 게 아님. 프로토콜만 좀 더 잘 짜면 이거 무한으로 돌릴 수도 있을 듯.
자살 루프: 같은 3090 한 장으로 에이전트(vLLM)도 돌리고 테스트할 엔진도 돌려야 함. 둘 다 GPU 풀로 땡기려고 함. vLLM 잘못 끄면 에이전트 다 뒤지고, 벤치마크 돌릴 때 켜두면 OOM(메모리 부족) 터짐. 규칙집에는 고정된 인수인계 스크립트가 있음: vLLM 끄고, 벤치 돌리고, vLLM 켜고, 정상 작동할 때까지 상태 확인하고, STATE 기록하기. 근데 서브 워커 하나가 이걸 선택 사항으로 생각했는지, 정해진 시간 외에 vLLM을 계속 꺼버려서 오케스트레이터를 박살 내고, 또 똑같은 짓을 반복함. 자기를 돌리는 뇌를 스스로 꺼버리는 꼴. 하네스도 한 번 하드 크래시 나서 내가 직접 재시작함. 이건 락(lock) 걸고 "vllm.sh는 이 역할만 건드릴 수 있음" 식으로 프로토콜 다듬으면 해결됨.
로컬 세금: 서브 에이전트 180개, 입출력 토큰 약 2억 3천만 개, 캐시 읽기 약 17억 개. 압축 699번, 압축에만 약 83시간 소요(전체 시간의 약 17%). 보통 16만 토큰 넘는 프롬프트 압축하는 데 7분 정도 걸림.
Prefill 성능은 같은 카드에서 llama.cpp의 절반 정도 나옴. 그래도 소비자용 장비에서 몇 주 동안 일관성 있게 목표를 수행했고, 작동하는 커널이랑 벤치마크, 노트, 긴 git 기록까지 남겼음. 로컬(심지어 양자화된!) 27B 모델이 이 정도로 긴 시간 동안 실제 엔지니어링 목표를 붙잡고 있었다는 것만으로도 난 만족함. 우아한 발레리나는 아니지만, 이 곰 새끼 춤추는 거 보면 진짜 지린다!
덤프 + 규칙 (~15 GB):
https://huggingface.co/datasets/skeole/qwen-cpp-agent-0-protocol
백엔드:
https://github.com/syv-ai/HyperQwen (u/iamMess의 엄청난 작업물)


