PyTorch - Amazon SageMaker

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

PyTorch

자체 PyTorch 모델을 교육 컴파일러로 SageMaker 가져와서 교육 컴파일러로 SageMaker 교육 작업을 실행하십시오.

PyTorch Hugging Face 트랜스포머 장착 모델

PyTorch Hugging Face Transformer가 탑재된 모델은 Torch.nn.Module PyTorch API를 기반으로 합니다. Hugging Face Transformer는 또한 자연어 처리 (NLP) 모델을 구성하는 데 드는 노력을 줄이는 데 도움이 되는 트레이너 및 사전 학습된 모델 클래스를 PyTorch 제공합니다. 학습 스크립트를 준비한 후에는 에서 다음 주제로 넘어갈 때 교육 컴파일러 구성과 함께 SageMaker PyTorch HuggingFace or 추정기를 사용하여 SageMaker 교육 작업을 시작할 수 있습니다. 트레이닝 컴파일러를 SageMaker 활성화하세요.

작은 정보

훈련 스크립트에서 변환기를 사용하여 NLP 모델용 토크나이저를 만들 때는 padding='max_length'를 지정하여 반드시 정적 입력 텐서 셰이프를 사용해야 합니다. padding='longest'은(는) 사용하지 마세요. 배치에서 가장 긴 시퀀스에 패딩하면 각 훈련 배치의 텐서 셰이프가 변경될 수 있습니다. 동적 입력 셰이프는 모델의 재컴파일을 시작하고 총 훈련 시간을 늘릴 수 있습니다. Transformers 토크나이저의 패딩 옵션에 대한 자세한 내용은 Hugging Face Transformers 설명서패딩 및 자르기를 참조하세요.

Hugging Face Transformers Trainer 클래스를 사용하는 대형 언어 모델

트랜스포머 라이브러리의 Trainer 클래스를 사용하는 경우 교육 스크립트를 추가로 변경할 필요가 없습니다. SageMaker 교육 컴파일러는 추정기 클래스를 통해 Trainer 모델을 활성화한 경우 Trainer 모델을 자동으로 컴파일합니다. 다음 코드는 Hugging Face Trainer API를 사용한 PyTorch 교육 스크립트의 기본 형식을 보여줍니다.

from transformers import Trainer, TrainingArguments training_args=TrainingArguments(**kwargs) trainer=Trainer(args=training_args, **kwargs)

단일 GPU 훈련용

transformers.Trainer 클래스를 사용할 때 코드를 변경할 필요가 없습니다.

분산형 훈련용

PyTorch v1.11.0 이상

훈련 컴파일러로 분산 훈련을 실행하려면 SageMaker 훈련 스크립트에 다음 _mp_fn() 함수를 추가하고 함수를 래핑해야 합니다. main() SageMaker 분산 런타임의 for PyTorch (pytorchxla) _mp_fn(index) 함수 호출을 훈련 스크립트의 main() 함수로 리디렉션합니다.

def _mp_fn(index): main()

이 함수는 분산 훈련용 클러스터 내 현행 GPU의 순위를 나타내는 index 인수를 수락합니다. 더 많은 예제 스크립트를 확인하려면 Hugging Face Transformers 언어 모델링 예제 스크립트를 참조하세요.

트랜스포머 v4.17 이전 버전 (v1.10.2 및 이전 버전) 의 경우 PyTorch

SageMaker 트레이닝 컴파일러는 분산 교육 작업을 시작하기 위해 대체 메커니즘을 사용하므로 트레이닝 스크립트를 수정할 필요가 없습니다. 대신 SageMaker Training Compiler를 사용하려면 SageMaker 분산 훈련 시작 프로그램 스크립트를 entry_point 인수에 전달하고 훈련 스크립트를 Hugging SageMaker Face 추정기의 hyperparameters 인수에 전달해야 합니다.

트레이닝 컴파일러를 다음과 함께 사용하는 모범 사례 SageMaker Trainer

훈련 스크립트 조정을 완료한 후 PyTorch 교육 컴파일러로 SageMaker 교육 작업 실행 섹션으로 넘어갑니다.

PyTorch 직접 사용하는 대형 언어 모델 (Hugging Face 트랜스포머 트레이너 API 제외)

PyTorch 직접 사용하는 학습 스크립트가 있는 경우 /XLA를 구현하려면 PyTorch 학습 스크립트를 추가로 변경해야 합니다. PyTorch 지침에 따라 /XLA 프리미티브를 올바르게 설정하도록 스크립트를 수정하십시오. PyTorch

단일 GPU 훈련의 경우

  1. 최적화 라이브러리를 가져오세요.

    import torch_xla import torch_xla.core.xla_model as xm
  2. 대상 디바이스를 torch.device("cuda") 대신 XLA로 변경하세요.

    device=xm.xla_device()
  3. PyTorch의 자동 혼합 정밀도 (AMP) 를 사용하는 경우 다음을 수행하십시오.

    1. torch.cuda.amp을 다음으로 바꿉니다.

      import torch_xla.amp
    2. torch.optim.SGDtorch.optim.Adam을(를) 다음 항목으로 바꾸세요.

      import torch_xla.amp.syncfree.Adam as adam import torch_xla.amp.syncfree.SGD as SGD
    3. torch.cuda.amp.GradScaler을 다음으로 바꿉니다.

      import torch_xla.amp.GradScaler as grad_scaler
  4. AMP를 사용하지 않을 경우, optimizer.step()을(를) 다음 항목으로 바꾸세요.

    xm.optimizer_step(optimizer)
  5. 분산 데이터 로더를 사용하는 경우 데이터 로더를 /XLA의 PyTorch 클래스로 래핑하십시오. ParallelLoader

    import torch_xla.distributed.parallel_loader as pl parallel_loader=pl.ParallelLoader(dataloader, [device]).per_device_loader(device)
  6. parallel_loader을(를) 사용하지 않을 경우, 훈련 루프 끝에 mark_step을(를) 추가하세요.

    xm.mark_step()
  7. 학습을 체크포인트로 만들려면 /XLA의 모델 체크포인트 메서드를 사용하세요. PyTorch

    xm.save(model.state_dict(), path_to_save)

훈련 스크립트 조정을 완료한 후 PyTorch 교육 컴파일러로 SageMaker 교육 작업 실행 섹션으로 넘어갑니다.

분산 훈련의 경우

이전 단일 GPU 훈련의 경우 섹션에 나열된 변경 사항 외에도 다음 변경 사항을 추가하여 GPU 전체에 워크로드를 올바르게 분배하세요.

  1. AMP를 사용하려면 scaler.scale(loss).backward() 다음에 all_reduce을(를) 추가하세요.

    gradients=xm._fetch_gradients(optimizer) xm.all_reduce('sum', gradients, scale=1.0/xm.xrt_world_size())
  2. local_ranksworld_size의 변수를 설정해야 하는 경우 다음과 유사한 코드를 사용하세요.

    local_rank=xm.get_local_ordinal() world_size=xm.xrt_world_size()
  3. 1보다 큰 world_size(num_gpus_per_node*num_nodes)의 경우에는 다음과 유사한 훈련 샘플러를 정의해야 합니다.

    import torch_xla.core.xla_model as xm if xm.xrt_world_size() > 1: train_sampler=torch.utils.data.distributed.DistributedSampler( train_dataset, num_replicas=xm.xrt_world_size(), rank=xm.get_ordinal(), shuffle=True ) train_loader=torch.utils.data.DataLoader( train_dataset, batch_size=args.batch_size, sampler=train_sampler, drop_last=args.drop_last, shuffle=False if train_sampler else True, num_workers=args.num_workers )
  4. torch_xla distributed 모듈에서 제공하는 parallel_loader을(를) 사용할 수 있도록 다음 변경 사항을 적용하세요.

    import torch_xla.distributed.parallel_loader as pl train_device_loader=pl.MpDeviceLoader(train_loader, device)

    train_device_loader함수는 일반 PyTorch 로더와 비슷하며 다음과 같습니다.

    for step, (data, target) in enumerate(train_device_loader): optimizer.zero_grad() output=model(data) loss=torch.nn.NLLLoss(output, target) loss.backward()

    이러한 모든 변경 사항을 적용하면 Transformer Trainer API가 없어도 모든 PyTorch 모델에서 분산 교육을 시작할 수 있을 것입니다. 이 지침은 단일 노드 다중 GPU와 다중 노드 다중 GPU 양쪽에 사용할 수 있습니다.

  5. PyTorch v1.11.0 이상용

    훈련 컴파일러로 분산 훈련을 실행하려면 SageMaker 훈련 스크립트에 다음 _mp_fn() 함수를 추가하고 함수를 래핑해야 합니다. main() SageMaker 분산 런타임의 for PyTorch (pytorchxla) _mp_fn(index) 함수 호출을 훈련 스크립트의 main() 함수로 리디렉션합니다.

    def _mp_fn(index): main()

    이 함수는 분산 훈련용 클러스터 내 현행 GPU의 순위를 나타내는 index 인수를 수락합니다. 더 많은 예제 스크립트를 확인하려면 Hugging Face Transformers 언어 모델링 예제 스크립트를 참조하세요.

    트랜스포머 v4.17 이전 버전 (v1.10.2 및 이전 버전) 의 경우 PyTorch

    SageMaker 훈련 컴파일러는 분산 훈련 작업을 시작하기 위한 대체 메커니즘을 사용하므로 분산 훈련 시작 프로그램 스크립트를 entry_point 인수에 전달하고 훈련 스크립트를 Hugging SageMaker Face 추정기의 hyperparameters 인수에 전달해야 합니다. SageMaker

훈련 스크립트 조정을 완료한 후 PyTorch 교육 컴파일러로 SageMaker 교육 작업 실행 섹션으로 넘어갑니다.

/XLA와 함께 훈련 컴파일러를 사용하는 모범 사례 SageMaker PyTorch

네이티브 트레이닝 스크립트에서 SageMaker PyTorch 트레이닝 컴파일러를 활용하려면 먼저 XLA 기기에 PyTorch 익숙해지는 것이 좋습니다. 다음 섹션에는 XLA를 활성화하기 위한 몇 가지 모범 사례가 나와 있습니다. PyTorch

참고

이 모범 사례 섹션에서는 다음과 같은 PyTorch /XLA 모듈을 사용한다고 가정합니다.

import torch_xla.core.xla_model as xm import torch_xla.distributed.parallel_loader as pl
/XLA의 지연 모드 이해하기 PyTorch

/XLA와 native의 한 가지 중요한 차이점은 PyTorch /XLA 시스템은 지연 모드에서 실행되는 PyTorch 반면 네이티브 PyTorch 시스템은 Eager 모드에서 실행된다는 것입니다. PyTorch 지연 모드의 텐서는 컴파일 및 평가가 완료된 후 구체화될 때까지 계산 그래프를 작성하기 위한 자리 표시자 역할을 합니다. PyTorch/XLA 시스템은 API를 PyTorch 호출하여 텐서와 연산자를 사용하여 계산을 작성할 때 순식간에 계산 그래프를 작성합니다. 이 계산 그래프는 pl.MpDeviceLoader/pl.ParallelLoader이(가) 명시적으로 또는 암시적으로 xm.mark_step()을(를) 호출하는 경우, 아니면 loss.item() 또는 print(loss)을(를) 호출하는 등 텐서 값을 명시적으로 요청하는 경우에 컴파일되고 실행됩니다.

사용 pl.MpDeviceLoader/pl.ParallelLoader 횟수를 최소화하고 compilation-and-executionsxm.step_closure

최상의 성능을 얻으려면 에 설명된 compilation-and-executions대로 시작할 수 있는 방법을 염두에 두고 compilation-and-executions 횟수를 최소화해야 합니다. /XLA의 지연 모드 이해하기 PyTorch 이상적으로는 훈련 반복당 하나만 compilation-and-execution 필요하며 에 의해 자동으로 시작됩니다. pl.MpDeviceLoader/pl.ParallelLoader MpDeviceLoader은(는) XLA에 최적화되어 있으며 최고 성능을 구현할 수 있도록 항상(가능한 경우) 사용해야 합니다. 훈련 기간 동안 일부 중급 결과(예: 손실값)를 검토해 보는 것이 좋습니다. 이런 경우에는 레이지 텐서의 인쇄를 를 를 사용하여 래핑해서 xm.add_step_closure() 불필요한 일이 없도록 해야 합니다. compilation-and-executions

AMP 및 syncfree 최적화 프로그램 사용

자동 혼합 정밀도 (AMP) 모드에서 훈련하면 NVIDIA GPU의 Tensor 코어를 활용하여 훈련 속도를 크게 가속화할 수 있습니다. SageMaker 트레이닝 컴파일러는 XLA에 syncfree 최적화된 옵티마이저를 제공하여 AMP 성능을 개선합니다. 현재는 다음 3가지 syncfree 최적화 프로그램을 사용할 수 있으며, 최고 성능을 구현하기 위해서는 가능한 경우 해당 최적화 프로그램을 사용해야 합니다.

torch_xla.amp.syncfree.SGD torch_xla.amp.syncfree.Adam torch_xla.amp.syncfree.AdamW

이들 syncfree 최적화 프로그램은 그라데이션 조정/조정 취소 시 torch_xla.amp.GradScaler(으)로 페어링해야 합니다.

작은 정보

PyTorch 1.13.1부터 SageMaker 교육 컴파일러는 PyTorch /XLA가 옵티마이저 (예: SGD, Adam, AdamW) 를 동기화가 없는 버전 (예:,) 에서 torch.optim 자동으로 오버라이드하도록 함으로써 성능을 개선합니다. transformers.optimization torch_xla.amp.syncfree torch_xla.amp.syncfree.SGD torch_xla.amp.syncfree.Adam torch_xla.amp.syncfree.AdamW 훈련 스크립트에서 최적화 프로그램을 정의할 경우에는 해당 코드 행을 변경할 필요가 없습니다.