Intel 기술을 활용한 PyTorch 분산 미세 조정 가속화
Hugging Face는 Intel Xeon Scalable CPU 서버 클러스터에 PyTorch 미세 조정 작업을 분산함으로써 훈련 시간을 크게 단축할 수 있음을 입증했으며, 이는 전이 학습 작업에서 GPU 기반 훈련을 대체할 수 있는 실행 가능한 대안을 제공합니다. Intel의 Ice Lake 아키텍처와 최적화된 소프트웨어 라이브러리를 활용하여, 1개에서 4개 노드로 확장할 때 최대 3배의 훈련 속도 향상을 달성했습니다.
Intel Ice Lake를 통한 하드웨어 가속
최적의 성능을 위해, 이 설정은 Ice Lake 아키텍처 기반의 Intel 서버를 활용합니다. 이 하드웨어는 딥러닝 연산을 가속화하는 특정 기능을 지원합니다:
- Intel AVX-512: 고성능 컴퓨팅을 위한 Advanced Vector Extensions.
- Intel Vector Neural Network Instructions (VNNI): 신경망 추론 및 훈련 속도를 높이기 위해 설계된 특수 명령어.
이러한 기능은 Amazon EC2 (M6i 및 C6i 인스턴스), Azure (Dv5, Dsv5, Ddv5, Ddsv5, Edv5 및 Edsv5 시리즈), 그리고 Google Cloud Platform (N2 Compute Engine VM)을 포함한 주요 클라우드 제공업체에서 사용할 수 있습니다.
소프트웨어 최적화 스택
Intel CPU의 하드웨어 기능을 완전히 활용하기 위해, 두 가지 주요 소프트웨어 구성 요소가 PyTorch 워크플로우에 통합됩니다:
Intel Extension for PyTorch
Intel extension for PyTorch는 PyTorch가 AVX-512 및 VNNI를 활용할 수 있도록 하여 훈련 및 추론 모두에서 즉각적인 속도 향상을 제공합니다.
Intel oneAPI Collective Communications Library (oneCCL)
분산 훈련은 대규모 모델이 상태 정보를 교환할 때 종종 네트워킹 병목 현상에 직면합니다. Intel oneAPI Collective Communications Library (oneCCL)는 torch.distributed의 통신 백엔드로 사용되어, 분산 훈련 중에 노드를 동기화하는 데 중요한 all-reduce와 같은 통신 패턴을 효율적으로 처리합니다.
성능 벤치마크
MRPC 데이터셋(GLUE 벤치마크의 일부)에서 미세 조정된 BERT 모델을 사용하여, Hugging Face는 다양한 클러스터 크기에 따른 훈련 시간을 측정했습니다. 기준점은 단일 노드(Amazon EC2 c6i.16xlarge 인스턴스)로 설정되었습니다.
MRPC 데이터셋 결과
| Cluster Size | Training Time | Speedup |
|---|---|---|
| 1 Node | 7m 46s | Baseline |
| 2 Nodes | 4m 39s | 1.7x |
| 4 Nodes | 2m 36s | 3x |
QQP 데이터셋 결과
400,000개 이상의 훈련 샘플을 포함하는 훨씬 더 큰 데이터셋인 Quora Question Pairs (QQP) 작업의 경우, 속도 향상은 일관되게 유지되었습니다:
| Cluster Size | Training Time | Speedup |
|---|---|---|
| 1 Node | 11h 22m | Baseline |
| 2 Nodes | 6h 38m | 1.71x |
| 4 Nodes | 3h 51m | 2.95x |
구현 요구 사항
분산 환경을 설정하려면 호환성 및 성능을 보장하기 위해 특정 구성 단계가 필요합니다:
- Infrastructure: 마스터와 워커 노드 간에 비밀번호 없는 SSH가 구성된 동일한 인스턴스, 그리고 내부 oneCCL 통신을 위해 모든 TCP 포트가 열려 있어야 합니다.
- Dependency Matching: PyTorch와 Intel extension for PyTorch의 버전이 일치해야 합니다 (예: PyTorch 1.9.0 및
torch_ipex1.9.0). - Script Modifications: 훈련 스크립트는
torch_ccl을 임포트하고, 환경 변수(예:PMI_RANK)를 통해 로컬 랭크를 처리하며, CCL 백엔드를 위한 마스터 노드 주소와 포트를 구성하도록 업데이트되어야 합니다. - Execution: 작업은 프로세스 수와 노드당 프로세스 수를 지정하기 위해
mpirun을 사용하여 실행됩니다.
Sources
관련
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch