파이프라인 선형 병렬성, 텐서 병렬성, 3D 병렬성의 세 가지 분산 훈련 방법에 대한 원리부터 구체적인 방법 사례까지 자세히 해석합니다.
파이프라인 선형 병렬 처리와 텐서 병렬 처리는 둘 다 제한된 단일 카드 그래픽 메모리를 사용하여 더 큰 모델을 훈련하려는 목적으로 모델 자체를 분할합니다 . 간단히 말하면, 파이프라인 병렬성은 모델을 수평으로 , 즉 레이어 별로 나누는 것이고 , 텐서 병렬성은 모델을 수직으로 나누는 것입니다 . 3D 병렬성은 인기 있는 라인 병렬성, 텐서 병렬성 및 데이터 병렬성을 모델 훈련에 동시에 적용합니다.
파이프라인 병렬성
파이프라인 병렬화의 목표는 더 큰 모델을 훈련시키는 것입니다. 이 섹션에서는 먼저 직관적인 순진한 계층 병렬 방법을 소개하고 그 한계를 분석합니다. 그런 다음 파이프라인 병렬 알고리즘 GPipe 및 PipeDream이 도입됩니다.
1. 순진한 레이어 병렬성
모델이 너무 커서 단일 GPU로 학습할 수 없는 경우 가장 직접적인 아이디어는 모델 레이어를 분할한 다음 분할된 부분을 다른 GPU에 배치하는 것입니다. 다음은 순진한 레이어 병렬성을 소개하는 예로 4계층 시퀀스 모델을 사용합니다. 애니메이션
위의 소개를 기반으로 순진한 레이어 병렬성의 단점을 찾을 수 있습니다.
-
낮은 GPU 활용도 . 언제든지 GPU는 하나만 작동하고 나머지 GPU는 유휴 상태입니다.
-
계산과 통신은 중복되지 않습니다 . GPU는 FWD(순방향 전파) 또는 BWD(역방향 전파)의 중간 결과를 보낼 때도 유휴 상태입니다.
-
높은 메모리 사용량 . GPU1은 최종 매개변수 업데이트가 완료될 때까지 전체 미니배치의 모든 활성화를 저장해야 합니다. 배치 크기가 크면 비디오 메모리에 큰 문제가 됩니다.
GPipe
GPipe의 원리
GPipe는 미니배치를 더 작고 동일한 크기의 마이크로배치로 나누어 효율성을 향상시킵니다. 구체적으로, 각 마이크로배치가 순방향 및 역방향 전파를 독립적으로 계산한 다음 각 마이크로배치의 기울기를 추가하여 전체 배치의 기울기를 얻습니다. 각 레이어는 하나의 GPU에만 있으므로 mircobatch의 기울기 합산은 로컬에서만 수행하면 되며 통신이 필요하지 않습니다.
4개의 GPU가 있고 모델이 레이어별로 4개의 부분으로 나누어져 있다고 가정합니다. 순진한 레이어 병렬 처리 프로세스는 다음과 같습니다.
시간 단계 | 0 | 1 | 2 | 삼 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
GPU3 | FWD | 흑백 | ||||||
GPU2 | FWD | 흑백 | ||||||
GPU1 | FWD | 흑백 | ||||||
GPU0 | FWD | 흑백 |
보시다시피 특정 시간에는 GPU 1개만 작동합니다. 그리고 GPU가 전체 미니배치 순방향 전파를 실행해야 하기 때문에 각 시간 간격은 상대적으로 오랜 시간이 걸립니다.
GPipe는 미니배치를 4개의 마이크로배치로 나눈 다음 이를 순차적으로 GPU0으로 보냅니다. GPU0에서 순방향 전파 후 결과는 GPU1로 전송됩니다. 전체 과정은 다음과 같습니다
시간 단계 | 0 | 1 | 2 | 삼 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
GPU3 | F1 | F2 | F3 | F4 | B4 | B3 | 지하 2층 | 지하 1층 | ||||||
GPU2 | F1 | F2 | F3 | F4 | B4 | B3 | 지하 2층 | 지하 1층 | ||||||
GPU1 | F1 | F2 | F3 | F4 | B4 | B3 | 지하 2층 | 지하 1층 | ||||||
GPU0 | F1 | F2 | F3 | F4 | B4 | B3 | 지하 2층 | 지하 1층 |
F1은 현재 GPU에 있는 레이어를 사용하여 microbatch1의 순방향 전파를 의미합니다 . GPipe의 스케줄링에서는 각 GPU가 마이크로배치만 처리하면 되므로 각 시간 단계에 소요되는 시간은 순진한 계층 병렬 처리보다 짧습니다.
GPipe 버블 문제
버블은 유효한 작업이 수행되지 않는 파이프라인의 지점을 나타냅니다. 이는 작업 간의 종속성 때문입니다. 예를 들어 GPU4는 GPU3이 F1 실행을 마칠 때까지만 기다릴 수 있습니다. 전체 파이프라인 프로세스의 버블은 아래 그림에 표시되어 있습니다. 따라서
마이크로배치 m의 수를 늘리면 기포의 비율을 줄일 수 있습니다.
GPipe의 그래픽 메모리 요구 사항
배치 크기를 늘리면 캐시에서 활성화해야 하는 메모리 요구 사항이 선형적으로 늘어납니다. GPipe에서 GPU는 순방향 전파에서 역방향 전파까지 활성화를 캐시해야 합니다. GPU0을 예로 들면, microbatch1의 활성화는 시간 단계 0부터 시간 단계 13까지 저장되어야 합니다.
GPipe는 비디오 메모리 문제를 해결하기 위해 Gradient Checkpointing을 사용합니다. 이 기술은 모든 활성화를 캐싱할 필요는 없지만 대신 역전파 중에 활성화를 다시 계산합니다. 이렇게 하면 비디오 메모리의 필요성이 줄어들지만 계산 비용이 증가합니다.
모든 레이어는 거의 동일하다고 가정됩니다. 각 GPU 캐시 활성화에 필요한 비디오 메모리는 PipeDream 입니다.
GPipe는 역전파를 시작하기 전에 모든 마이크로배치 순방향 전파가 완료될 때까지 기다려야 합니다. PipeDream은 마이크로배치의 순방향 전파가 완료된 후 즉시 역방향 전파 단계에 들어갑니다. 이론적으로 해당 마이크로배치 캐시의 활성화는 역전파가 완료된 후 폐기될 수 있습니다. PipeDream의 역전파는 GPipe보다 일찍 완료되므로 비디오 메모리의 필요성도 줄어듭니다.
아래 그림은 PipeDream, 4개의 GPU 및 8개의 마이크로배치의 스케줄링 다이어그램입니다. 파란색 사각형은 순방향 전파를 나타내고 녹색은 역전파를 나타내며 숫자는 마이크로배치의 ID입니다. PipeDream은 버블 측면에서 GPipe와 다르지 않지만, PipeDream이 비디오 메모리를 더 일찍 출시하기 때문에 비디오 메모리에 대한 수요가 줄어듭니다.
데이터 병렬성과 파이프라인 병렬성 병합
데이터 병렬성과 파이프라인 병렬성은 직교하며 동시에 사용할 수 있습니다.
-
파이프라인 병렬 처리용. 각 GPU는 다음 파이프라인 단계(순방향 전파) 또는 이전 파이프라인 단계(역전파)와 통신해야 합니다.
-
데이터 병렬성을 위해. 각 GPU는 동일한 레이어에 할당된 GPU와 통신해야 합니다. 모든 레이어의 복사본에는 그라디언트를 평균화하기 위해 AllReduce가 필요합니다.
이는 모든 GPU에서 하위 그룹을 형성하고 하위 그룹 내에서 집단 통신을 사용합니다. 모든 특정 GPU에는 통신의 두 부분이 있습니다. 하나는 GPU의 동일한 레이어(데이터 병렬)를 사용하고 다른 하나는 GPU의 다른 레이어(파이프라인 병렬)를 사용합니다. 아래 그림은 파이프라인 병렬도 2와 데이터 병렬도 2의 예시 다이어그램입니다. 가로 방향은 완전한 모델이고 세로 방향은 동일한 레이어의 다른 복사본입니다 .
텐서 병렬성
Transformer의 주요 구성 요소는 완전히 연결된 레이어와 어텐션 메커니즘이며, 그 핵심은 행렬 곱셈입니다. 텐서 병렬화의 핵심은 행렬 곱셈을 분할하여 단일 카드에 대한 모델의 메모리 요구 사항을 줄이는 것입니다 . ( 1) 행렬 곱셈 각도
(2) 활성화 기능 및 통신
분명히 위의 데이터 공식만 관찰하면 행 병렬이든 열 병렬이든 각 부분을 계산한 후 한 번만 수행하면 됩니다. 열 병렬 처리는 통신 결과를 연결하는 반면 행 병렬 처리는 통신 결과를 추가합니다 .
이제 비선형 활성화 GeLU를 추가하고 완전 연결된 레이어의 두 레이어를 시뮬레이션합니다. X를 입력으로 설정하고 A와 B를 완전히 연결된 두 레이어의 가중치로 설정합니다. 따라서 여러 개의 Full-Link 레이어를 적층하면 최종 출력 시 하나의 통신만 필요합니다(위 그림 참조) .
(3) 여러 개의 관심이 동시에 집중됨
Multi-head attention 병렬성은 1D 텐서 병렬성이 아니지만 1D 텐서 병렬성과 동시에 Megatron-LM에서 제안되었기 때문에 여기서도 간략하게 소개한다. 다중 헤드 어텐션의 각 헤드는 본질적으로 독립적이므로 각 헤드는 병렬로 작동할 수 있습니다.
참고: TP(텐서 병렬 처리)에는 매우 빠른 네트워크가 필요하므로 여러 노드에 걸친 텐서 병렬 처리는 권장되지 않습니다. 실제로 노드에 4개의 GPU가 있는 경우 가장 높은 텐서 병렬 처리는 4입니다.
2D, 2.5D 텐서 병렬성
1D 텐서 병렬화 이후 2D, 2.5D, 3D 텐서 병렬화가 점차 제안되었습니다. 다음은 2D 및 2.5D 텐서 병렬성에 대한 간략한 소개입니다.
2D 텐서 병렬
1D 텐서 병렬화는 활성화(즉, 모델의 중간 레이어의 출력 결과)를 분할하지 않으므로 많은 양의 비디오 메모리를 소비하게 됩니다. 브로드캐스팅이 수행되며, 각 프로세서는 별도로 계산합니다. 마지막으로 두 번째 행렬의 결과를 얻습니다.
두 행렬의 결과를 더합니다.
(2) 2.5D 텐서 병렬
3D 평행
일반적으로 3D 병렬성은 데이터 병렬성(DP), 텐서 병렬성(TP), 파이프라인 병렬성(PP)으로 구성됩니다. TP와 PP는 이전에 각각 소개된 바 있으며, ZeRO-DP는 메모리 효율적인 데이터 병렬 전략입니다.
다음은 세 가지 병렬 기술을 결합하여 3D 병렬 기술을 형성하는 방법에 대해 설명합니다.
3D 병렬 예제
두 개의 노드 Node1 과 Node2 가 있고 각 노드에는 8개의 GPU가 있어 총 16개의 GPU가 있다고 가정합니다. 16개 GPU의 번호는 Rank0, Rank1, ..., Rank15입니다. 또한 사용자가 파이프라인 병렬성을 4 로 설정 하고 텐서 병렬성을 2 로 설정했다고 가정합니다 .
파이프라인 병렬성 . 파이프라인 병렬 처리는 전체 모델을 4개 부분(여기서는 sub_model_1부터 sub_model_4까지)으로 나눕니다. 각각의 4개의 연속 GPU가 하나의 하위 모델을 담당합니다. 즉, 위 그림의 오른쪽 상단에는 같은 색상의 GPU들이 같은 sub_model을 담당하고 있는 것입니다 .
텐서 병렬성 . 텐서 병렬 처리는 파이프라인 병렬 처리에서 sub_model에 대한 텐서를 분할합니다. 즉, Rank0과 Rank1은 하나의 sub_model_1을 담당하고, Rank2와 Rank3은 또 다른 sub_model_1을 담당하고, Rank4와 Rank5는 sub_model_2를 담당하고, Rank6과 Rank7은 또 다른 sub_model_2를 담당하는 식입니다. 위 그림의 오른쪽 하단에서 녹색 선은 단일 텐서 병렬 그룹을 나타내며, 각 텐서 병렬 그룹은 특정 하위 모델을 공동으로 담당합니다.
데이터 병렬성 . 데이터 병렬성의 목적은 동일한 모델 매개변수가 동일한 데이터를 병렬로 읽도록 하는 것입니다 . 파이프라인 병렬 처리와 텐서 병렬 처리 이후 Rank0과 Rank2는 동일한 모델 매개변수를 담당하므로 Rank0과 Rank2는 동일한 데이터 병렬 그룹입니다. 위 그림의 왼쪽 상단에 있는 빨간색 선은 데이터 병렬 그룹을 나타냅니다. whaosoft aiot http://143ai.com
3D 평행 분석
3D 병렬화가 GPU를 위와 같은 방식으로 분할해야 하는 이유는 무엇입니까? 우선, 모델 병렬성은 세 가지 전략 중 가장 큰 통신 오버헤드를 가지므로 더 큰 노드 내 대역폭을 활용하려면 모델 병렬성 그룹을 한 노드에 배치하는 것이 바람직합니다. 둘째, 파이프라인에는 최소한의 병렬 통신이 있으므로 파이프라인은 통신 대역폭에 의해 제한되지 않는 서로 다른 노드 간에 예약됩니다. 마지막으로, 텐서 병렬성이 노드를 교차하지 않는 경우 데이터 병렬성은 노드를 교차할 필요가 없습니다. 그렇지 않으면 데이터 병렬 그룹도 노드를 교차해야 합니다.
파이프라인 병렬화 및 텐서 병렬화는 단일 그래픽 카드의 메모리 소비를 줄이고 메모리 효율성을 향상시킵니다. 그러나 모델을 너무 많이 나누면 통신 오버헤드가 증가하여 계산 효율성이 떨어집니다. ZeRO-DP는 옵티마이저 상태를 분할하여 메모리 효율성을 향상시킬 뿐만 아니라 통신 오버헤드도 크게 증가시키지 않습니다.
참고자료
https://siboehm.com/articles/22/pipeline-parallel-training
https://arxiv.org/pdf/1811.06965.pdf
https://huggingface.co/docs/transformers/v4.18.0/en/parallelism
https://www.colossalai.org/zh-Hans/docs/features/1D_tensor_parallel
https://www.microsoft.com/en-us/research/blog/deepspeed-extreme-scale-model-training-for-everyone/?utm_source=wechat_session&utm_medium=social&utm_oi=738477582021832704