qwen38-27b-rtx3090

Local AI RunnersCLIPython

★ 1,326주당 +174조회 4

무엇인가

Qwen3.8-27B를 24GB 소비자용 GPU 한 장에서 vLLM으로 서빙하기 위한 설정 묶음이다. 모델이나 추론 엔진 자체가 아니라, vLLM에 적용하는 패치와 재양자화 스크립트, 실행 프로파일, 벤치마크 하네스로 이뤄진다. 로컬 추론 서버를 직접 세우는 자리에 해당하며, 150k~262k 토큰 컨텍스트와 키 인증이 붙은 OpenAI 호환 API를 목표로 한다.

어떻게 동작하나

배포는 ghcr.io에 커밋마다 빌드되는 Docker 이미지로 이뤄진다. 빌드 단계에서 patches/ 디렉터리의 패치를 모두 적용하고 verify.sh를 게이트로 실행한다. 첫 기동 시 9.5GB 이미지를 받고, 모델을 내려받아 약 20GB로 재양자화해 ./models에 저장한 뒤 18020 포트로 서빙한다. 양자화는 int8 텐서코어 GEMM, fp16 DeltaNet 리커런트 상태, 자체 출력으로 만든 드래프트 보캐뷰, 보정된 int4 lm_head, split-KV verify 어텐션으로 구성된다. 실행 모드는 batch와 SPEC=dflash2 두 가지이며, 후자는 Qwen의 MTP 헤드를 DFlash2 블록 드래프터로 교체해 한 번에 7토큰을 제안한다. DFLASH_TOKENS=15를 주면 타깃이 한 스텝에 16토큰을 검증하고, 남는 위치는 요청 자체의 컨텍스트에서 채운다. PREFIX_CACHE=1은 이미 보낸 문서의 어텐션 KV와 리커런트 상태를 유지한다.

무엇과 다른가

순수 vLLM과의 차이는 커널과 드래프터 계층에 있다. int8 GEMM, int4 lm_head, split-KV verify 어텐션은 patches/로 주입되고, 추측 디코딩은 MTP 대신 DFlash2 드래프터를 쓴다. 추측 디코딩은 짧은 프롬프트에서 동시 사용자 약 8명 이하일 때 배치 처리보다 빠르고, 그 위에서는 일반 배칭이 앞선다. 긴 독립 세션에서는 추측 요청이 리커런트 상태 페이지를 예약하기 때문에 교차점이 훨씬 앞당겨진다. 모든 경로는 손실 없이 동작한다.

어떻게 쓰나

실행은 이미지 이름 뒤에 모드를 붙이는 한 줄 Docker 명령으로 시작한다. .env의 값은 -e 플래그로 그대로 옮겨진다. API 키는 .env 또는 api_key.txt에서 읽고, 서버는 기본적으로 0.0.0.0에서 인증 없이 대기한다. Docker Desktop이 WSL2를 쓰면 .env의 VLLM_WSL2_ENABLE_PIN_MEMORY=1을 켜야 V2 러너가 UVA 오류로 중단되지 않는다. venv에 직접 설치하는 경로도 같은 단계를 밟는다: 모델 다운로드, 재양자화, vLLM 패치 적용, verify.sh 실행. 벤치마크는 bench/run_benchmarks.sh와 bench/labd_bench.py로 재현한다.

전제와 한계

전제는 단일 24GB GPU와 Docker다. 한 GPU는 한 번에 한 모드만 서빙한다. 이 브랜치는 vLLM 0.28.0을 고정한다. DFLASH_TOKENS=15는 채팅에서 이득이 1% 수준인 대신 요청 슬롯을 절반으로 줄이고 컨텍스트 8k를 소모한다. 16토큰 검증 블록은 상주 요청마다 리커런트 상태 페이지를 0.88GiB에서 1.66GiB로 늘린다. 공개된 처리량 수치는 250W 전력 제한과 vllm bench serve 하네스 기준이므로 다른 출력 길이의 클라이언트와 직접 비교할 수 없다.

관련 논문 4

유사 도구