목표와 최종 결과
RTX 4090 환경에서 Gemma 4 12B Q4 checkpoint를 vLLM OpenAI-compatible API로 실행했다. container 8000 port는 이미 host에서 사용 중인 8000과 충돌하지 않게 host 8100으로 매핑했다.
| 항목 | 최종 확인값 |
|---|---|
| image | vllm/vllm-openai@v0.24.0 |
| vLLM | 0.24.0 |
| model | google/gemma-4-12B-it-qat-w4a16-ct |
| served model | gemma-4-12b-q4 |
| network | host 8100 → container 8000 |
| API | /v1/models, /v1/chat/completions, /metrics 성공 |
Chat API는 GPU 추론 성공.을 반환했고, response의 system_fingerprint는 vllm-0.24.0-583965f1이었다. metrics에서는 vllm:prompt_tokens_total=26을 확인했다.
1. Gemma 4 architecture를 인식하지 못한 문제
초기에 사용한 vllm/vllm-openai:gemma4 image digest는 다음과 같았다.
sha256:952594c2e6ded02be6e3f195eb95d5a50c5f2a44a879427b2f77c32e0a732a79이 image에서 checkpoint의 gemma4_unified architecture를 Transformers가 인식하지 못했다.
The checkpoint you are trying to load has model type `gemma4_unified`
but Transformers does not recognize this architecture.이는 checkpoint 문제가 아니라 container 안의 vLLM/Transformers 조합이 Gemma 4에 충분히 최신이 아니었던 문제였다. v0.24.0 image digest로 교체한 뒤 model loading과 API 요청이 성공했다.
2. vLLM argument 형식 오류
vllm serve는 model을 --model option보다 positional argument로 전달하도록 안내한다. 또한 아래 형식은 JSON이 아니어서 실패했다.
--limit-mm-per-prompt image=0,audio=0오류:
Value image=0,audio=0 cannot be converted to <function loads ...>수정한 핵심은 다음과 같다.
vllm/vllm-openai@sha256:251eba5cc7c12fed0b75da22a9240e582b1c9e39f6fbc064f86781b963bd814f \
google/gemma-4-12B-it-qat-w4a16-ct \
--served-model-name gemma-4-12b-q4 \
--limit-mm-per-prompt '{"image": 0, "audio": 0}'--limit-mm-per-prompt는 요청 하나에 허용할 멀티모달 입력 수를 제한한다. 이번 text-only 검증에서는 image와 audio를 모두 0으로 제한했다. 값은 JSON object여야 한다.
3. shared memory와 port 이해
--ipc=host는 container가 host IPC namespace를 공유하도록 한다. 따라서 /dev/shm 용량을 따로 지정하는 --shm-size=16g는 이 실행 명령에서는 필요하지 않았다.
--ipc=host \
-p 8100:8000-p 8100:8000은 host의 8100 요청을 container의 vLLM 기본 port 8000으로 전달한다. host 8000은 별도 서비스가 사용 중이라 바꾸지 않았다.
4. GPU 검증과 docker ps 해석
nvidia-smi가 정상 출력됐고, API·metrics 검증도 통과했다. WSL2에서 아래 조회가 비어 있을 수 있으므로 Step 1 통과 기준으로 사용하지 않았다.
nvidia-smi --query-compute-apps=pid,process_name,used_gpu_memory --format=csvdocker ps는 Docker container만 표시한다. k3s는 WSL systemd service이므로 여기에 나오지 않는 것이 정상이다. direct vLLM container도 --rm으로 종료됐다면 목록이 비어 있을 수 있다.
재현 명령과 검증
실행 명령과 세부 통과 기준은 GemmaForge Step 1 Runbook에 유지한다.
curl -fsS http://127.0.0.1:8100/v1/models | jq
curl -fsS http://127.0.0.1:8100/metrics | grep -E '^vllm:' | head -n 30
nvidia-smi다음 단계
Docker GPU API 검증은 통과했다. 다음 기록은 Step 2 k3s 설치 트러블슈팅이며, GPU runtime과 CUDA Pod 검증은 아직 진행 중이다.