Computing

NCCL 개념 및 Ring 기반 집합 통신 최적화 본문

Parallel | Distributed Computing/개념

NCCL 개념 및 Ring 기반 집합 통신 최적화

jhson989 2022. 7. 22. 23:51

이전글

2022.04.04 - [Parallel Computing/개념] - Collective communication

이전에 collective communication 집합 통신에 대하여 정리한 적이 있었다. 집합 통신은 여러 개의 프로세스(or thread) 간의 데이터를 전송하는 통신 패턴을 의미하는 것으로, 2개의 프로세스간 통신(Point-to-point communication)과 대비되는 개념이다. 오늘은 이 여러 개의 GPU들간의 집합 통신을 구현한 NVIDIA NCCL에 대하여 정리하면서, NCCL의 집합 통신 최적화의 기본 아이디어인 Ring 기반 집합 통신 최적화 방법에 대해서도 정리하고자 한다.

 

 

 

Collective Communication 집합 통신

2개의 프로세스간의 통신 패턴을 point-to-point communication(점대점 통신)이라고 한다면, 여러 개의 프로세스간의 통신을 collective communication(집합 통신)이라고 한다. 

 

점대점 통신은 간단하다. 한 프로세스는 데이터를 보내고, 다른 프로세스는 데이터를 받기만 하면 된다. 데이터를 보내는 프로세스를 sender, 데이터를 받는 프로세스를 receiver라고 한다. 당연히 최적 구현하기 매우 쉬운 통신 패턴이다.

 

Fig 1. 점대점 통신 예시 [1]

 

그에 비해 N개의 프로세스간의 통신 패턴을 collective communication이라고 한다. 여러 개의 프로세스가 동시에 데이터를 보내고, 또 다른 여러 개의 프로세스가 동시에 데이터를 받을 수 있다. 즉 multiple senders와 multiple receivers가 참여하는 통신 패턴이다. 대표적으로 broadcast, scatter, gather, reduce, all-reduce, all-to-all이 있다. 임의 개수의 프로세스가 참여하기에 집합통신은 최적 구현하기가 매우 어렵다.

 

Fig 2. 집합 통신 예시 [2]

 

특히 집합 통신의 경우, 참가하는 프로세스들의 topology들이 매우 다양하기 때문에 최적화하기가 어렵다고 한다. Fig 3.은 GPUs들간의 다양한 topology를 나타낸 것이다. 몇 개의 GPU가 있고, 어떤 GPU가 어떤 GPU와 어떻게 연결(PCIe, NVLink, IB, ethernet 등등) 되어 있는 지와 같은 topology 정보는 통신 최적화에 필수로 고려해야 하는 요소이다. 하지만 그 조합이 너무나도 많기에 이것을 다 만족하는 최적화된 솔루션을 찾아 구현하기가 매우 어렵다.

 

FIg 3. GPUs들의 다양한 topology [4]

 

[5]은 이러한 다양한 topology에서 집합 통신을 최적화하는 방법을 제안하였는데, Ring 기반 집합 통신 최적화라고 부르고자 한다. [5]는 거의 대부분의 집합통신은 어떠한 topology를 가지더라도 ring(s) topology로 생각하고 구현할 경우 최적 성능을 달성할 수 있다는 것을 보여준다. Ring 기반 집합 통신 최적화는 밑에서 정리하고자 한다.

 

 

 

NCCL [NICKEL]

NVIDIA Collective Communication Library, 줄여서 NCCL은 NVIDIA에서 개발한 multiple GPU들간의 집합 통신을 구현한 라이브러리이다. 따라서 NVIDIA GPU들간의 집합 통신을 위해 사용되는 라이브러리이며, Intra-node GPUs뿐만 아니라 Inter-node GPUs간의 데이터 통신에도 사용된다.

 

Fig 4. NVIDIA의 NCCL 사용 용도 [3]

 

Fig 4.는 NCCL의 용도를 잘 나타낸 그림이다. HPC, Deep learning 등 갈수록 애플리케이션의 연산량이 많아지는데, 그에 따라 하나의 GPU가 아닌, 수개, 수십개의 GPU를 이용한 가속이 필요하게 되었다. CPU로 부족하던 연산속도를 GPU를 이용한 GPGPU(CUDA)로 가속화를 달성했듯이, 이제는 하나의 GPU가 아닌 multiple GPUs, 나아가 multi-node 상의 multiple GPUs까지 활용하기 시작하였다. 그 과정에서 다양한 GPUs간의 데이터 통신이 필요하게 되었고 그것을 해결하기 위해 만들어진 라이브러리가 NCCL이다.

 

NCCL은 다양한 네트워크 topology에서도 최적 성능을 달성하는 것을 목표로 개발되고 있으며, 앞서 언급한 Ring-based 집합통신 알고리즘을 기반으로 최적화된 집합 통신을 구현하고 있다. Fig 5.은 NCCL의 Ring 기반 집합 통신 예시로, Ring topology에서 이웃한 GPU들간에만 직접 데이터 통신을 한다.

 

Fig 5. NCCL의 Ring 기반 집합 통신 예시 [3]

 

특히 앞서 언급했듯, multiple node 상의 GPU간의 데이터 통신도 가능해졌다. Multiple node들은 Infini-band나 ethernet을 통해 연결될 수 있는데 NVIDIA의 GPUDirect RDMA 기술을 이용하여, 다른 node상에 있는 GPU 간에도 직접 DMA가 가능해졌다.

 

 

 

Ring 기반 집합 통신 최적화

앞서 언급했듯, [5]는 거의 대부분의 집합통신은 어떠한 topology를 가지더라도 ring(s) topology로 생각하고 구현할 경우 최적 성능을 달성할 수 있다고 했다. Ring topology는 이웃한 프로세스간에만 직접 통신이 연결되는 구조이다.

 

Fig 6. Broadcast의 구현 비교: Naive vs. Ring-based

 

Fig 6. Ring 기반 Broadcast 최적화 구현을 나타낸 그림이다. GPU0의 데이터를 GPU1, GPU2, GPU3에 보내는 broadcast 연산을 수행한다. 

 

Fig 6.의 왼쪽 그림은 가장 일반적인 broadcast 구현인 Naive 구현을 나타낸 것이다. GPU0에서 GPU1로 모든 데이터를 전송한다. GPU1로 데이터 전송이 끝나면 GPU0에서 GPU2로 모든 데이터를 전송한다. 마찬가지로 GPU2로의 데이터 전송이 끝나면 GPU0에서 GPU3로 모든 데이터를 전송한다. 이 경우, 데이터 전송 시간은 (3 * 총데이터량 / 통신 bandwitdh)이다.

 

Fig 7.의 오른쪽 그림은 Ring 기반 최적 구현을 나타낸 것이다. Ring 네트워크 topology와 같이, GPU0은 GPU1로, GPU1은 GPU2로, GPU2는 GPU3으로 데이터를 전송한다. 이때 데이터를 작은 조각으로 나누어 전송한다. 그렇게 한다면 Fig 6.과 같이 모든 GPU가 놀지 않고 데이터 통신에 참여할 수 있게 된다. 이때 걸리는 시간은 (1 * 총데이터량 / 통신 bandwitdh) + (3 * 데이터조각량 / 통신 bandwidth)으로, 데이터조각을 bandwidth에 영향을 주지 않을 때까지 충분히 작게 한다면,(1 * 총데이터량 / 통신 bandwitdh)만큼의 시간으로 수렴할 수 있다. 즉 3배 speed-up을 달성할 수 있다.

 

 

 

Reference

[1] https://cvw.cac.cornell.edu/mpip2p/p2pdef

[2] Cliff Woolley, NCCL: ACCELERATED MULTI-GPU COLLECTIVE COMMUNICATIONS, NVIDIA

[3] Sylvain Jeaugey, NCCL 2.0, NVIDIA

[4] Sylvain Jeaugey, DISTRIBUTED DEEP NEURAL NETWORK TRAINING: NCCL ON SUMMIT, NVIDIA

[5] Pitch Patarasuk and Xin Yuan. Bandwidth optimal all-reduce algorithms for clusters of workstations. J. Parallel Distrib. Comput., 69:117–124, 2009.