AI/ML Parallelism, NVLink
AI/ML에서 Parallelism(병렬화)은 모델의 학습이나 추론 속도를 높이고, 대용량 데이터를 효율적으로 처리하기 위해 모델을 여러 작업 단위로 나누어 병렬 처리하는 방법입니다. 이 병렬화는 크게 세 가지로 나눌 수 있습니다: Model Parallelism(모델 병렬화), Data Parallelism(데이터 병렬화), 그리고 Layer Parallelism(레이어 병렬화)입니다.
1. Model Parallelism (모델 병렬화)
모델 병렬화는 모델의 파라미터(가중치)를 여러 디바이스(GPU나 TPU 등)에 분산하는 방식입니다. 특히, 모델이 너무 커서 하나의 디바이스에 모두 올리기 어려운 경우에 사용됩니다. 예를 들어, GPT나 BERT와 같은 대형 모델을 학습할 때 하나의 GPU에 모델 전체를 올릴 수 없는 경우, 모델의 다른 레이어나 특정 부분을 여러 GPU에 분산하여 병렬 처리합니다.
- 장점: 하나의 디바이스에 모델 전체를 올릴 필요가 없으므로, 메모리 부담을 줄일 수 있습니다.
- 단점: 모델의 여러 부분을 서로 다른 디바이스에 분산하므로, 디바이스 간 통신 비용이 발생할 수 있으며, 특히 연산이 많은 모델의 경우에는 통신 병목 현상이 생길 수 있습니다.
예) GPT
GPT 모델에서 모델 병렬화(Model Parallelism)를 사용하는 경우, 모델의 레이어나 토큰 시퀀스를 기준으로 나누는 방식으로 분할합니다. GPT 모델은 주로 Transformer 구조를 기반으로 하고, Transformer의 여러 레이어와 연산이 포함되어 있으므로, 모델 병렬화를 통해 이 연산들을 여러 디바이스(GPU/TPU)에 나누어 처리하게 됩니다.
GPT 모델에서의 모델 병렬화 분할 방식
- 레이어 기반 모델 병렬화 (Layer-wise Model Parallelism)
- GPT 모델에서는 Transformer의 레이어를 기준으로 병렬화를 적용할 수 있습니다.
- 예를 들어, 48개의 Transformer 레이어를 가진 GPT 모델이라면, 이 레이어를 여러 디바이스에 나누어 배치할 수 있습니다.
- 예를 들어 4개의 GPU가 있을 때, 각 GPU가 12개씩 레이어를 처리하게 할 수 있습니다.
- 각 GPU는 할당된 레이어에 대한 계산을 수행한 후, 다음 레이어로의 출력을 다른 GPU로 전달합니다.
- 이 방식은 특히 레이어 수가 많은 대형 모델에서 효과적입니다. 다만, 각 레이어 사이에서 GPU 간 통신이 필요하므로, 통신 비용을 최적화할 필요가 있습니다.
- 텐서 분할 (Tensor Parallelism)
- 모델의 개별 텐서(예: 어텐션 가중치 텐서)를 여러 GPU에 분할하여 병렬로 처리하는 방식입니다.
- 예를 들어, 어텐션 레이어에서 Q, K, V를 생성하는 과정에서, 각 텐서를 여러 GPU로 나누어 계산할 수 있습니다.
- 이 방식은 개별 텐서의 차원을 나누어 여러 디바이스에서 연산을 수행하고, 결과를 결합하여 다음 레이어로 전달하는 형태입니다.
- 이는 레이어 기반 병렬화와 함께 사용되어, 동일 레이어 내에서도 병렬 처리가 가능하게 합니다.
- 파이프라인 병렬화 (Pipeline Parallelism)
- GPT 모델은 레이어별로 연속적인 처리가 필요한 구조이기 때문에, 파이프라인 병렬화를 통해 레이어를 순차적으로 나누고 각 레이어 그룹을 다른 디바이스에 할당할 수 있습니다.
- 예를 들어, 입력 토큰이 여러 개일 경우, 첫 번째 토큰이 첫 번째 GPU에서 처리될 때, 두 번째 토큰은 다음 GPU로 이동하는 식으로 처리합니다.
- 이렇게 하면 각 GPU가 모델의 다른 부분을 연속적으로 처리하면서 동시에 여러 토큰 시퀀스를 병렬로 처리할 수 있습니다.
- 파이프라인 병렬화는 특히 대형 모델에서 메모리와 연산 자원을 효율적으로 활용할 수 있게 해줍니다.
GPT 모델에서 병렬화 시 고려사항
- 통신 비용: 각 병렬화 기법에서 GPU 간의 통신이 필수적이므로, 통신 오버헤드가 성능에 큰 영향을 미칩니다. 병렬화 방식에 따라 통신 비용을 최소화하기 위한 최적화가 필요합니다.
- 동기화 문제: 각 GPU에서 병렬로 처리되는 연산이 완료된 후 동기화가 필요할 수 있습니다. 특히 텐서 병렬화나 레이어 기반 병렬화에서는 이를 잘 조율하는 것이 중요합니다.
- 메모리 최적화: 모델이 매우 큰 경우, 메모리를 최적화하는 것이 중요합니다. GPT는 모델 병렬화와 데이터 병렬화를 함께 사용해 메모리를 최적화하며, 이를 통해 학습 및 추론 속도를 높입니다.
ChatGPT 4 (GPT-4)는 모델 크기와 연산 요구량이 매우 크기 때문에 일반적인 경우 GPU 하나에 모델 전체를 올리기 어렵습니다. GPT-4와 같은 대형 모델은 일반적으로 수십 또는 수백 기가바이트의 VRAM을 필요로 하며, 최신 고성능 GPU (예: NVIDIA A100, H100)라도 단일 카드에 모델을 모두 적재하는 것은 쉽지 않습니다.
GPT-4와 같은 모델을 단일 GPU에 올리기 어려운 이유는 다음과 같습니다:
- 모델 크기: GPT-4의 파라미터 수는 수백억 개 이상일 수 있으며, 각 파라미터는 메모리를 차지합니다. 모델 크기와 파라미터가 많을수록 메모리 요구량이 커집니다. 일반적인 GPU의 메모리 크기 (A100의 경우 40GB 또는 80GB)는 전체 모델을 다루기엔 부족합니다.
- 연산 요구량: GPT-4와 같은 대형 모델은 연산량이 많아지기 때문에 대량의 연산 자원이 필요합니다. 따라서, 모델을 효과적으로 서빙하기 위해서는 여러 GPU에 분산하여 처리하는 병렬화 방식이 필요합니다.
- 병렬화 필요: 대형 모델을 서빙할 때는 모델 병렬화와 텐서 병렬화가 주로 사용됩니다. 즉, 여러 GPU에 걸쳐 모델을 분산하여 각 GPU가 모델의 일부를 담당하도록 하여 서빙 속도를 높입니다. GPT-4의 경우 NVIDIA A100 또는 H100 같은 고성능 GPU를 여러 개 연결해 서빙하는 것이 일반적입니다.
- 최신 GPU 활용: NVIDIA H100과 같은 최신 GPU는 96GB HBM3 메모리를 제공하여, 일부 경우 GPT-4의 작은 버전 또는 최적화된 모델을 단일 카드에 올릴 수 있을 가능성도 있습니다. 그러나 일반적으로는 여전히 여러 GPU가 요구됩니다.
따라서 GPT-4를 서빙하려면 다중 GPU 설정을 사용하는 것이 현실적이며, 단일 GPU에 모델 전체를 올리기는 어려운 경우가 많습니다.
GPT-4 모델을 NVIDIA A100 GPU로 서빙하기 위해 필요한 GPU 수는 모델의 크기(파라미터 수)와 메모리 요구량에 따라 달라지지만, 대략적으로 8장에서 16장의 A100 GPU가 필요한 경우가 많습니다.
- 메모리 요구량:
- NVIDIA A100 GPU의 메모리 용량은 40GB와 80GB 옵션이 있습니다. GPT-4는 수백억 개의 파라미터를 갖고 있으며, 추정 메모리 요구량이 150GB에서 200GB 이상일 수 있습니다.
- 80GB A100을 사용할 경우, 최소한 2~4장이 필요할 수도 있지만, 실제 서빙 환경에서는 연산 부하와 통신 오버헤드로 인해 훨씬 더 많은 GPU가 필요합니다.
- 모델 병렬화와 텐서 병렬화:
- 모델을 여러 GPU에 분산할 때 레이어 또는 텐서를 병렬화하여 GPU들이 동시에 연산하도록 설계합니다. 이를 위해서는 모델의 부하를 효율적으로 나눌 수 있는 GPU가 여러 대 필요합니다.
- 특히, 병렬화를 통해 각 GPU에 할당된 메모리와 연산이 최대한 효율적으로 사용되도록 8~16장의 GPU를 활용하는 것이 일반적입니다.
- 추론 속도와 실시간 성능 요구:
- 실시간 성능 요구가 높다면 더 많은 GPU를 투입하여 병렬로 처리 속도를 높일 필요가 있습니다. 추론 요청이 많아질수록 GPU 수가 추가됩니다.
대략적인 구성 예시
- 40GB A100 기준: 12장~16장
- 80GB A100 기준: 8장~12장
정확한 GPU 수는 GPT-4의 최적화 상태, 모델 크기, 실시간 요구사항, 그리고 운영 환경에 따라 다를 수 있습니다.
2. Data Parallelism (데이터 병렬화)
데이터 병렬화는 동일한 모델을 여러 디바이스에 복사하고, 각 디바이스에서 다른 데이터 배치를 처리하도록 하는 방식입니다. 각 디바이스는 독립적으로 계산을 수행하며, 학습 단계에서 손실을 계산하고, 이 값을 모두 모아 평균 또는 합산을 통해 모델을 업데이트합니다. 학습 데이터를 여러 배치로 나누어 각 디바이스가 병렬로 처리함으로써, 학습 속도를 크게 높일 수 있습니다.
- 장점: 모델 구조를 변경하지 않고 데이터를 나누어 병렬 처리가 가능하여 구현이 비교적 간단합니다.
- 단점: 모델을 업데이트할 때, 각 디바이스의 그레디언트를 합산해야 하기 때문에 동기화 비용이 발생할 수 있습니다.
3. Pipeline Parallelism (레이어 병렬화)
파이프라인 병렬화(Pipeline Parallelism)는 딥러닝 모델의 훈련이나 추론을 가속화하기 위해 모델을 여러 단계(스테이지)로 분할하고, 각 스테이지를 서로 다른 디바이스(GPU, TPU 등)에서 병렬로 처리하는 방식입니다. 이 방식은 특히 GPT-4와 같은 대형 모델에 적용되며, 모델 크기로 인해 단일 GPU에 모델 전체를 올리기 어렵거나, 처리 속도를 높여야 할 때 유용합니다.
1. 파이프라인 병렬화의 개념
파이프라인 병렬화는 딥러닝 모델의 연속된 레이어들을 여러 디바이스에 분할하여, 모델의 다른 부분이 서로 다른 디바이스에서 동시에 처리되도록 하는 방식입니다. 각 디바이스는 할당된 레이어를 처리하며, 처리한 결과를 다음 디바이스로 넘깁니다. 파이프라인 병렬화는 주로 미니 배치(Mini-Batch) 내 여러 샘플을 처리할 때 사용됩니다.
예를 들어, 모델이 12개의 레이어로 구성되고 4개의 GPU가 사용된다면, 각 GPU에 3개의 레이어를 할당하여 작업을 병렬로 수행할 수 있습니다.
2. 파이프라인 병렬화의 동작 방식
파이프라인 병렬화에서는 각 디바이스가 처리할 데이터를 순차적으로 전달받으면서 동시에 여러 데이터가 흐를 수 있습니다. 이를 통해 각 GPU가 모델의 다른 부분을 동시에 처리하면서 연산 효율을 극대화할 수 있습니다.
예시
- 모델 분할: 예를 들어, 모델이 총 8개 레이어로 이루어져 있고, 4개의 GPU가 있을 때 각 GPU에 2개의 레이어를 할당합니다.
- 데이터 흐름:
- 첫 번째 배치는 첫 번째 GPU에서 레이어 1과 2를 처리합니다.
- 처리된 결과는 두 번째 GPU로 전달되어 레이어 3과 4를 처리합니다.
- 동시에 두 번째 배치는 첫 번째 GPU에 들어가서 레이어 1과 2를 처리하게 됩니다.
- 연속적인 데이터 흐름: 각 디바이스가 앞선 데이터를 처리하는 동안 다음 배치가 준비되어 파이프라인 형태로 연속적으로 진행됩니다. 이 방식으로 여러 배치가 동시에 흐르며, 병렬로 처리되기 때문에 처리 속도가 증가합니다.
3. 파이프라인 병렬화의 장점
- 메모리 효율성: 모델의 모든 파라미터를 단일 GPU에 올릴 필요가 없어, GPU 메모리 사용을 최적화할 수 있습니다.
- 연산 효율성: 여러 배치가 동시에 흐르며 각 GPU가 병렬로 처리하므로, 연산 속도가 높아지고 GPU 활용이 최적화됩니다.
- 대규모 모델에 적합: GPT-3, GPT-4와 같은 대형 모델은 메모리 요구량이 크기 때문에 파이프라인 병렬화로 각 GPU에 모델의 일부만 할당하여 전체 모델을 서빙할 수 있습니다.
4. 파이프라인 병렬화의 단점 및 고려사항
- 통신 비용: 각 GPU 간의 통신이 발생하므로, GPU 간의 통신 비용이 늘어날 수 있습니다.
- 파이프라인 대기 시간 (Pipeline Bubble): 처음 몇 개의 배치가 파이프라인에 도달하기 전까지는 모든 GPU가 동시에 작업을 시작할 수 없어, 초기에는 일부 GPU가 대기 상태가 될 수 있습니다.
- 구현 복잡성: 모델을 GPU에 균등하게 분배하고 GPU 간 통신을 관리해야 하므로, 모델의 구조에 따라 구현이 복잡할 수 있습니다.
NVLink
NVLink는 NVIDIA가 개발한 고속 인터커넥트 기술로, 여러 GPU 간의 데이터 전송 속도를 크게 향상시키기 위해 설계되었습니다. 특히, 대용량 데이터와 복잡한 연산을 요구하는 딥러닝 모델 학습과 추론 환경에서 GPU 간 데이터 전송이 병목이 될 수 있는데, NVLink는 이러한 문제를 해결하고자 합니다.
NVLink의 주요 특징
- 고속 대역폭 제공
- NVLink는 GPU 간 데이터 전송 속도를 PCIe(PCI Express)보다 훨씬 빠르게 합니다. 최신 PCIe 4.0 대역폭이 최대 16 GB/s라면, NVLink 3.0는 600 GB/s에 달하는 대역폭을 제공합니다.
- 이처럼 높은 전송 속도로 인해 GPU 간 통신 병목이 줄어들고, 복잡한 모델의 학습이나 추론 속도를 크게 높일 수 있습니다.
- GPU 간 메모리 공유
- NVLink는 GPU 간 메모리를 가상으로 하나의 메모리 풀로 연결할 수 있습니다. 예를 들어, 두 개의 80GB A100 GPU가 NVLink로 연결된 경우, 총 160GB의 메모리 풀처럼 사용할 수 있습니다.
- 이는 대형 모델을 학습하거나 추론할 때 GPU 메모리 부족 문제를 해결하는 데 유리합니다.
- NVSwitch
- NVLink 기술을 확장하여 다수의 GPU를 상호 연결할 수 있는 NVSwitch도 제공됩니다. NVSwitch는 NVLink를 다중화하여, 여러 GPU가 동시에 연결되어 있을 때도 GPU 간 통신 속도가 유지되도록 합니다.
- 이는 DGX 시스템과 같은 고성능 AI 서버에서 대규모 병렬 처리를 가능하게 하며, 특히 대형 AI 모델의 병렬 학습 및 추론에 매우 유리합니다.
NVLink의 활용 사례
- 모델 병렬화: NVLink를 사용하면 여러 GPU가 모델의 서로 다른 부분을 동시에 처리할 수 있는 모델 병렬화(Model Parallelism)에 유리합니다. 특히 GPT-4와 같은 대형 모델을 학습할 때 모델의 레이어를 여러 GPU에 분할하여 처리할 수 있습니다.
- 파이프라인 병렬화와 텐서 병렬화: NVLink를 통해 빠른 GPU 간 통신이 가능하므로, 각 GPU가 모델의 일부를 병렬로 처리하면서 동시에 결과를 교환하는 파이프라인 병렬화와 텐서 병렬화에도 적합합니다.
- 대규모 데이터 병렬화: 여러 GPU가 동일한 모델 복사본을 처리하며, 각 GPU가 독립적으로 데이터를 학습하는 데이터 병렬화(Data Parallelism)에서, 각 GPU의 그레디언트 값을 합산하여 모델을 동기화하는 과정에서 NVLink는 데이터 전송 속도를 높여 효율적으로 활용됩니다.
NVLink의 장점과 한계
장점
- 통신 지연 최소화: GPU 간 데이터 전송 속도가 PCIe보다 빠르기 때문에 딥러닝 모델 학습 시 통신 병목이 줄어듭니다.
- 유연한 메모리 확장: GPU 메모리 용량을 합쳐 하나의 큰 메모리처럼 사용할 수 있어 대형 모델 학습에 유리합니다.
한계
- NVLink 지원 하드웨어 제한: NVLink는 주로 고급 NVIDIA GPU (예: A100, H100)에서 지원되며, 일반 소비자용 GPU에서는 사용할 수 없습니다.
- 비용: NVLink를 사용하는 고성능 시스템은 비용이 높아 일반적인 환경에서 도입하기 어렵습니다.
이 방식들은 단독으로 적용되기보다, 대형 모델에서는 여러 방식이 조합되어 사용됩니다. 예를 들어, 데이터 병렬화와 모델 병렬화를 함께 사용하여 각 디바이스가 데이터를 병렬로 처리하면서도, 모델의 특정 부분을 병렬화하는 식으로 최적화합니다.