모델의 큰 가중치 행렬을 쪼개 한 층의 계산을 같은 서버 안 GPU 여러 장이 나눠 맡게 하는 분산 기법이다. GPU 한 장에 다 안 들어가는 큰 모델을 학습하거나 서빙할 때 쓰며, 층을 나누는 파이프라인 병렬화나 데이터를 나누는 데이터 병렬화와 섞어 쓴다.
| 방식 | 무엇을 나누나 | 이럴 때 쓴다 |
|---|---|---|
| 텐서 병렬화 | 한 층 안의 행렬 | 서버 한 대 안에서 큰 모델을 올릴 때 |
| 파이프라인 병렬화 | 층을 순서대로 | 서버 여러 대에 걸쳐 나눌 때 |
| 데이터 병렬화 | 입력 데이터 | 모델은 들어가고 처리량을 늘리고 싶을 때 |
예를 들어 70B 모델은 FP16 기준으로 가중치만 140GB라서 80GB GPU 한 장에 들어가지 않는다. 이럴 때 같은 서버 안의 GPU 여러 장에 모델을 나눠 올린다.
큰 행렬 W를 열 방향으로 4등분해 GPU 4장에 하나씩 나눠 준다. 각 GPU는 자기 몫만 계산하고, 결과를 서로 주고받아 합친 뒤 다음 층으로 넘어간다. NVIDIA의 Megatron-LM이 트랜스포머에 맞게 이 방식을 정리했고, 지금 쓰이는 학습·서빙 도구 대부분이 이 아이디어를 따른다.
GPU마다 모델의 일부만 들고 있으니 메모리 부담이 GPU 수만큼 나뉜다. 계산도 동시에 하니까 답 하나를 만드는 시간(지연)도 줄어든다.
직접 모델을 서빙한다면 vLLM 실행 때 --tensor-parallel-size에 GPU 수를 넣으면 된다. 예를 들어 --tensor-parallel-size 4로 주면 GPU 4장에 모델이 나뉜다. 학습에서는 Megatron-LM 같은 프레임워크에서 텐서 병렬 크기를 설정해 쓴다.
| 상황 | 설정 방향 |
|---|---|
| 모델이 GPU 한 장에 들어감 | 쓰지 않는다 (1) |
| 한 장엔 안 들어가고 서버 한 대엔 들어감 | 서버 안 GPU 수만큼 (2, 4, 8) |
| 서버 한 대로도 부족함 | 서버 안은 텐서, 서버 사이는 파이프라인 병렬 |
층마다 GPU끼리 결과를 주고받아야 하므로 GPU 사이 연결이 느리면 오히려 느려진다. 그래서 NVLink처럼 빠르게 연결된 같은 서버 안의 GPU끼리 묶는 게 일반적이다. 서버를 넘어가면 통신이 적은 파이프라인 병렬화를 섞는다.
작은 모델에 GPU를 많이 붙이면 통신 비용 때문에 이득이 거의 없다. 이때는 모델 복사본을 여러 개 띄우는 데이터 병렬이 처리량 면에서 낫다. 또 GPU 수는 보통 2, 4, 8처럼 모델의 어텐션 헤드 수를 나눌 수 있는 값이어야 한다.
가장 흔한 건 GPU 한 장에 안 들어가는 모델을 직접 서빙하는 경우다. 서버 한 대의 GPU 여러 장에 모델 하나를 나눠 올리고, 요청이 늘면 이런 묶음을 여러 개 띄워 처리량을 늘린다.
| 어디서 | 어떻게 쓰나 |
|---|---|
| 자체 LLM 서빙 | vLLM에서 --tensor-parallel-size를 서버 안 GPU 수로 두고 70B급 모델을 한 서버에 올린다 |
| 대형 모델 학습 | Megatron-LM 같은 프레임워크에서 서버 안은 텐서, 서버 사이는 파이프라인·데이터 병렬로 묶는다 |
| 응답 지연 줄이기 | 모델이 한 장에 들어가더라도 답을 빨리 내야 하면 GPU 여러 장에 계산을 나눈다 |