실행 프로그램과 확장
최종 업데이트
2×3090 NVLink, 추론에서 실제로 얼마나 다른가
추론에서는 NVLink가 약 5% 차이였고, 기본 설정은 브리지 없이도 동작해요.
RTX 3090은 NVLink 3.0 커넥터를 갖고 있지만 브리지를 실제로 장착해야 하고, 대부분의 소비자 조합에는 없어요. 2×3090 vLLM 텐서 병렬1 커뮤니티 측정에서는 NVLink가 85.0 대 81.1 tok/s로 약 5% 앞섰고 p95 지연은 239.1 대 277.6초로 더 안정적이었어요. 다중 GPU2 기본 경로는 PCIe이고 P2P는 꺼져 있는 상태로 동작해요.
NVLink 브리지가 하는 일
RTX 3090은 GA102 기반 NVLink 3.0을 지원해서, 카드 한 쌍이 링크당 112.5Gbit/s를 4개 묶어 총 112.5GB/s 양방향(방향당 56.25GB/s)으로 통신할 수 있어요. PCIe 4.0 x16이 방향당 약 32GB/s인 것과 비교하면 카드 사이 전용 경로가 훨씬 넓습니다.
다만 3090에 NVLink 커넥터가 있다는 것과 브리지가 장착돼 있다는 것은 다른 이야기예요. 정리 문서는 “브리지를 물리적으로 설치해야 하고, 대부분의 소비자 구성에는 없다”고 적고 있어요. 브리지가 없으면 다중 카드 구성은 PCIe로 동작합니다.

실측: TP=2에서 NVLink 유무
2×3090에서 vLLM 텐서 병렬(TP=2)로 같은 모델을 돌린 커뮤니티 측정이 있어요. Devstral Small 2505 Q8_0, 코드 생성 프롬프트3 50개, 응답 평균 약 1650토큰4 조건에서 NVLink를 켰을 때 85.0 tok/s, 끄고 PCIe로만 돌렸을 때 81.1 tok/s였어요. 차이는 약 5%입니다.
더 눈에 띄는 것은 꼬리 지연이에요. 95백분위 응답 시간이 239.1초 대 277.6초로 NVLink 쪽이 더 안정적이었어요. 평균 처리량5보다 긴 요청의 편차가 중요한 용도라면 이 차이가 의미가 있어요. 측정자는 추론만 목적이면 브리지에 돈을 쓰기보다 VRAM6이나 카드에 쓰라고 정리했습니다.
| 구성 | 처리량 | p95 응답 |
|---|---|---|
| NVLink 사용 | 85.0 tok/s | 239.1초 |
| PCIe만 사용 | 81.1 tok/s | 277.6초 |
기본값은 PCIe이고 P2P는 꺼져 있어요
2×3090 운영 문서를 보면 기본 듀얼·멀티 카드 경로는 PCIe 전용이고 P2P는 꺼져 있어요. NCCL_P2P_DISABLE=1에 커스텀 올리듀스도 비활성 상태로, 조정 없이 어떤 소비자 구성에서도 안정적으로 동작하는 쪽을 기본으로 잡았습니다.
PCIe에서도 P2P를 켜면 워크로드에 따라 몇 퍼센트에서 20% 정도 더 나올 수 있다는 설명이 있어요. 여기서 강조하는 것은 순서예요. 먼저 기본 PCIe 경로로 정상 동작을 확인하고, 그다음에 토폴로지를 읽고 P2P를 켜서 비교하는 편이 문제를 찾기 쉽습니다.
P2P가 켜졌는지 확인하는 세 계층
P2P는 한 가지 질문이 아니라 세 개가 겹쳐 있어요. 첫째는 드라이버가 GPU 사이 직접 접근을 허용했는지, 둘째는 NCCL7이 그 경로를 실제 전송에 쓰는지, 셋째는 vLLM의 커스텀 올리듀스 커널이 추가로 켜졌는지입니다. 이 셋을 섞으면 “P2P가 켜진 것 같은데 왜 안 빠르지”를 설명할 수 없게 돼요.
vLLM 쪽 게이트는 NVLink라는 이름으로 검사하지만, 그 검사는 비싼 조건을 걸러 내기 위한 사전 필터예요. 그래서 3장 이상 PCIe 구성에서는 완전 연결 NVLink 메시가 아니라는 이유로 커스텀 올리듀스가 설계상 꺼집니다. 오설정이 아니라 의도된 동작이고, 그 구성에서도 P2P 이득은 NCCL 계층으로 흐를 수 있어요.
| 계층 | 확인 방법 |
|---|---|
| 드라이버 | nvidia-smi topo -p2p rw가 OK인지 |
| NCCL | NCCL_P2P_LEVEL 설정과 드라이버 권한 |
| vLLM 커스텀 올리듀스 | 부팅 로그의 비활성 알림 확인 |

TP=2를 켤 때의 조건과 비용
vLLM에서 텐서 병렬은 가중치를 카드 수만큼 나눠 담는 방식이에요. 카드마다 확보하는 KV 캐시8 공간이 늘어나는 대신 동기화 오버헤드가 커질 수 있다고 vLLM 문서가 설명합니다. 문맥 길이와 동시 요청 수를 함께 조정해야 실제 이득이 나와요.
청크 프리필9을 켜면 연산 병목인 프리필과 대역폭 병목인 디코드10를 나눠 섞어 처리해서 두 자원을 함께 씁니다. 전력은 카드마다 따로 걸리니 두 장이면 합계 전력과 케이스 발열도 함께 봐야 해요. 위 차트처럼 3090은 전력 상한이 낮아지면 디코드가 같이 줄어듭니다.
nvidia-smi topo -m
nvidia-smi topo -p2p rw
CUDA_VISIBLE_DEVICES=0,2 CUDA_DEVICE_ORDER=PCI_BUS_ID \
vllm serve /models/model.gguf \
--tensor-parallel-size 2 \
--max-num-seqs 4 --max-model-len 64000 \
--gpu-memory-utilization 0.95 \
--max-num-batched-tokens 16384 --enable-chunked-prefill \
--quantization gguf그래서 브리지를 사야 하나
추론이 목적이라면 브리지는 마지막에 볼 항목이에요. 측정에서 얻은 것은 약 5%의 처리량과 더 나은 꼬리 지연이었고, 그보다 큰 차이는 24GB 두 장으로 나눠 담을 수 있는 모델이냐, 한 장에 더 큰 모델을 올리느냐에서 나옵니다. 두 장을 쓸 때는 PCIe 기본 경로로 먼저 정상 동작을 확인하세요.
학습이나 미세조정처럼 카드 사이 통신이 계속 도는 작업은 이야기가 달라요. NVLink의 대역폭 이득이 추론보다 학습에서 더 크게 나타난다는 것이 일반적인 평가이고, 위 측정도 추론에서는 차이가 5%에 그쳤다고 결론 내렸어요. 용도가 추론인지 학습인지 먼저 정하고 결정하세요.

용어 각주
텐서 병렬 — 모델 층 안의 행렬과 연산을 여러 장치로 분할해 함께 계산하는 방식입니다. 부분 결과를 모으기 위해 장치 간 통신이 필요합니다.
본문으로 돌아가기GPU — 많은 계산을 병렬로 처리하는 프로세서입니다. AI 모델 실행에서는 모델 계산을 맡습니다.
본문으로 돌아가기프롬프트 — 모델에 보내는 입력문입니다. 생성 모델에서는 만들 결과를 설명하는 문장이 되어 출력의 구성과 내용을 크게 좌우합니다.
본문으로 돌아가기토큰 — 모델이 입력이나 출력을 나누어 처리하는 단위입니다.
본문으로 돌아가기처리량 — 일정 시간 동안 처리하거나 생성한 작업량입니다. 토큰/초, 요청/초처럼 단위를 함께 확인해야 비교할 수 있습니다.
본문으로 돌아가기VRAM — 그래픽카드의 GPU가 사용하는 메모리입니다. 모델 가중치와 계산 중간값을 저장합니다.
본문으로 돌아가기NCCL — 여러 NVIDIA GPU 사이에서 데이터를 주고받거나 합산하는 집합 통신 라이브러리입니다.
본문으로 돌아가기KV 캐시 — 어텐션에서 이전 토큰의 키·값을 저장해 다음 토큰 생성 때 재사용하는 메모리입니다. 문맥 길이와 배치 크기에 따라 용량이 달라집니다.
본문으로 돌아가기프리필 — LLM이 입력 프롬프트를 읽고 각 토큰의 내부 표현을 계산하는 단계입니다. 입력이 길수록 처리할 토큰이 많아집니다.
본문으로 돌아가기토큰 디코드 — 입력과 앞서 만든 답변을 바탕으로 다음 출력 토큰을 차례로 생성하는 단계입니다.
본문으로 돌아가기
자주 묻는 질문
- 이 글에서 가장 먼저 확인할 것은 무엇인가요?
- RTX 3090은 NVLink 3.0 커넥터를 갖고 있지만 브리지를 실제로 장착해야 하고, 대부분의 소비자 조합에는 없어요. 2×3090 vLLM 텐서 병렬 커뮤니티 측정에서는 NVLink가 85.0 대 81.1 tok/s로 약 5% 앞섰고 p95 지연은 239.1 대 277.6초로 더 안정적이었어요. 다중 GPU 기본 경로는 PCIe이고 P2P는 꺼져 있는 상태로 동작해요.
