공지: 멀티 GPU 설정을 위해 Intel 소비자용 플랫폼을 사용하지 마세요
요약
Intel Z890과 같은 소비자용 플랫폼은 PCIe P2P 통신을 방해하는 하드웨어/펌웨어 제한으로 인해 멀티 GPU 구성에 부적합합니다. 이로 인해 AI 학습 및 추론 워크로드에서 대역폭이 급감하고 성능 저하가 발생합니다.
핵심 포인트
- Intel 소비자용 플랫폼(Z890 등)은 PCIe P2P 지원에 제한이 있음
- P2P 미지원 시 GPU 간 데이터 전송이 일반 memcopy로 대체되어 대역폭 급감
- AI 추론/학습을 위한 멀티 GPU 구축 시 소비자용 CPU/보드 사용 주의
- 패치된 커널 드라이버로 강제 활성화가 가능하나 성능 불안정성 존재
많은 사람들이 직접 멀티 GPU (multi-GPU) 머신을 구축하려고 시도하고 있기 때문에, 사람들이 멀티 GPU 머신을 구축할 때 저지르는 흔한 실수를 방지하는 데 도움을 드리고자 합니다. 그것은 바로 Z890과 같은 Intel 소비자용 플랫폼을 멀티 GPU (multi-GPU) 설정에 사용하는 것입니다. 고사양 보드의 경우 CPU가 24개의 PCIe 5.0 레인을 제공하며, 두 개의 PCIe x16 슬롯에 8x8x로 분할(bifurcate)할 수 있는 16x를 사용할 수 있지만, 이는 GPU 간의 P2P (Peer-to-Peer)가 필요한 AI 추론/학습 (inference/training) 워크로드에는 완전히 무용지물입니다. Arrow Lake CPU의 PCIe 루트 컴플렉스 (root complex) 하에서 PCIe P2P가 올바르게 작동하는 것을 방해하는 일종의 하드웨어/펌웨어 제한이 있는 것으로 보입니다. PCIe 장치 간에 데이터 패킷을 제대로 허용하지 않는 것처럼 보이는 다음 이슈에서 확인할 수 있습니다: https://github.com/NVIDIA/open-gpu-kernel-modules/issues/1253. 이는 제대로 작동하지 않을 뿐만 아니라, 설령 작동하더라도 대역폭을 실제로 절반으로 감소시킵니다: [P2P (Peer-to-Peer) GPU 대역폭 지연 시간 테스트] 장치: 0, NVIDIA RTX A6000, pciBusID: 2, pciDeviceID: 0, pciDomainID:0 장치: 1, NVIDIA RTX A6000, pciBusID: 3, pciDeviceID: 0, pciDomainID:0 장치=0 상대 장치(1)에 액세스 가능 장치=1 상대 장치(0)에 액세스 가능 ***참고: 장치가 다른 장치에 대한 P2P 액세스를 가질 수 없는 경우, 일반적인 memcopy 절차로 대체됩니다. 따라서 그러한 경우 더 낮은 대역폭 (GB/s)과 불안정한 지연 시간 (us)을 확인할 수 있습니다.
P2P 연결성 매트릭스 (D\D) 0 1 0 1 1 1 1 1 단방향 P2P=비활성화 대역폭 매트릭스 (GB/s) D\D 0 1 0 674.36 11.89 1 11.90 677.65 단방향 P2P=활성화 대역폭 (P2P 쓰기) 매트릭스 (GB/s) D\D 0 1 0 619.30 5.48 1 5.48 678.46 양방향 P2P=비활성화 대역폭 매트릭스 (GB/s) D\D 0 1 0 649.01 16.60 1 16.74 680.68 양방향 P2P=활성화 대역폭 매트릭스 (GB/s) D\D 0 1 0 649.28 10.96 1 10.97 680.37 P2P=비활성화 지연 시간 매트릭스 (us)
GPU 0 1 0 1.59 17.11 1 18.39 1.61 CPU 0 1 0 1.29 4.40 1 4.39 1.24 P2P=활성화 지연 시간 (P2P 쓰기) 매트릭스 (us)
GPU 0 1 0 1.59 1.02 1 1.03 1.60 CPU 0 1 0 1.27 1.09 1 1.12 1.27
사실, 이 P2P 결과는 제가 사용하고 있는 RTX A6000이 기본 Nvidia 드라이버로 PCIe P2P를 지원해야 함에도 불구하고, 여기(github.com/aikitoria/open-gpu-kernel-modules)에서 패치된 P2P open 커널 드라이버를 설치했기 때문에 가능했습니다. 제가 발견한 것은 Nvidia가 바로 이러한 문제들 때문에 소비자용 Intel 플랫폼에서 PCIe P2P를 실제로 차단한 것 같다는 것입니다. 따라서 이를 사용하려면 패치된 커널로 활성화해야 합니다. 처음에는 대역폭이 절반으로 줄어든 것이 지연 시간이 훨씬 많이 감소한다면 어느 정도 괜찮다고 생각했지만, PCIe P2P의 이점을 활용할 수 있는 2개의 GPU에 걸쳐 VLLM을 텐서 병렬(tensor parallel)로 실행했을 때, 강제로 PCIe P2P를 활성화하는 수정된 드라이버를 사용하면 모델 출력이
이는 GPU에 REBAR (Resizable BAR)가 없어서 발생하는 제한 사항 같은 것이 아닙니다. 왜냐하면 lspci -v를 확인해 보면 GPU가 64G의 BAR 크기를 정상적으로 보고하고 있으며, 따라서 이론적으로는 PCIe P2P가 작동하는 데 필요한 모든 조건을 갖추고 있기 때문입니다. BIOS에서도 REBAR가 활성화되어 있고, grub 설정과 함께 IOMMU도 비활성화되어 있습니다: GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pcie_aspm=off intel_iommu=on iommu=pt" GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pcie_aspm=off intel_iommu=on iommu=pt"
02:00.0 VGA compatible controller: NVIDIA Corporation GA102GL [RTX A6000] (rev a1) (prog-if 00 [VGA controller]) Subsystem: NVIDIA Corporation GA102GL [RTX A6000] Flags: bus master, fast devsel, latency 0, IRQ 219 Memory at 8f000000 (32-bit, non-prefetchable) [size=16M] Memory at c000000000 (64-bit, prefetchable) [size=64G] Memory at d000000000 (64-bit, prefetchable) [size=32M] I/O ports at a000 [size=128] Expansion ROM at 90000000 [virtual] [disabled] [size=512K] Capabilities: <access denied> Kernel driver in use: nvidia Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia
02:00.1 Audio device: NVIDIA Corporation GA102 High Definition Audio Controller (rev a1) Subsystem: NVIDIA Corporation GA102 High Definition Audio Controller Flags: bus master, fast devsel, latency 0, IRQ 17
메모리 주소 90080000 (32비트, non-prefetchable) [크기=16K] 기능: <접근 거부> 사용 중인 커널 드라이버: snd_hda_intel 커널 모듈: snd_hda_intel 03:00.0 VGA 호환 컨트롤러: NVIDIA Corporation GA102GL [RTX A6000] (rev a1) (진행사 정보 00 [VGA 컨트롤러]) 서브시스템: NVIDIA Corporation GA102GL [RTX A6000] 플래그: bus master, fast devsel, latency 0, IRQ 222 메모리 주소 8d000000 (32비트, non-prefetchable) [크기=16M] 메모리 주소 a000000000 (64비트, prefetchable) [크기=64G] 메모리 주소 b000000000 (64비트, prefetchable) [크기=32M] I/O 포트 9000 [크기=128] 확장 ROM 주소 8e000000 [가상] [비활성화] [크기=512K] 기능: <접근 거부> 사용 중인 커널 드라이버: nvidia 커널 모듈: nvidiafb, nouveau, nvidia_drm, nvidia 03:00.1 오디오 장치: NVIDIA Corporation GA102 High Definition Audio Controller (rev a1) 서브시스템: NVIDIA Corporation GA102 High Definition Audio Controller 플래그: bus master, fast devsel, latency 0, IRQ 18 메모리 주소 8e080000 (32비트, non-prefetchable) [크기=16K] 기능: <접근 거부> 사용 중인 커널 드라이버: snd_hda_intel 커널 모듈: snd_hda_intel nvidia-smi 출력은 또한 PCIe P2P가 가능함을 시사하는 것 같습니다: GPU0 GPU1 CPU Affinity NUMA Affinity GPU NUMA ID GPU0 X PHB 0-23 0 N/A GPU1 PHB X 0-23 0 N/A 범례: X = Self SYS = NUMA 노드 간의 PCIe뿐만 아니라 SMP 인터커넥트를 통해 통과하는 연결 (예: QPI/UPI) NODE = NUMA 노드 내의 PCIe 호스트 브리지와 인터커넥트를 모두 통과하는 연결 PHB = PCIe 뿐만 아니라 PCIe 호스트 브리지를 통과하는 연결 (일반적으로 CPU) PXB = 여러 개의 PCIe 브리지를 통과하는 연결 (PCIe 호스트 브리지를 통과하지 않음) PIX = 최대 하나의 PCIe 브리지를 통과하는 연결 NV# = #개의 NVLink가 본딩된 세트를 통과하는 연결 만약 제가 인텔 소비자 플랫폼에서 PCIe P2P를 차단하는 기본 Nvidia 드라이버를 사용한다면, 지원해야 하는 RTX A6000에서도 PCIe P2P가 비활성화되어 있음을 알 수 있습니다: [P2P (Peer-to-Peer) GPU 대역폭 지연 시간 테스트]
장치: 0, NVIDIA RTX A6000, pciBusID: 2, pciDeviceID: 0, pciDomainID:0
장치: 1, NVIDIA RTX A6000, pciBusID: 3, pciDeviceID: 0, pciDomainID:0
장치=0이 피어 장치(Peer Device)=1에 액세스할 수 없음
장치=1이 피어 장치(Peer Device)=0에 액세스할 수 없음
***참고: 장치가 다른 장치에 대한 P2P 액세스 권한이 없는 경우, 일반적인 memcopy 절차로 대체됩니다. 따라서 이러한 경우에는 더 낮은 대역폭 (GB/s)과 불안정한 지연 시간 (us)을 확인할 수 있습니다.
P2P 연결 매트릭스 (P2P Connectivity Matrix)
D\D 0 1
0 1 0
1 0 1
단방향 P2P 비활성화 (Unidirectional P2P=Disabled) 대역폭 매트릭스 (GB/s)
D\D 0 1
0 675.24 11.74
1 11.79 676.71
단방향 P2P 활성화 (Unidirectional P2P=Enabled) 대역폭 (P2P 쓰기) 매트릭스 (GB/s)
D\D 0 1
0 618.81 11.78
1 11.72 676.41
양방향 P2P 비활성화 (Bidirectional P2P=Disabled) 대역폭 매트릭스 (GB/s)
D\D 0 1
0 649.82 16.19
1 13.66 608.81
양방향 P2P 활성화 (Bidirectional P2P=Enabled) 대역폭 매트릭스 (GB/s)
D\D 0 1
0 591.97 14.85
1 16.57 679.47
P2P 비활성화 (P2P=Disabled) 지연 시간 매트릭스 (us)
GPU 0 1
0 1.61 16.40
1 17.65 1.66
CPU 0 1
0 1.38 4.55
1 4.43 1.27
P2P 활성화 (P2P=Enabled) 지연 시간 (P2P 쓰기) 매트릭스 (us)
GPU 0 1
0 1.60 17.15
1 16.71 1.66
CPU 0 1
0 1.29 4.59
1 4.50 1.26
참고: CUDA 샘플은 성능 측정을 목적으로 만들어진 것이 아닙니다. GPU Boost가 활성화된 경우 결과가 달라질 수 있습니다.
VLLM의 출력 또한 현재 정상적으로 작동하는 것으로 보입니다:
{ "id": "chatcmpl-b8c56d539c04c16d", "object": "chat.completion", "created": 1784950088, "model": "Qwen3.5-27B-Derestricted", "choices": [ { "index": 0, "message": { "role": "assistant", "content": null, "refusal": null, "annotations": null, "audio": null, "function_call": null, "reasoning": "Thinking Process:
요청 분석:
- 인사말:
P2P 연결성 행렬 (Connectivity Matrix)
| D\D | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 |
단방향 (Unidirectional) P2P=비활성화 (Disabled) 대역폭 행렬 (Bandwidth Matrix) (GB/s)
| D\D | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 1575.10 | 24.07 |
| 1 | 23.97 | 1600.97 |
단방향 (Unidirectional) P2P=활성화 (Enabled) 대역폭 (P2P 쓰기) 행렬 (Bandwidth (P2P Writes) Matrix) (GB/s)
| D\D | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 1576.29 | 18.37 |
| 1 | 20.78 | 1581.48 |
양방향 (Bidirectional) P2P=비활성화 (Disabled) 대역폭 행렬 (Bandwidth Matrix) (GB/s)
| D\D | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 1550.05 | 30.78 |
| 1 | 30.57 | 1562.45 |
양방향 (Bidirectional) P2P=활성화 (Enabled) 대역폭 행렬 (Bandwidth Matrix) (GB/s)
| D\D | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 1550.05 | 39.75 |
| 1 | 39.75 | 1557.00 |
P2P=비활성화 (Disabled) 지연 시간 행렬 (Latency Matrix) (us)
| GPU | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 0 | 2.06 |
| 1 | CPU | 0 | 1 |
P2P=활성화 (Enabled) 지연 시간 (P2P 쓰기) 행렬 (Latency (P2P Writes) Matrix) (us)
| GPU | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 0 | 2.06 |
| 1 | CPU | 0 | 1 |
참고: CUDA 샘플은 성능 측정용이 아닙니다. GPU Boost가 활성화된 경우 결과가 달라질 수 있습니다.
AMD Epyc SP3 7003: [P2P (Peer-to-Peer) GPU 대역폭 지연 시간 테스트]
장치: 0, NVIDIA RTX PRO 6000 Blackwell Workstation Edition, pciBusID: 81, pciDeviceID: 0, pciDomainID:0
장치: 1, NVIDIA RTX PRO 6000 Blackwell Workstation Edition, pciBusID: c1, pciDeviceID: 0, pciDomainID:0
장치=0이 장치=1에 접근 가능
장치=1이 장치=0에 접근 가능
***참고: 특정 장치가 다른 장치에 대한 P2P 접근 권한이 없는 경우, 일반적인 memcopy 절차로 대체됩니다. 따라서 이러한 경우 더 낮은 대역폭 (GB/s)과 불안정한 지연 시간 (us)이 나타날 수 있습니다.
P2P 연결성 행렬 (Connectivity Matrix)
| D\D | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 |
단방향 (Unidirectional) P2P=비활성화 (Disabled) 대역폭 행렬 (Bandwidth Matrix) (GB/s)
| D\D | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 1860.12 | 23.87 |
| 1 | 23.98 | 1903.17 |
단방향 (Unidirectional) P2P=활성화 (Enabled) 대역폭 (P2P 쓰기) 행렬 (Bandwidth (P2P Writes) Matrix) (GB/s)
| D\D | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 1855.70 | 27.95 |
| 1 | 27.91 | 1900.92 |
양방향 (Bidirectional) P2P=비활성화 (Disabled) 대역폭 행렬 (Bandwidth Matrix) (GB/s)
| D\D | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 1831.70 | 30.55 |
| 1 | 30.67 | 1854.57 |
양방향 (Bidirectional) P2P=활성화 (Enabled) 대역폭 행렬 (Bandwidth Matrix) (GB/s)
| D\D | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 1836.01 | 48.74 |
| 1 | 48.86 | 1854.53 |
P2P=비활성화 (Disabled) 지연 시간 행렬 (Latency Matrix) (us)
| GPU | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 0 | 0.99 |
| 1 | CPU | 0 | 1 |
P2P=활성화 (Enabled) 지연 시간 (P2P 쓰기) 행렬 (Latency (P2P Writes) Matrix) (us)
| GPU | 0 | 1 | |
|---|---|---|---|
| 0 | 1 | 0 | 0.99 |
| 1 | CPU | 0 | 1 |
참고: CUDA 샘플은 성능 측정용이 아닙니다.
GPU Boost가 활성화된 경우 결과가 달라질 수 있습니다. /u/Arli_AI 제출 [link] [comments]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/LocalLLaMA의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기