NLP
[Day6] 한권으로 끝내는 실전 LLM 파인튜닝 - GPU 병렬화 기법
sara2601
2025. 1. 8. 23:40
다음은 <한권으로 끝내는 실전 LLM 파인튜닝> 도서의 스터디 Day6 요약입니다.
3.3 _ GPU 병렬화 기법
- 병렬화 : 컴퓨팅 자원을 동시에 활용해 대규모 작업을 효율적으로 처리.
3.3.1 데이터 병렬 처리(Data Parallelism)
- 데이터 병렬 처리(Data Parallelis, DP) : 전체 데이터를 작은 덩어리 여러 개로 나눠 각각을 서로 다른 GPU 계산 장치에서 동시에 처리해 전체 학습 과정의 속도를 높임.
- (1) 먼저 데이터를 여러 미니배치로 나눔
- (2) 모델 복사본을 각 GPU에 복사
- (3) 모든 GPU는 같은 모델 구조와 초깃값으로 시작해 각자의 데이터 배치에 대해 독립적으로 순전파, 역전파를 수행
- (4) 각 GPU에서 계산된 gradient를 모아 모델 복사본의 parameter를 갱신
- (5) 모든 계산이 끝난 뒤에는 각 모델의 가중치를 맞춰 모든 GPU가 동일 상태를 유지하도록 함. 이를 학습 주기마다 반복
- 장점 : 여러 GPU로 데이터를 동시에 처리해 학습 시간을 크게 단축 가능, 메모리 제약 없이 대규모 데이터셋을 효과적으로 다룰 수 있다.
- 단점 : GPU 간 gradient 수집과 parameter 동기화 과정에서 네트워크 통신 비용(overhead)이 발생할 수 있으며, 각 GPU마다 모델을 복제해야 하므로 VRAM을 많이 사용함. 또한 특정 GPU에 gradient가 모여 계산되기 때문에 모든 GPU의 VRAM을 균등하게 활용하지 못함. => 해결을 위해 모델 병렬화(MP) 기법이 등장.
3.3.2 모델 병렬화(Model Parallelism)
- 모델 병렬화(MP: Model Parallelism) : 대규모 신경망 모델을 여러 GPU에 나누어 처리하는 방식.
- 수직 모델 병렬화 : 모델을 수직으로 분할해 각 부분을 서로 다른 GPU에서 실행한다. .to() 메서드를 활용해 모델의 각 layer를 특정 GPU에 직접 할당. 데이터가 모델을 통과할 떄 각 layer에 해당하는 GPU로 데이터를 이동해 처리함.
- 장점 : GPU가 동일 컴퓨터 내에 있을 때는 비교적 빠르게 처리됨
- 단점 : GPU가 다른 물리적 기기에 위치한 경우 통신비용이 크게 증가, 특정 시점에 대부분의 GPU가 놀고 있을 수 있다. => 이런 문제 해결을 위해 파이프라인 병렬화가 등장함.
3.3.3 파이프라인 병렬화(PP)
- 모델을 여러 단계로 분할해 각 단계를 다른 계산 장치에서 동시에 실행함으로써 전체 모델의 실행 속도를 향상시키는 기법.
- MP와 거의 동일하나, 들어오는 배치를 미니 배치로 나누고 인위적으로 파이프라인을 생성해 여러 GPU가 계산 프로세스에 동시에 참여할 수 있도록 함.
- (1) 신경망의 각 층을 서로 다른 기기에 할당해, 각 기기는 순방향 연산(Forward)을 수행한 뒤 그 결과를 다음 기기로 전달하고, 역방향 연산(Backward)은 이전 결과를 바탕으로 계산된다.
- (2) 단순 모델 병렬화의 경우, 각 순방향과 역방향 연산 사이에 버블(Time)이라 불리는 대기 시간이 발생해 기기들이 다음 작업을 기다려야 하는 비효율이 생김. 이를 파이프라인 병렬화에서는 여러 작은 배치의 데이터를 각 기기가 동시에 처리하게 함으로써 해결함. 버블 유휴시간이 여전히 존재하지만, 단순 병렬화에 비해 그 크기가 상당히 줄어든다.
3.3.4 텐서 병렬 처리(Tensor Parallelism)
- 텐서 병렬 처리(TP : Tensor Parallelism) : 대규모 딥러닝 모델의 주요 계산 부하를 분산하는데 쓰이는 기법.
- 큰 텐서, ex) 가중치 행렬을 여러 GPU에 나눠 할당함. 각 GPU가 전체 텐서의 일부만 처리하므로 메모리 요구량이 줄고 계산 효율이 높아짐.
- 구현 : 각 텐서를 작은 부분 행렬로 나누고, 이를 각기 다른 GPU에 할당.
- 장점 : 메모리 사용의 효율성이 높아짐. 또한 계산 작업이 여러 장치에 분산되기 때문에 전체 처리 시간 단축가능하며 행렬연산 등의 복잡한 계산에 더 유리함.
- 단점 : 통신 오버헤드 (네트워크 대역폭, 지연 시간), 로직 구현 복잡도 높음
3.3.5 FSDP
- FSDP(Fully Sharded Data Parallel) : 모델을 샤드(Shards)라고 하는 더 작은 조각으로 분할하고, 각 GPU에 샤드를 할당해 실행함으로써 전체 모델의 메모리 요구 사항을 줄이는 것을 목표로 함.
- (1) 모델 샤딩 : 모델 parameter를 여러 개의 샤드로 나누고, 각 샤드를 별도의 GPU에 할당해 독립적으로 관리. (vs DP : 각 GPU가 전체 모델의 parameter를 모두 갖고있어야 함)
- (2) 메모리 절약 : GPU는 할당된 샤드의 parameter만을 메모리에 로드해 GPU의 메모리 사용을 최적화하고, 큰 모델을 더 적은 수의 GPU로 학습할 수 있게 함.
- (3) 동적 샤드 로딩 : 학습 과정에서 필요에 따라 parameter 샤드를 GPU 메모리에 로드하고, 사용이 끝나면 메모리에서 제거할 수 있어 메모리 리소스 제한적 환경에서 유리함.
- (4) 효율적인 gradient 집계 : 각 GPU에서 계산된 gradient는 중앙 집계 서버나 특정 GPU에서 수집되어 전체 모델 parameter 업데이트에 사용되며 FSDP는 이 과정에서 네트워크 통신 비용을 최소화함.
- 장점 : 확장성, 메모리 효율성, 유연성
- 단점 : 구현 복잡도, 올바른 샤딩 전략, 메모리 관리가 필요, 디버깅 및 오류 추정이 복잡.