Nebula를 사용하여 검사점 속도를 향상하고 비용 절감
성운을 사용하여 대규모 Azure Machine Learning 학습 모델의 검사점 속도를 높이고 검사점 비용을 줄이는 방법을 알아봅니다.
개요
Nebula는 빠르고 단순하며 디스크가 없는 모델 인식 검사점 도구로 ACPT(PyTorch용 Azure 컨테이너)에 포함됩니다. Nebula는 PyTorch를 사용하여 분산된 대규모 모델 학습 작업을 위한 간단한 고속 검사점 솔루션을 제공합니다. Nebula는 최신 분산 컴퓨팅 기술을 활용하여 검사점 시간을 시간에서 초로 줄여 95%에서 99.9%의 시간을 절약할 수 있습니다. 대규모 학습 작업은 Nebula의 성능을 크게 활용할 수 있습니다.
학습 작업에 성운을 사용할 수 있도록 하려면 스크립트에서 nebulaml
Python 패키지를 가져옵니다. 성운은 PyTorch Lightning, DeepSpeed 등을 비롯한 다양한 분산 PyTorch 학습 전략과 완전히 호환됩니다. Nebula API는 검사점 수명 주기를 모니터링하고 보는 간단한 방법을 제공합니다. API는 다양한 모델 유형을 지원하고 검사점 일관성과 안정성을 보장합니다.
Important
nebulaml
퍼블릭 PyPI Python 패키지 인덱스는 패키지를 사용할 수 없습니다. Azure Machine Learning의 ACPT(Azure Container for PyTorch) 큐레이팅 환경에서만 사용할 수 있습니다. 문제를 방지하려면 PyPI 또는 명령을 사용하여 pip
설치 nebulaml
하지 마세요.
이 문서에서는 Azure Machine Learning에서 ACPT와 함께 Nebula를 사용하여 모델 학습 작업을 신속하게 검사하는 방법을 알아봅니다. 또한 성운 검사점 데이터를 보고 관리하는 방법을 알아봅니다. 또한 Azure Machine Learning의 중단, 실패 또는 종료가 있는 경우 사용 가능한 마지막 검사점에서 모델 학습 작업을 다시 시작하는 방법을 알아봅니다.
대규모 모델 학습에 대한 검사점 최적화가 중요한 이유
데이터 볼륨이 증가하고 데이터 형식이 더 복잡해짐에 따라 기계 학습 모델도 더욱 정교해졌습니다. 이러한 복잡한 모델 학습은 GPU 메모리 용량 제한 및 학습 시간이 길기 때문에 어려울 수 있습니다. 따라서 분산 학습은 대용량 데이터 세트 및 복잡한 모델로 작업할 때 자주 사용됩니다. 그러나 분산 아키텍처는 예기치 않은 오류 및 노드 오류를 경험할 수 있으며, 기계 학습 모델의 노드 수가 증가함에 따라 점점 더 문제가 될 수 있습니다.
검사점은 지정된 시간에 전체 모델 상태의 스냅샷을 주기적으로 저장하여 이러한 문제를 완화하는 데 도움이 될 수 있습니다. 오류가 발생할 경우 이 스냅샷을 사용하여 스냅샷 시 모델을 해당 상태로 다시 빌드하여 해당 지점에서 학습을 다시 시작할 수 있습니다.
대규모 모델 학습 작업에 실패 또는 종료가 발생하는 경우 데이터 과학자와 연구원은 이전에 저장된 검사점에서 학습 프로세스를 복원할 수 있습니다. 그러나 저장되지 않은 중간 결과를 복구하려면 계산을 다시 실행해야 하므로 검사점과 종료 간의 진행률이 손실됩니다. 검사점 간격이 짧으면 이러한 손실을 줄일 수 있습니다. 이 다이어그램은 검사점에서 학습 프로세스와 종료 사이에 낭비되는 시간을 보여 줍니다.
그러나 검사점 자체를 저장하는 프로세스는 상당한 오버헤드를 생성할 수 있습니다. TB 크기의 검사점을 저장하면 동기화된 검사점 프로세스가 몇 시간 동안 학습을 차단하는 학습 프로세스에서 병목 현상이 발생할 수 있습니다. 평균적으로 검사점 관련 오버헤드는 총 학습 시간의 12%를 차지할 수 있으며 최대 43% (Maeng et al., 2021)까지 증가할 수 있습니다.
요약하자면, 대규모 모델 검사점 관리에는 많은 스토리지 및 작업 복구 시간 오버헤드가 포함됩니다. 사용 가능한 최신 검사점에서 학습 작업 재개와 결합된 빈번한 검사점 저장은 큰 과제가 됩니다.
구조에 성운
대규모 분산 모델을 효과적으로 학습하려면 데이터 손실 및 리소스 낭비를 최소화하는 학습 진행 상황을 저장하고 다시 시작하는 안정적이고 효율적인 방법을 사용하는 것이 중요합니다. 성운은 더 빠르고 쉬운 검사점 관리를 제공하여 대규모 모델 Azure Machine Learning 학습 작업에 대한 검사점 절약 시간 및 GPU 시간 수요를 줄이는 데 도움이 됩니다.
성운을 사용하면 다음을 수행할 수 있습니다.
학습 프로세스에서 비동기적으로 작동하는 간단한 API를 사용하여 검사점 속도를 최대 1,000회 향상시킵니다. 성운은 검사점 시간을 몇 시간에서 초로 줄일 수 있으며, 잠재적인 감소는 95%에서 99%로 감소할 수 있습니다.
이 예제에서는 Hugging Face GPT2, GPT2-Large 및 GPT-XL 학습 작업을 절약하는 네 가지 검사점의 검사점 및 엔드투엔드 학습 시간 감소를 보여 줍니다. 중간 크기의 Hugging Face GPT2-XL 검사점 저장(20.6GB)의 경우 성운은 하나의 검사점에서 96.9% 시간 감소를 달성했습니다.
모델 크기 및 GPU 번호로 검사점 속도 향상은 계속 증가할 수 있습니다. 예를 들어 128 A100 Nvidia GPU에서 97GB의 학습 지점 검사점 저장을 테스트하면 20분에서 1초로 축소할 수 있습니다.
검사점 오버헤드를 최소화하고 작업 복구에 낭비되는 GPU 시간을 줄여 대형 모델의 엔드투엔드 학습 시간 및 계산 비용을 줄입니다. 성운은 검사점을 비동기적으로 저장하고 학습 프로세스를 차단 해제하여 엔드 투 엔드 학습 시간을 줄입니다. 또한 더 자주 검사점 저장을 허용합니다. 이렇게 하면 중단 후 최신 검사점에서 학습을 다시 시작하고 작업 복구 및 GPU 학습 시간에 낭비되는 시간과 비용을 절약할 수 있습니다.
PyTorch와의 완전한 호환성을 제공합니다. 성운은 PyTorch와의 완전한 호환성을 제공하며 DeepSpeed(=0.7.3) 및 PyTorch Lightning(>>=1.5.0)을 비롯한 분산 학습 프레임워크와 완전한 통합을 제공합니다. Azure Machine Learning 컴퓨팅 또는 AKS와 같은 다양한 Azure Machine Learning 컴퓨팅 대상과 함께 사용할 수도 있습니다.
검사점을 나열, 가져오기, 저장 및 로드하는 데 도움이 되는 Python 패키지로 검사점을 쉽게 관리할 수 있습니다. 검사점 수명 주기를 표시하기 위해 성운은 Azure Machine Learning 스튜디오 대한 포괄적인 로그도 제공합니다. 로컬 또는 원격 스토리지 위치에 검사점을 저장하도록 선택할 수 있습니다.
- Azure Blob Storage
- Azure Data Lake Storage
- NFS
언제든지 몇 줄의 코드로 액세스할 수 있습니다.
필수 조건
- Azure 구독 및 Azure Machine Learning 작업 영역. 작업 영역 리소스 만들기에 대한 자세한 내용은 작업 영역 리소스 만들기를 참조하세요.
- Azure Machine Learning 컴퓨팅 대상입니다. 컴퓨팅 대상 만들기에 대한 자세한 내용은 학습 관리 및 컴퓨팅 배포를 참조하세요.
- PyTorch를 사용하는 학습 스크립트입니다.
- ACPT 큐레이팅(PyTorch용 Azure 컨테이너) 환경. ACPT 이미지를 가져오려면 큐레이팅된 환경을 참조하세요. 큐레이팅된 환경을 사용하는 방법 알아보기
성운을 사용하는 방법
성운은 기존 학습 스크립트에서 빠르고 쉬운 검사점 환경을 제공합니다. 성운을 빠르게 시작하는 단계는 다음과 같습니다.
ACPT 환경 사용
PyTorch 모델 학습을 위해 큐레이팅된 환경인 ACPT(Azure Container for PyTorch)에는 사전 설치된 종속 Python 패키지로 Nebula가 포함됩니다. ACPT(Azure Container for PyTorch)를 참조하여 큐레이팅된 환경을 확인하고, Azure Machine Learning에서 PyTorch용 Azure Container를 사용하여 심층 학습을 사용하도록 설정하여 ACPT 이미지에 대해 자세히 알아보세요.
성운 초기화
ACPT 환경에서 성운을 사용하도록 설정하려면 패키지를 가져오 nebulaml
도록 학습 스크립트를 수정한 다음 적절한 위치에서 성운 API를 호출하면 됩니다. Azure Machine Learning SDK 또는 CLI 수정을 방지할 수 있습니다. 또한 Azure Machine Learning Platform에서 대규모 모델을 학습하기 위한 다른 단계의 수정을 방지할 수 있습니다.
성운은 학습 스크립트에서 실행하려면 초기화가 필요합니다. 초기화 단계에서 다음 코드 조각과 같이 검사점 저장 위치 및 빈도를 결정하는 변수를 지정합니다.
import nebulaml as nm
nm.init(persistent_storage_path=<YOUR STORAGE PATH>) # initialize Nebula
성운은 DeepSpeed 및 PyTorch Lightning에 통합되었습니다. 따라서 초기화가 간단하고 쉬워집니다. 다음 예제에서는 학습 스크립트에 성운을 통합하는 방법을 보여 줍니다.
Important
성운을 사용하여 검사점을 저장하려면 검사점을 저장하는 데 약간의 메모리가 필요합니다. 메모리가 검사점 복사본 3개 이상보다 큰지 확인하세요.
메모리가 검사점을 보유하기에 충분하지 않은 경우 검사점을 저장할 때 각 노드당 메모리 사용을 제한하도록 명령에서 환경 변수 NEBULA_MEMORY_BUFFER_SIZE
를 설정하는 것이 좋습니다. 이 변수를 설정할 때 성운은 이 메모리를 버퍼로 사용하여 검사점을 저장합니다. 메모리 사용량이 제한되지 않으면 성운은 가능한 한 메모리를 사용하여 검사점을 저장합니다.
여러 프로세스가 동일한 노드에서 실행되는 경우 검사점을 저장하는 데 사용할 수 있는 최대 메모리는 프로세스 수로 나눈 제한의 절반이 됩니다. 성운은 다중 프로세스 조정을 위해 나머지 절반을 사용합니다. 예를 들어 각 노드당 메모리 사용량을 200MB로 제한하려는 경우 명령에서 환경 변수를 (바이트, 약 200MB)로 export NEBULA_MEMORY_BUFFER_SIZE=200000000
설정할 수 있습니다. 이 경우 성운은 200MB 메모리만 사용하여 각 노드에 검사점을 저장합니다. 동일한 노드에서 실행되는 프로세스가 4개인 경우 Nebula는 각 프로세스당 25MB 메모리를 사용하여 검사점을 저장합니다.
API를 호출하여 검사점 저장 및 로드
성운은 검사점 저장을 처리하는 API를 제공합니다. PyTorch torch.save()
API와 유사한 학습 스크립트에서 이러한 API를 사용할 수 있습니다. 다음 예제에서는 학습 스크립트에서 성운을 사용하는 방법을 보여 줍니다.
검사점 기록 보기
학습 작업이 완료되면 작업 Name> Outputs + logs
창으로 이동합니다. 왼쪽 패널에서 성운 폴더를 확장하고 성운 검사점 저장에 대한 자세한 정보(기간, 처리량 및 검사점 크기)를 보려면 선택합니다checkpointHistories.csv
.
예제
다음 예제에서는 다양한 프레임워크 형식으로 성운을 사용하는 방법을 보여 줍니다. 학습 스크립트에 가장 적합한 예제를 선택할 수 있습니다.
PyTorch 기반 학습 스크립트와 전체 성운 호환성을 사용하도록 설정하려면 필요에 따라 학습 스크립트를 수정합니다.
먼저 필요한
nebulaml
패키지를 가져옵니다.# Import the Nebula package for fast-checkpointing import nebulaml as nm
성운을 초기화하려면 다음과 같이 함수를
nm.init()
main()
호출합니다.# Initialize Nebula with variables that helps Nebula to know where and how often to save your checkpoints persistent_storage_path="/tmp/test", nm.init(persistent_storage_path, persistent_time_interval=2)
검사점을 저장하려면 원래
torch.save()
문을 바꿔 검사점을 성운으로 저장합니다. 검사점 인스턴스가 "global_step500" 또는 "global_step1000"과 같은 "global_step"로 시작하는지 확인하세요.checkpoint = nm.Checkpoint('global_step500') checkpoint.save('<CKPT_NAME>', model)
참고 항목
<'CKPT_TAG_NAME'>
은 검사점의 고유 ID입니다. 태그는 일반적으로 단계 수, epoch 번호 또는 사용자 정의 이름입니다. 선택적 선택적<'NUM_OF_FILES'>
매개 변수는 이 태그에 대해 저장할 상태 번호를 지정합니다.다음과 같이 유효한 최신 검사점을 로드합니다.
latest_ckpt = nm.get_latest_checkpoint() p0 = latest_ckpt.load(<'CKPT_NAME'>)
검사점 또는 스냅샷에 많은 파일이 포함될 수 있으므로 이름별로 하나 이상의 파일을 로드할 수 있습니다. 최신 검사점을 사용하면 학습 상태를 마지막 검사점에서 저장한 상태로 복원할 수 있습니다.
다른 API는 검사점 관리를 처리할 수 있습니다.
- 모든 검사점 나열
- 최신 검사점 가져오기
# Managing checkpoints ## List all checkpoints ckpts = nm.list_checkpoints() ## Get Latest checkpoint path latest_ckpt_path = nm.get_latest_checkpoint_path("checkpoint", persisted_storage_path)