실행 프로그램과 확장

최종 업데이트

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는 디코드 처리량을 약 5% 올리고 p95 지연을 줄였어요.
  • 브리지 없이도 PCIe로 텐서 병렬이 동작하고, 기본 설정은 P2P를 끈 상태예요.
  • P2P가 실제로 켜졌는지는 드라이버·NCCL·vLLM 세 계층에서 따로 확인해야 해요.

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로 동작합니다.

케이스 안에 나란히 장착된 두 장의 그래픽카드와 카드 사이를 잇는 NVLink 브리지
브리지는 카드 사이 통신 경로를 바꾸는 장치이고, 연산이나 용량을 늘리지는 않아요.

실측: 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이나 카드에 쓰라고 정리했습니다.

2×3090 vLLM TP=2 커뮤니티 측정 (Devstral Small 2505 Q8_0, 프롬프트 50개, 응답 평균 약 1650토큰)
구성처리량p95 응답
NVLink 사용85.0 tok/s239.1초
PCIe만 사용81.1 tok/s277.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 계층으로 흐를 수 있어요.

P2P 확인 세 계층
계층확인 방법
드라이버nvidia-smi topo -p2p rw가 OK인지
NCCLNCCL_P2P_LEVEL 설정과 드라이버 권한
vLLM 커스텀 올리듀스부팅 로그의 비활성 알림 확인
오픈 프레임 케이스 안에 위아래로 장착된 두 장의 그래픽카드와 각 카드의 전원 케이블
두 장으로 나누면 카드마다 전력과 발열이 걸리고, 통신 비용이 새로 생겨요.

TP=2를 켤 때의 조건과 비용

vLLM에서 텐서 병렬은 가중치를 카드 수만큼 나눠 담는 방식이에요. 카드마다 확보하는 KV 캐시8 공간이 늘어나는 대신 동기화 오버헤드가 커질 수 있다고 vLLM 문서가 설명합니다. 문맥 길이와 동시 요청 수를 함께 조정해야 실제 이득이 나와요.

청크 프리필9을 켜면 연산 병목인 프리필과 대역폭 병목인 디코드10를 나눠 섞어 처리해서 두 자원을 함께 씁니다. 전력은 카드마다 따로 걸리니 두 장이면 합계 전력과 케이스 발열도 함께 봐야 해요. 위 차트처럼 3090은 전력 상한이 낮아지면 디코드가 같이 줄어듭니다.

TP=2 실행 예시와 P2P 확인
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
플래그는 위 측정에서 쓴 조건을 참고한 예시예요. 카드 수·모델·문맥 길이에 맞게 값을 바꾸고, 부팅 로그의 P2P·올리듀스 알림을 함께 확인하세요.

그래서 브리지를 사야 하나

추론이 목적이라면 브리지는 마지막에 볼 항목이에요. 측정에서 얻은 것은 약 5%의 처리량과 더 나은 꼬리 지연이었고, 그보다 큰 차이는 24GB 두 장으로 나눠 담을 수 있는 모델이냐, 한 장에 더 큰 모델을 올리느냐에서 나옵니다. 두 장을 쓸 때는 PCIe 기본 경로로 먼저 정상 동작을 확인하세요.

학습이나 미세조정처럼 카드 사이 통신이 계속 도는 작업은 이야기가 달라요. NVLink의 대역폭 이득이 추론보다 학습에서 더 크게 나타난다는 것이 일반적인 평가이고, 위 측정도 추론에서는 차이가 5%에 그쳤다고 결론 내렸어요. 용도가 추론인지 학습인지 먼저 정하고 결정하세요.

RTX 3090의 350W·300W·275W·250W 전력 상한별 디코드 68.9·65.3·62.3·51.0 tok/s와 실제 GPU 전력 347.7·298.7·274·249.5W를 막대로 비교한 차트
텐서 병렬은 카드마다 전력 상한이 따로 걸려요. 두 장이면 합계 전력도 함께 봐야 해요.

용어 각주

  1. 텐서 병렬 — 모델 층 안의 행렬과 연산을 여러 장치로 분할해 함께 계산하는 방식입니다. 부분 결과를 모으기 위해 장치 간 통신이 필요합니다.

    본문으로 돌아가기
  2. GPU — 많은 계산을 병렬로 처리하는 프로세서입니다. AI 모델 실행에서는 모델 계산을 맡습니다.

    본문으로 돌아가기
  3. 프롬프트 — 모델에 보내는 입력문입니다. 생성 모델에서는 만들 결과를 설명하는 문장이 되어 출력의 구성과 내용을 크게 좌우합니다.

    본문으로 돌아가기
  4. 토큰 — 모델이 입력이나 출력을 나누어 처리하는 단위입니다.

    본문으로 돌아가기
  5. 처리량 — 일정 시간 동안 처리하거나 생성한 작업량입니다. 토큰/초, 요청/초처럼 단위를 함께 확인해야 비교할 수 있습니다.

    본문으로 돌아가기
  6. VRAM — 그래픽카드의 GPU가 사용하는 메모리입니다. 모델 가중치와 계산 중간값을 저장합니다.

    본문으로 돌아가기
  7. NCCL — 여러 NVIDIA GPU 사이에서 데이터를 주고받거나 합산하는 집합 통신 라이브러리입니다.

    본문으로 돌아가기
  8. KV 캐시 — 어텐션에서 이전 토큰의 키·값을 저장해 다음 토큰 생성 때 재사용하는 메모리입니다. 문맥 길이와 배치 크기에 따라 용량이 달라집니다.

    본문으로 돌아가기
  9. 프리필 — LLM이 입력 프롬프트를 읽고 각 토큰의 내부 표현을 계산하는 단계입니다. 입력이 길수록 처리할 토큰이 많아집니다.

    본문으로 돌아가기
  10. 토큰 디코드 — 입력과 앞서 만든 답변을 바탕으로 다음 출력 토큰을 차례로 생성하는 단계입니다.

    본문으로 돌아가기

자주 묻는 질문

이 글에서 가장 먼저 확인할 것은 무엇인가요?
RTX 3090은 NVLink 3.0 커넥터를 갖고 있지만 브리지를 실제로 장착해야 하고, 대부분의 소비자 조합에는 없어요. 2×3090 vLLM 텐서 병렬 커뮤니티 측정에서는 NVLink가 85.0 대 81.1 tok/s로 약 5% 앞섰고 p95 지연은 239.1 대 277.6초로 더 안정적이었어요. 다중 GPU 기본 경로는 PCIe이고 P2P는 꺼져 있는 상태로 동작해요.