모든 사진과 글은 위 링크를 참고했습니다.
분산 학습
모델 파라미터와 데이터 배치의 메모리 사용량이 크지 않다면, 1개의 GPU로 모델 학습을 진행하면 된다. 만약 그렇지 않은 경우엔 여러 GPU를 동시에 활용하는 분산 학습을 활용한다.
Data Parallelism(DP)
DP란 1개의 GPU로 모델 파라미터는 저장할 수 있지만, 데이터 배치까지 한번에 처리하긴 힘들 때(메모리 부족 또는 느린 속도) 활용한다. 배치 데이터를 여러 개의 GPU에 나눠서 gradient를 계산하기에 연산 속도가 빨라진다는 장점이 있다. 이를 위해선 각 GPU에서 계산한 gradient를 취합하는 과정이 필요하고, 따라서 빠른 연결(통신) 속도가 필요하다. 그렇지 않다면 병목이 일어나게 된다.
실제로 서버용 GPU인 A100, V100 등의 경우는 GPU 개수가 늘어남에 따라 거의 선형적으로 성능이 개선되지만, 상업용 GPU는 그렇지 않다. 위에 있는 표는 GPU 개수에 따른 성능 개선을 나타낸 표인데, V100과 상업용 GPU의 성능 증가율이 꽤 차이가 난다는 것을 확인할 수 있다.
Sharded Data-Parallelism
DP가 가능하려면 1개의 GPU에 모델 파라미터를 저장할 수 있어야 한다. 하지만 모델의 메모리 사용량이 커서 불가능한 경우엔 Sharded DP 활용할 수 있다. Sharded란 데이터 베이스에서 분산된 시스템에 데이터를 쪼개서 저장하는 방법인Sharding을 의미한다. Sharded DP에선 딥러닝 과정에 GPU를 많이 차지하는 '모델 파라미터', 'gradients', 'optimizer states'를 Sharding하여 메모리 사용량을 줄인다.
별도로 모델을 수정할 필요 없이, DeepSpeed와 FairScale 등의 라이브러리를 이용해 편하게(?) 사용할 수 있다.
Pipelined Model-Parallelism
모델 메모리가 너무 클 경우 모델의 Layer를 쪼개서 각 GPU에서 학습하는 방법도 있다. 이 경우 각 GPU가 최대한 활용될 수 있도록 Layer 마다 메모리 사용량을 계산하여 쪼개는 것이 중요하다.
Tensor-Parallelism
행렬 곱 과정은 위 그림과 같이 행 - 열 단위로 분해하여 나타낼 수 있다. 이 점을 활용하면 행렬 곱 과정에 굳이 모든 Tensor 성분을 사용하지 않아도 돼 메모리를 절약할 수 있고, 병렬 연산 덕에 병목 현상을 줄일 수 있다. 이를 위해선 빠른 통신 속도가 필요해 단일 노드 환경에서 효과적인 방법이라고 한다. 실제 병렬 연산 과정은 아래 그림과 같다.
참고 자료