단일 시스템에서 16 GPU, 2PFLOPS의 NVIDIA DGX-2
2017년에 NVIDIA는 NVLink 스위치를 만드냐는 질문에 대해 부정하지 않았습니다. 2018년에 NVIDIA는 그 대답을 제시했습니다. NVLink 스위치 칩인 NVSwitch로 말입니다.
NVIDIA는 자사의 신형 GPU 서버 NVIDIA DGX-2에서 NVSwitch을 인터커넥트로 사용합니다. NVIDIA는 DGX-2와 NVSwitch를 GPU 컴퓨팅 컨퍼런스 GTC(GPU Technology Conference)에서 발표했습니다. DGX-2는 16개의 하이엔드 GPU를 NVLink로 연결한 몬스터 머신입니다. NVIDIA의 젠슨황(Founder and CEO, NVIDIA)은 DGX-2를 "세계 최대 GPU"라고 불렀습니다.
NVIDIA의 DGX-2
DGX-1과 DGX-2의 성능 비교
DGX-2 시스템 전체 구성
DGX-2에 탭재된 16개 볼타 코어의 연산 성능은 2PFLOPS. 텐사 코어를 사용한 FP16의 성능이라 FP32나 FP64 성능과 단순 비교하진 못합니다. 그러나 DGX-2의 목표는 딥 러닝이니 적당한 비교라 할 수 있습니다. 메모리는 각 GPU에 32GB HBM2가 탑재돼 총 512GB입니다. 전력은 10kW지만 2PFLOPS의 연산 성능을 생각하면 성능 대 전력 비율은 매우 높습니다.
NVIDIA의 GPU 컴퓨팅은 노드에 탑재되는 GPU의 수를 늘려왔으며, 이번의 DGX-2는 마침내 16개까지 끌어올렸습니다. DGX-2에 탑재되는 건 볼타 아키텍처 기반의 테슬라 V100(GV100)입니다. 테슬라 V100 자체는 작년부터 출시됐으나 이번에는 HBM 메모리 용량을 32GB로 늘린 2세대 버전입니다. DRAM의 스택이 늘어났습니다.
DGX-2는 NVLink와 스위치 칩을 쓴다는 점에서 NVIDIA 멀티 GPU 전략의 일정 목표에 도달한 시스템입니다. 2016년 NVIDIA DGX-1에선 NVLink 스위치를 쓰지 않고 8개의 GPU가 NVLink에 직접 연결됐습니다. DGX-1은 NVLink 4포트 GP100을 기반으로 설계해 3포트나 2포트 NVLink로 연결했습니다.
이번에 NVIDIA는 NVSwitch을 도입해 DGX-2에서 16개의 GPU를 연결할 수 있게 만들었습니다. 그것도 GPU끼리 6포트에 연결했으며 GPU 사이의 인터커넥트 대역폭은 300GB/s입니다. NVIDIA는 스위치 칩을 써서 연결하는 GPU 수를 2배로 늘렸을 뿐만 아니라 인터커넥트 대역폭을 높였습니다.
GPU 사이를 광대역과 낮은 레이턴시로 연결하는 게 멀티 GPU의 핵심
기존의 GPU는 PCI Express 호스트 칩과 연결돼 GPU끼리 직접 연결하는 인터커넥트가 없었습니다. PCI-E의 좁은 데이터 대역폭과 CPU나 스위치를 통해 액세스하는 구조는 멀티 GPU 구성의 단점이었습니다. GPU의 연산 성능이 오른다 한들 PCI-E를 통해 CPU나 다른 GPU와 연결되면서 데이터 전송 성능이 떨어집니다.
그래서 NVIDIA는 GPU와 CPU, 혹은 GPU 사이를 빠른 속도와 낮은 레이턴시로 연결하기 위해 독자적인 고속 인터페이스 NVLink를 만들었습니다. NVLink를 지원하는 IBM의 Power CPU는 NVIDIA GPU를 NVLink의 광대역으로 직접 연결합니다. 또 현재 NVLink 2.0 칩 사이에는 메모리의 일관성을 유지하는 가능도 있습니다.
NVLink는 2개의 신호선을 쓰는 차동 신호(Differential Signaling) 방식의 좁은 인터페이스 디자인입니다. 각 포트마다 단방향 8쌍, 양방향 16쌍으로 구성됩니다. 현재 NVLink의 전송 속도는 1쌍이 단방향 25Gbps니 8쌍 단방향은 25GB/s, 1포트는 양방향 50GB/s의 대역폭이 됩니다.
NVLink 1 포트의 구성
볼타 아키텍처 테슬라 V100(GV100)의 경우 GPU에 6포트 NVLink를 구현합니다. 그래서 GPU 칩의 전체 인터커넥트 대역폭은 6포트 × 50GB/s로 최대 300GB/s가 됩니다. 칩 사이의 인터커넥트는 매우 넓습니다. GPU에 구현된 PCI-E 3.0 x16과 비교하면 10배의 대역폭이 나옵니다.
즉, 볼타 세대는 PCI Express 시대의 GPU와 비교하면 칩 사이를 연결하는 인터커넥트 대역폭을 10배로 늘렸습니다. NVIDIA는 파스칼 아키텍처의 테슬라 P100(GP100)에 4포트 NVLink를 구현하고 파스칼에선 포트 수를 늘려 전송 속도도 높였습니다. NVIDIA GPU에선 메모리 대역폭과 연산 성능의 증가보다 인터커넥트 대역폭의 증가가 더욱 극적입니다. NVIDIA가 칩 사이의 데이터 전송과 멀티 GPU 성능을 더 중요하게 여기고 있다는 이야기입니다. 다이에서 차지하는 면적도 적지 않지만, NVIDIA는 멀티 GPU 강화에 이만큼 투자했습니다.
강력한 크로스바 스위치 칩 NVSwitch
NVIDIA가 이번에 도입한 NVSwitch는 NVLink 전용 스위치 칩입니다. NVSwitch는 총 18포트의 NVLink를 구현했으며, 18포트 모두에 논 블로킹 크로스바 연결을 제공합니다. 18포트가 각각 양방향 50GB/s니 총 900GB/s의 스위칭 성능이 나옵니다. DGX-2는 NVSwitch를 써서 총 16개의 GV100 GPU를 시스템에 통합합니다.
스위칭 대역폭이 방대하다보니 NVSwitch 자체의 덩치도 꽤 큽니다. 트랜지스터 수는 20억개, 제조 기술은 TSMC의 NVIDIA 용 12nm 프로세스인 12FFN입니다. 12nm 노드지만 실제 크기는 16nm 수준이며 프로세스를 튜닝한 공정입니다.
NVSwitch 칩
NVIDIA는 DGX-2에 16개의 GPU가 연결돼, 어떤 GPU건 300GB/s의 완전 대역폭을 확보한다고 설명합니다. 실제 DGX-2 시스템은 8개의 GV100 GPU와 6개의 NVSwitch 칩으로 구성된 베이스 보드가 2개 탑재됩니다. 총 16개의 GPU, 12개의 스위치 구성입니다. 여기에서 특이한 건 스위치 칩이 12개씩이나 된다는 겁니다. GPU끼리 NVLink의 완전 대역에 연결하기 위해서인데, DGX-2의 토폴로지에 잘 드러나 있습니다.
NVIDIA의 설명에 따르면 DGX-2의 패브릭 연결은 다음과 같습니다. 베이스 보드의 8개 GPU는 베이스 보드의 6개 NVSwitch 칩에 NVLink를 통해 하나씩 연결됩니다. NVSwitch 칩의 NVLink 포트 중 8 링크는 다른 베이스 보드와의 연결에 사용합니다. DGX-2의 모든 GPU는 다른 GPU와 항상 300GB/s의 대역폭으로 통신 가능합니다. 같은 베이스 보드의 GPU는 1개의 NVSwitch를 통해 300GB/s의 대역폭으로 통신합니다.
GPU 입장에서 NVLink로 연결하는 상대는 6개의 NVSwitch 칩입니다. GPU에서 6개의 NVLink 포트가 각각 1개의 NVSwitch와 연결됩니다. NVSwitch 6개는 GV100의 NVLink 포트 수에 따라 결정됩니다.
DGX-2의 GPU에서 본 NVLink 연결. 6포트가 각각 다른 NVSwitch와 연결됩니다.
NVSwitch 쪽에서 보면 NVSwitch 칩은 NVLink로 8개의 GPU와 연결됩니다. 18 개의 NVLink 포트 중 8포트가 보드의 GPU에 1개씩 연결됩니다. 여기서 핵심은 베이스 보드의 NVLink는 GPU 사이를 연결하거나 NVSwitch끼리 연결하는데 쓰지 않는다는 겁니다.
NVSwitch에서 본 NVLink 연결. 한쪽의 8포트를 써서 8개의 GPU와 연결
NVSwitch에서 18포트 NVLink 중 8포트가 베이스 보드의 GPU와 연결에 씁니다. 그리고 DGX-2의 NVSwitch는 각각 8포트의 NVLink로 다른 베이스 보드와 연결합니다. 여기서 포인트는 8포트를 보드 사이의 연결에 사용한다는 점입니다. 다른 베이스 보드에 6개의 NVSwitch 칩이 배치됐으니 NVSwitch끼리 교차 연결하면 6포트가 됩니다. 실제로는 8포트를 보드 연결에 씁니다. 이런 설명 끝에 나올 수 있는 토플로지는 단 하나밖에 없습니다.
DGX-2에서 GPU와 NVSwitch의 토폴로지
NVIDIA가 DGX-2의 웹 세미나에서 공개한 DGX-2의 토폴로지
DGX-2의 베이스 보드 NVSwitch는 또 다른 베이스 보드의 NVSwitch와 8개의 NVLink로 연결됩니다. 8포트는 모두 같은 NVSwitch 칩과의 연결에 씁니다. 즉 DGX-2에서 베이스 보드의 NVSwitch 칩은 다른 베이스 보드의 NVSwitch 1개와 연결됩니다.
이상하게 보일수도 있으나 이건 합리적입니다. 각각의 NVSwitch 칩은 베이스 보드에 8개의 GPU가 모두 연결되기 때문입니다. 두 보드의 NVSwitch끼리 연결하면 16개의 GPU가 모두 3개의 연결만으로 액세스 가능하며, 배선도 간단해집니다.
까다롭지만 간단한 DGX-2의 인터커넥트
DGX-2의 연결 구성을 그림으로 표현하면 알기 쉽습니다. 우선 GPU가 같은 베이스 보드의 다른 GPU에 300GB/s 대역폭으로 액세스한다면, 아래 그림의 위쪽에 나온대로 GPU는 6개의 NVLink 포트, 6개의 NVSwitch에 액세스합니다. 각 NVSwitch를 통해 2단계로 베이스 보드에 탑재된 다른 GPU에 액세스합니다. 양쪽 GPU의 6개 NVLink 포트를 최대한 사용하면 최대 300GB/s의 액세스가 가능하면, 대기 시간은 NVSwitch 한개가 늘어난 수준에 그칩니다.
NVSwitch를 사용한 액세스. 위는 같은 베이스 보드에 탑재된 GPU끼리 액세스. 아래는 다른 베이스 보드의 GPU끼리 액세스
모든 GPU는 인터커넥트 대역폭이 300GB/s입니다.
GPU가 또 다른 베이스 보드 GPU에 액세스한다면 어떨까요. GPU는 6개의 NVLink 포트로 6개 NVSwitch에 액세스합니다. 6의 NVSwitch 칩에서 다른 베이스 보드의 6개 NVSwitch 칩 스위치, 6개의 NVSwitch 칩에서 GPU로 6포트 액세스합니다. 대기 시간은 길어지지만 양쪽 GPU의 6개 NVLink 포트를 최대한 사용하면 최대 300GB/s의 액세스가 가능합니다.
왜 보드 사이의 NVSwitch 링크에 8포트가 필요할까요? 그것은 NVSwitch에 최대 8개의 GPU가 있고, 다른 보드의 8 GPU에 액세스 요청이 올 수 있기 때문입니다. DGX-2 구성에선 이런 경우에도 2개의 보드에서 16개의 GPU가 각각 액세스 가능합니다.
16 개의 GPU끼리 액세스 경우
각각의 NVSwitch 포트 중 2개는 CPU 연결이나 브릿지 칩과 연결을 위해 남긴 듯 합니다. IBM의 Power9처럼 NVLink 연결이 가능한 CPU는 NVSwitch 여유 포트를 쓰는 경우가 있습니다. x86 계 CPU의 경우엔 NVLink가 없으니 GPU의 PCI-E 3.0을써서 PCI-E 스위치를 통해 CPU와 연결하는 것으로 추측됩니다.