네. 지금 상황이라면 “GPU node를 당장 기존 Compute Cluster에 join시키는 것”을 1차 목표로 잡지 않는 것이 좋습니다.
오히려 GPU node 단독 검증 → GPU SW stack 검증 → 외부망을 통한 Compute 연동 → Private망 개통 후 K8s 편입 → Storage/RDMA → E2E 성능 순으로 가는 것이 리스크가 가장 낮습니다.
특히 현재 구조에서 가장 먼저 짚어야 할 것이 하나 있습니다.
ConnectX-6가 외부망, Intel E810이 private망이라는 NIC 배치는 향후 GPUDirect RDMA / AIStor S3 over RDMA를 하려는 경우 재검토가 필요합니다.
NVIDIA Network Operator의 현재 문서상 GPUDirect RDMA는 NVIDIA ConnectX/BlueField 계열 NIC를 대상으로 하며, RHEL 10.2 + Kubernetes 1.32~1.36도 지원 조합에 포함됩니다. (NVIDIA Docs)
반면 AIStor의 RDMA 자체는 RDMA-capable NIC를 요구하고 ConnectX-6 이상을 권장하지만, GPU memory까지 직접 연결하는 GPUDirect RDMA 경로라면 GPU↔NVIDIA NIC가 핵심입니다. (MinIO AIStor Documentation)
따라서 저는 아래처럼 진행하는 것을 추천합니다.
전체적으로는 다음 6단계로 잡겠습니다.
┌───────────────────────────────┐
│ GPU Server / B300 x8 │
│ │
│ B300 x 8 │
│ │ │
│ PCIe / NVLink / NVSwitch │
│ │ │
│ ConnectX-6 ── External NET │
│ Intel E810 ── Private NET │
└──────────────┬────────────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
[External Network] [Private Network] [Management]
│ │
Compute Cluster Storage Cluster
API access AIStor
↓
↓
↓
↓
↓
↓
이 단계에서는 아직 Kubernetes에 join하지 않습니다.
목표는:
"이 서버 자체가 정상인가?"
입니다.
먼저 다음을 확보합니다.
dmidecode
lscpu
free -h
lsblk
lspci -nn
lspci -nn | grep -Ei 'nvidia|mellanox|ethernet|vga|3d'
GPU:
nvidia-smi
단, NVIDIA driver가 아직 없다면:
lspci -nn | grep -i nvidia
로 PCIe enumeration부터 확인합니다.
NIC:
lspci -nn | grep -Ei 'ethernet|mellanox|intel'
ip -br link
ip -br addr
특히 다음을 기록해 두는 것이 좋습니다.
| 항목 | 확인 |
|---|---|
| GPU 개수 | 8 |
| GPU PCIe BDF | 각각 기록 |
| GPU SKU | B300 |
| NVLink/NVSwitch | topology 확인 |
| ConnectX-6 | PCIe BDF / firmware |
| E810 | PCIe BDF / firmware |
| CPU | model/socket/core |
| NUMA | GPU ↔ CPU ↔ NIC affinity |
| RAM | capacity/speed |
| NVMe | device/firmware |
| BIOS | version |
| BMC | version |
| OS | RHEL 10.2 |
| Kernel | exact version |
| containerd | version |
이 단계에서 성능 테스트를 하지 말고 정상 동작 여부만 확인합니다.
B300 8장에서는 상당히 중요합니다.
numactl -H
lscpu -e
lspci -tv
그리고 가능하면:
nvidia-smi topo -m
결과를 저장합니다.
예를 들어 이상적인 형태는:
GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7
GPU0 X NV NV NV SYS ...
...
NIC0 PIX PIX ...
NIC1 SYS SYS
여기서 중요한 것은:
GPU ↔ NIC의 PCIe locality
입니다.
ethtool -i <cx6-interface>
ethtool <cx6-interface>
Mellanox/NVIDIA 계열이면:
mlxconfig -d <device> q
mlxlink -d <device>
등을 확인합니다.
ethtool -i <e810-interface>
ethtool <e810-interface>
그리고:
ip -d link show <interface>
GPU/RDMA POC에서 의외로 많이 걸리는 부분입니다.
다음 정보를 표로 남겨두세요.
BIOS
BMC
GPU firmware
ConnectX-6 firmware
Intel E810 firmware
RHEL kernel
NVIDIA driver
CUDA
NCCL
GPU Operator
Network Operator
containerd
Kubernetes
Cilium
이 버전을 POC 기준선(baseline)으로 freeze하는 것을 권합니다.
여기부터 GPU software stack을 설치합니다.
현재 NVIDIA Network Operator 26.7 계열은 RHEL 10.2 + Kubernetes 1.32~1.36을 지원하고, ConnectX-6의 Ethernet/RoCE도 지원 대상으로 명시하고 있습니다. (NVIDIA Docs)
따라서 향후 현재 사용 중인 K8s 1.33 계열과도 방향은 맞습니다.
먼저 standalone node에서 driver를 설치합니다.
확인:
nvidia-smi
nvidia-smi -L
8장이 모두 나와야 합니다.
예:
GPU 0: NVIDIA B300
GPU 1: NVIDIA B300
...
GPU 7: NVIDIA B300
nvidia-smi -q
특히:
확인.
CUDA sample 또는 간단한 CUDA test로:
GPU memory allocation
GPU → memory copy
memory bandwidth
확인합니다.
여기서는 단순히 nvidia-smi가 된다고 PASS하지 않는 게 좋습니다.
최소:
GPU0 100%
GPU0~GPU7 100%
최소:
1h
가능하면:
4h
그리고 production acceptance라면:
8~24h
까지.
관찰할 항목:
GPU temperature
GPU power
GPU utilization
GPU memory utilization
ECC error
XID error
PCIe error
GPU reset
kernel error
특히:
dmesg -T | grep -Ei 'NVRM|Xid|AER|PCIe'
를 계속 확인합니다.
B300 8-GPU라면 상당히 중요합니다.
nvidia-smi topo -m
그리고 NCCL 테스트를 합니다.
이건 GPU 서버 acceptance test에서 필수로 넣는 것을 추천합니다.
대표적으로:
all_reduce
all_gather
broadcast
reduce_scatter
특히:
8 GPU AllReduce
를 봅니다.
테스트 축:
| GPU | Message |
|---|---|
| 2 | 1MB ~ 1GB |
| 4 | 1MB ~ 1GB |
| 8 | 1MB ~ 1GB |
그리고:
latency
bandwidth
algorithm bandwidth
bus bandwidth
를 기록합니다.
이 단계에서도 Kubernetes에 join하지 않아도 됩니다.
GPU node에서 먼저:
vLLM
↓
B300 x8
↓
model
을 검증합니다.
vLLM 자체가 정상 동작하는지부터 확인합니다.
최근 NVIDIA의 vLLM 26.07 문서에서도 Blackwell B200/B300 대상 NVFP4 MoE 최적화 등이 별도로 언급되고 있으므로, 사용하려는 실제 모델/quantization 조합을 별도로 검증하는 것이 좋습니다. (NVIDIA Docs)
처음에는 작은 모델부터:
7B
14B
32B
70B
순으로 테스트하고,
최종 목표 모델을 올립니다.
측정:
model load time
GPU memory
GPU utilization
TTFT
TPOT
ITL
request latency
tokens/sec
output tokens/sec
1
2
4
8
16
32
64
128
식으로 올립니다.
여기서 중요한 포인트입니다.
Private network가 아직 없다면 GPU node를 Compute Cluster에 억지로 join시키지 않아도 됩니다.
대신:
Compute Cluster
│
│ External Network
▼
ConnectX-6
│
▼
GPU Node
│
▼
vLLM
형태로 API-level integration을 먼저 할 수 있습니다.
예:
Compute Cluster application
↓
http://<GPU-node-IP>:8000
↓
vLLM OpenAI API
↓
B300 x8
이렇게 하면 "GPU compute가 기존 cluster에서 호출 가능한가?"를 먼저 검증할 수 있습니다.
Compute → vLLM
Compute cluster에서:
1 request
10
100
1000
식으로 부하를 줍니다.
그리고:
TTFT
TPOT
tokens/sec
concurrency
HTTP latency
network bandwidth
CPU
GPU utilization
GPU memory
를 동시에 봅니다.
이제 인프라에서 private network가 준비되면 여기부터 진짜 cluster integration을 시작합니다.
현재 구조를 제가 이해한 그림은:
Compute Cluster
│
bond1
│
Private Network
│
┌────┴────┐
│ │
Storage GPU Node
Cluster
bond1 E810
이 형태입니다.
여기서 GPU node는:
E810 → Private network
CX6 → External network
가 됩니다.
여기서 반드시 결정해야 합니다.
E810
↓
K8s private network
↓
Compute + Storage
그리고:
CX6
↓
External network
↓
vLLM API
CX6
↓
RoCE/RDMA private fabric
↓
AIStor
그리고:
E810
↓
K8s private network
GPUDirect RDMA까지 목표라면 B에 가까운 구성이 더 적절합니다.
왜냐하면 GPUDirect RDMA의 핵심은:
GPU
↓
PCIe P2P
↓
NVIDIA NIC
↓
RoCE
↓
Storage
이기 때문입니다.
NVIDIA 문서에서도 GPUDirect RDMA는 지원 GPU와 NVIDIA ConnectX/BlueField NIC 조합을 요구합니다. (NVIDIA Docs)
따라서 현재처럼
GPU
│
├── ConnectX-6 → External
│
└── E810 → Private
이라면,
E810 private망으로 AIStor까지 일반 TCP 통신은 가능하지만, GPU Direct RDMA를 하려는 경우에는 구조적인 제약이 생길 가능성이 높습니다.
이건 POC 초기에 반드시 결정해야 합니다.
E810 연결 후에는 먼저 K8s를 올리지 말고 network 자체를 검증합니다.
GPU node:
ip addr
ip route
ip neigh
Compute node:
ping <GPU-private-IP>
Storage node:
ping <GPU-private-IP>
다음:
GPU ↔ Compute
GPU ↔ Storage
각각:
ping
MTU
TCP
bandwidth
packet loss
검증.
RoCE를 할 계획이면 특히 중요합니다.
예:
ip link show
그리고:
ping -M do -s <size> <peer>
로 MTU를 검증합니다.
가능하면:
MTU 1500
MTU 9000
중 실제 설계값을 확정합니다.
한쪽만 jumbo frame인 상태가 가장 위험합니다.
최소:
GPU Node ↔ Compute
GPU Node ↔ Storage
를 테스트합니다.
예:
iperf3 -s
반대쪽:
iperf3 -c <server> -P 1
iperf3 -c <server> -P 4
iperf3 -c <server> -P 8
그리고:
1 stream
4 streams
8 streams
16 streams
을 비교합니다.
여기서 중요한 것은 단순 bandwidth뿐 아니라:
packet loss
retransmission
CPU utilization
NIC utilization
입니다.
Private network가 RoCE로 구성된다면:
ibv_devices
ibv_devinfo
rdma link
rdma dev
확인.
그리고:
perftest
├── ib_write_bw
├── ib_read_bw
├── ib_send_bw
├── ib_write_lat
└── ib_read_lat
등으로 검증합니다.
이 부분은 일반 Ethernet 테스트와 별개입니다.
확인:
RoCEv2
PFC
ECN
DSCP/PCP
DCB
QoS
MTU
switch buffer
특히 PFC를 사용한다면:
RDMA traffic
↓
lossless queue
↓
PFC
가 제대로 구성됐는지 확인해야 합니다.
여기서 기존 Cilium/K8s traffic에 영향을 주지 않는지도 반드시 검증해야 합니다.
여기서는 두 단계로 나누는 것을 추천합니다.
먼저:
GPU Node
│
E810
│
Private Network
│
AIStor
에서 일반 S3/TCP 성능을 측정합니다.
그 다음:
GPU
↓
GPUDirect RDMA
↓
NIC
↓
RoCE
↓
AIStor
를 검증합니다.
AIStor의 현재 RDMA 문서에서는 RoCE v2를 사용하려면 end-to-end lossless fabric과 PFC 등이 필요하다고 명시하고 있습니다. (MinIO AIStor Documentation)
GPU Node
↓ TCP
AIStor
GPU Node
↓ RDMA
AIStor
GPU memory
↓
NIC
↓
RoCE
↓
AIStor
이렇게 분리해야 합니다.
그렇지 않으면 문제가 생겼을 때:
GPU 문제인지 / NIC 문제인지 / RDMA 문제인지 / AIStor 문제인지
구분이 안 됩니다.
최소:
GET
PUT
multipart upload
large object
small object
concurrent objects
를 테스트합니다.
예를 들어:
| Object | Concurrency |
|---|---|
| 1 MB | 1/16/64/256 |
| 64 MB | 1/16/64 |
| 1 GB | 1/4/16/64 |
| 10 GB | 1/4/16 |
측정:
MB/s
GB/s
IOPS
latency
CPU
NIC
GPU utilization
AIStor disk latency
AIStor network
여기서는 단순히:
ibv_devinfo = OK
만으로 PASS하면 안 됩니다.
확인해야 할 것이:
GPU ↔ NIC PCIe P2P
IOMMU
ACS
BAR1
nvidia_peermem
RDMA device
GPU/NIC affinity
입니다.
AIStor 문서도 GPU S3 over RDMA의 경우 GPU-to-NIC peer-to-peer DMA와 NVIDIA GPU/RDMA 지원을 요구합니다. (MinIO AIStor Documentation)
최종적으로는 실제 workload와 최대한 비슷하게 만듭니다.
User / Application
│
▼
Compute Cluster
│
│ API
▼
vLLM
│
▼
B300 x8
│
│ RDMA / TCP
▼
AIStor
│
▼
Storage
Compute → vLLM → GPU
측정:
TTFT
TPOT
tokens/sec
QPS
GPU utilization
AIStor
↓
GPU
↓
vLLM
측정:
model load time
storage throughput
GPU utilization
network
Compute
↓
vLLM
↓
8 GPU
concurrency:
1
2
4
8
16
32
64
128
256
까지 올려봅니다.
이게 실제 운영에서는 상당히 중요합니다.
┌── inference
Compute ─────┤
└── model/data access
↓
AIStor
동시에:
AIStor PUT/GET
+
vLLM inference
를 발생시킵니다.
이때:
GPU utilization
NIC utilization
AIStor latency
vLLM TTFT
vLLM TPOT
가 서로 영향을 주는지 봅니다.
예:
25G
50G
100G
200G
환경에 맞게 최대 bandwidth까지 올려봅니다.
특히 NIC bandwidth가 증가하면서 vLLM latency가 얼마나 영향을 받는지가 중요합니다.
POC에서 반드시 넣는 것을 추천합니다.
GPU reset
GPU process crash
GPU XID
CX6 link down
E810 link down
network packet loss
RoCE congestion
AIStor node unavailable
network path unavailable
pod restart
container restart
model reload
client restart
connection timeout
retry
실제 운영에서는 다음이 중요합니다.
Compute
│
▼
vLLM
│
▼
GPU
중간에 vLLM이 죽으면:
HTTP timeout
retry
connection reset
이 발생합니다.
따라서 Compute 측에서:
timeout
retry
backoff
circuit breaker
를 검증해야 합니다.
현재:
CX6 → External
E810 → Private
인데 GPUDirect RDMA가 목표라면 재검토가 필요합니다.
가장 먼저 결정해야 합니다.
추천하지 않습니다.
왜냐하면:
GPU driver
CUDA
NCCL
CNI
RDMA
Network Operator
GPU Operator
Cilium
문제가 한꺼번에 섞입니다.
따라서:
Standalone → Network → GPU → vLLM → Storage → K8s
순서가 좋습니다.
특히 GPU Operator / Network Operator / CUDA / driver 조합입니다.
현재 Network Operator 26.7 기준으로 RHEL 10.2와 K8s 1.32~1.36이 지원되므로 현재 환경과의 방향은 맞지만, 실제 B300 + 해당 driver/CUDA 조합은 POC에서 고정해서 검증해야 합니다. (NVIDIA Docs)
NIC
+
switch
+
PFC
+
ECN
+
DSCP
+
MTU
+
routing
전체가 맞아야 합니다.
AIStor도 RoCE 환경에서 end-to-end lossless fabric을 요구합니다. (MinIO AIStor Documentation)
현재 Cilium이:
Native routing
BGP
ECMP
Gateway API
를 사용하고 있으므로 K8s 일반 traffic과 RDMA fabric을 논리적으로 분리하는 것을 권합니다.
즉:
K8s traffic
↓
Cilium / E810
RDMA traffic
↓
RoCE / dedicated NIC
구조가 가장 깔끔합니다.
예:
GPU 9000
↓
Switch 9000
↓
Storage 1500
이면 일반 TCP에서는 일부 동작하더라도 RDMA에서 문제가 훨씬 심각해질 수 있습니다.
8-GPU B300에서는 단순히:
GPU 8개
NIC 1개
가 중요한 게 아닙니다.
어떤 GPU가 어떤 NIC/PCIe root complex와 연결되는지가 중요합니다.
반드시:
nvidia-smi topo -m
와 NUMA topology를 기준으로 benchmark 해야 합니다.
예를 들어:
Peak bandwidth = 180Gbps
가 나왔다고 성공한 것이 아닙니다.
실제 운영에서는:
P99 latency
P99.9 latency
GPU utilization
network utilization
storage latency
error rate
가 훨씬 중요합니다.
| 영역 | PASS 기준 |
|---|---|
| Hardware | 모든 GPU/NIC/PCIe 정상 |
| GPU Driver | 8 GPU 정상 인식 |
| GPU Burn | 장시간 XID/ECC 오류 없음 |
| NVLink | topology 정상 |
| NCCL | 8GPU expected BW 달성 |
| vLLM | model load/inference 정상 |
| Compute→vLLM | API 안정적 |
| Private Network | packet loss 0 |
| Network | 목표 BW 달성 |
| RDMA | ibv/perftest 정상 |
| RoCE | PFC/ECN 정상 |
| AIStor TCP | 목표 throughput |
| AIStor RDMA | 목표 throughput |
| GPUDirect | GPU memory direct path 확인 |
| E2E | 목표 TPS/latency |
| Failure | 장애 후 recovery 정상 |
실제로 현장에서 작업한다면 저는 아래 순서로 진행하겠습니다.
[DAY 1]
GPU Server HW inspection
↓
BIOS/BMC/FW
↓
RHEL 10.2
↓
NIC basic test
↓
GPU PCIe enumeration
[DAY 2]
NVIDIA Driver
↓
nvidia-smi
↓
8 GPU validation
↓
GPU burn-in
[DAY 3]
CUDA
↓
NCCL
↓
NVLink/NVSwitch
↓
8GPU NCCL benchmark
[DAY 4]
vLLM
↓
single request
↓
concurrency
↓
long-run test
[DAY 5]
Compute Cluster
↓
External network
↓
vLLM API
↓
E2E API test
[PRIVATE NETWORK READY]
[DAY 6]
E810 private network
↓
GPU ↔ Compute
↓
GPU ↔ Storage
↓
MTU
↓
iperf3
[DAY 7]
RDMA
↓
RDMA device
↓
perftest
↓
RoCE PFC/ECN
[DAY 8]
AIStor TCP
↓
AIStor RDMA
↓
GPU Direct RDMA
[DAY 9~10]
vLLM + AIStor
↓
E2E performance
↓
stress
↓
failure/recovery
저라면 이번 POC에서는 Kubernetes Join을 마지막 쪽으로 미룹니다.
즉,
RHEL
├─ NVIDIA Driver
├─ CUDA
├─ NCCL
├─ GPU Burn
├─ CX6
└─ E810
vLLM
↓
B300 x8
Existing Compute
↓
HTTP
↓
vLLM
GPU
│
E810
│
Private
├── Compute
└── Storage
GPU
│
CX6
│
RoCE
│
AIStor
Existing Compute K8s
│
│ private
▼
GPU Node
│
├── GPU Operator
├── Network Operator
├── Cilium
└── vLLM
이렇게 가는 것이 좋습니다.
특히 지금 CX6가 외부망이고 E810이 private망이라는 사실 때문에, GPU → Storage → GPUDirect RDMA를 최종 목표로 한다면 네트워크 설계를 먼저 확정한 후 장비를 물리는 것을 강하게 권합니다. CX6를 단순히 외부 API용 NIC로 사용하고 E810을 AIStor용 private NIC로 쓰는 구성이라면, TCP 기반 GPU↔AIStor 연동은 가능하지만 NVIDIA GPUDirect RDMA라는 최종 목표와는 맞지 않을 수 있습니다.
참고로 AIStor의 최근 RDMA build는 RDMA fabric이 없으면 TCP로 동작하므로, 초기 TCP 검증과 이후 RDMA 검증을 분리해서 진행하는 전략도 가능합니다. (MinIO)
원하시면 다음 단계로 제가 이걸 실제 POC 수행용 "GPU Node 구축/검증 체크리스트" 형태로 만들어서, 각 단계별로 설치 명령어 → 확인 명령어 → Prometheus/Grafana metric → PASS/FAIL 기준 → 예상 장애 → rollback 방법까지 넣은 Excel 형태의 테스트 시나리오로 구성해드릴 수 있습니다.