2x 3090에서 NVIDIA-Nemotron-Labs-3-Puzzle-75B-A9B 구동
요약
2개의 RTX 3090 GPU 환경에서 NVIDIA Nemotron-Labs-3-Puzzle-75B-A9B 모델을 262k 컨텍스트 길이로 구동하는 데 성공한 사례를 공유합니다. 양자화 모델과 vLLM, 특정 PyTorch 설정 및 CUDA 그래프 최적화를 통해 메모리 파편화 문제를 해결하고 성능을 극대화했습니다.
핵심 포인트
- 2x RTX 3090에서 262k 컨텍스트 길이 구동 성공
- W4A16 양자화 모델을 통한 메모리 효율성 확보
- PyTorch CUDA 할당 설정을 통한 메모리 파편화 해결
- PIECEWISE CUDA 그래프 적용으로 디코딩 속도 대폭 향상
저는 2x 3090에서 전체 262k 컨텍스트 길이(ctx)와 N=4 설정으로 이 모델을 구동하는 데 성공했습니다. 혹시 시도해보고 싶은 분이 계시다면, 이 양자화(quant) 모델 덕분입니다: https://huggingface.co/danielrmay/NVIDIA-Nemotron-Labs-3-Puzzle-75B-A9B-W4A16
2× RTX 3090 상의 Nemotron-Labs-3-Puzzle-75B-A9B (W4A16) — vLLM, CPU 오프로드(offload) 없음, 전체 262K, N=4
하드웨어: 2× RTX 3090 (SM 8.6), PCIe Gen4 ×8, NVLink 없음, aikitoria BAR1-P2P 패치된 드라이버 활성화.
엔진: vllm/vllm-openai:cu129-nightly dev1060 (9e57de71).
모델: danielrmay/NVIDIA-Nemotron-Labs-3-Puzzle-75B-A9B-W4A16 ( https://huggingface.co/danielrmay/NVIDIA-Nemotron-Labs-3-Puzzle-75B-A9B-W4A16 ) (compressed-tensors: INT4 experts / INT8 shared+mamba / BF16 attn+latent+router+embed+lm_head, MTP 제거됨, 41.48 GiB).
docker run -d --name vllm-puzzle --gpus '"device=0,1"' --ipc=host --network=host --ulimit memlock=-1 --ulimit stack=67108864 -e CUDA_DEVICE_ORDER=PCI_BUS_ID -e VLLM_NO_USAGE_STATS=1 -e VLLM_USE_FLASHINFER_SAMPLER=0 -e VLLM_ATTENTION_BACKEND=TRITON_ATTN -e VLLM_SKIP_P2P_CHECK=1 -e PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.6,max_split_size_mb:128 -v /path/to/puzzle-w4a16:/model:ro --entrypoint vllm vllm/vllm-openai:cu129-nightly-x86_64 serve /model --served-model-name puzzle-w4a16 --host 0.0.0.0 --port 8000 --trust-remote-code --tensor-parallel-size 2 --enable-expert-parallel --kv-cache-dtype int8_per_token_head --mamba-backend triton --kv-cache-memory-bytes 680000000 --gpu-memory-utilization 0.965 --max-num-seqs 4 --max-num-batched-tokens 1024 --max-model-len 262144 --compilation-config '{"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[1,2,4]}' --reasoning-parser nemotron_v3 --tool-call-parser qwen3_coder --enable-auto-tool-choice
PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.6,max_split_size_mb:128 — 돌파구입니다. expandable_segments:True가 해결하지 못했던, 예약되었으나 할당되지 않은 약 1.07 GiB의 파편화(fragmentation)를 회수하고 두 랭크(ranks)의 균형을 재조정합니다. 다른 모든 것을 위한 전제 조건입니다.
(expandable_segments와 달리 custom-all-reduce IPC 핸들도 작동하게 합니다.) PIECEWISE CUDA 그래프 — 가장 큰 디코딩 레버 (27.9 eager → 88+ tok/s). 88개 레이어의 하이브리드 구조에서 Eager Python 디스패치(dispatch)가 실제 N=1 병목(bottleneck)이었으며, TP all-reduce가 아니었습니다. splitting_ops는 mamba/attention을 eager 상태로 유지하며, MoE/MLP 서브그래프(subgraphs)만 캡처합니다 (~수십 MiB). FULL 그래프는 실제 24 GB에 들어가지 않지만, PIECEWISE는 가능합니다. 캡처 크기는 max-num-seqs를 커버해야 하며 (N=4의 경우 [1,2,4]), 그렇지 않으면 N≥3 디코딩이 조용히 eager 방식으로 저하됩니다. custom-all-reduce ON (aikitoria BAR1 P2P 및 GC 할당기를 통한 기본값): +8% N=1 / +6% N=4. 이는 TP all-reduce(8개 attn + 40개 mamba 레이어)만 가속화하며, EP MoE all-to-all은 PyNCCL 상태로 유지된다는 점에 유의하세요. 측정값 (시뮬레이션이 아닌 실제 3090 사용): N=1 디코딩 93.8 tok/s, 프리필(prefill) ~3660 tok/s (4-8K 컨텍스트 기준), N=4 합계 255 tok/s (스트림당 69), TTFT p50 0.61s, 프리엠션(preempt) 0회/OOM 0회, Full 262K 컨텍스트 (int8 KV 풀 278K 토큰), GPU 바닥(floor) 267/287 MiB, 52K needle recall PASS; 847×293=248171, "all but 9"=9, /u/_ballzdeep_가 r/LocalLLaMA에 제출한 깔끔한 qwen3_coder 도구 호출 [link] [comments]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/OpenAI Codex (search)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기