I wrote a custom CUDA inference engine to run Qwen3.5-27B on $130 mining cards
개요
중고 채굴용 NVIDIA CMP 100-210 그래픽 카드 4개를 활용하여 Qwen3.5-27B 모델을 CUDA 추론 엔진으로 구동하는 방법을 상세히 설명합니다.
주요 내용
* 하드웨어 제약 및 우회: 중고 CMP 100-210 카드(GV100 기반, 16GB HBM2) 4개를 저렴하게 구매했지만, NVIDIA가 하드웨어적으로 텐서 코어를 64배 스로틀링하고 NVLink, P2P 등을 비활성화하여 표준 LLM 추론 스택(vLLM, llama.cpp 등) 사용이 불가능함을 확인했습니다.
* 새로운 CUDA 추론 엔진 "qengine" 개발: NVIDIA가 텐서 코어만 스로틀링하고 DP4A (int8) 및 HFMA2 (fp16) 경로는 정상 속도를 유지하는 점을 활용하여, scratch부터 Qwen3.5/3.6 모델을 위한 CUDA 추론 엔진 "qengine"을 개발했습니다.
* qengine의 특징:
* 커널 최적화: prefill을 위한 DP4A 기반 Q8_0 GEMM 타일 경로, 융합된 FlashAttention 커널, 긴 컨텍스트 처리를 위한 Split-K FlashAttention 등을 포함합니다.
* 메모리 효율성: 3비트 Walsh-Hadamard + Lloyd-Max KV 캐시를 사용하여 27B 모델로 256K 컨텍스트를 3개의 16GB 카드에 저장합니다.
* API 제공: OpenAI 호환 HTTP API를 통해 스트리밍, 툴 호출, 비전, 연속 배치, 슬롯별 접두사 캐싱 기능을 지원합니다.
* 하드웨어 특화: sm_70 (Volta) 아키텍처를 특정하여 CMP 카드 제약에 맞춰 재작성되었습니다.
* 벤치마크 결과: llama.cpp와 비교 시, qengine은 Qwen3.5-9B 모델에서 토큰당 생성 속도에서 상당한 성능 향상(48-51%)을 보였으며, 특히 긴 컨텍스트(1.16K, 4.62K)에서 prefill 속도가 더 빨랐습니다. 27B 모델에서도 유사한 성능 우위를 보였습니다.
* 구현 난이도: Multi-GPU 환경에서 P2P/NVLink 부재로 인한 데이터 전송 병목 현상, 한국어 출력의 숫자 드리프트 문제 해결, Split-K FlashAttention의 결정론적 동작 유지 등이 주요 기술적 과제였습니다.
* 적합한 사용 사례: RTX 30/40 시리즈, A100, H100과 같은 고성능 GPU 사용자에게는 vLLM 또는 SGLang 사용을 권장하며, qengine은 CMP 100-210, 구형 V100, T4, RTX 20 시리즈 등 표준 스택에 만족하지 못하는 사용자에게 적합합니다.
시사점
이 프로젝트는 하드웨어 제약을 극복하기 위한 맞춤형 CUDA 엔진 개발의 가능성을 보여주며, 저렴한 중고 하드웨어에서도 특정 LLM 모델의 효율적인 추론이 가능함을 입증합니다.
댓글
GitHub Discussions