기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
FP16모델 병렬화를 사용한 학습
FP16훈련을 위해 훈련 스크립트와 추정기에 다음과 같은 수정 사항을 적용하십시오.
참고
이 기능은 SageMaker 모델 병렬화 라이브러리 v1.10.0 PyTorch 이상에서 사용할 수 있습니다.
교육 스크립트를 수정하세요. PyTorch
-
smdistributed.modelparallel.torch.model_creation()
컨텍스트 관리자를 사용하여 모델을 래핑합니다. # fp16_training_script.py import torch import smdistributed.modelparallel.torch as smp with smp.model_creation( dtype=torch.float16 if args.fp16 else torch.get_default_dtype() ): model = ...
작은 정보
텐서 병렬 처리를 사용하는 경우
smp.model_creation
컨텍스트 관리자에tensor_parallelism=smp.tp_size() > 1
을 추가합니다. 이 줄을 추가하면 텐서 병렬 처리 활성화 여부를 자동으로 감지하는 데도 도움이 됩니다.with smp.model_creation( ... , tensor_parallelism=smp.tp_size() > 1 ): model = ...
-
옵티마이저를
smdistributed.modelparallel.torch.DistributedOptimizer
로 래핑할 경우static_loss_scaling
또는dynamic_loss_scaling
인수를 설정합니다. 기본적으로static_loss_scaling
는1.0
으로 설정되고dynamic_loss_scaling
는False
로 설정됩니다.dynamic_loss_scale=True
를 설정하면dynamic_loss_args
인수를 통해 동적 손실 크기 조정 옵션을 사전으로 제공할 수 있습니다. 대부분의 경우 기본 옵션과 함께 동적 손실 크기 조정을 사용하는 것이 좋습니다. 옵티마이저 래퍼 함수에 대한 자세한 내용, 옵션 및 예제는 smdistributed.modelparallel.torch를 참조하십시오. DistributedOptimizerAPI. 다음 코드는 FP16 훈련을 위해
Adadelta
옵티마이저 객체를 동적 손실 스케일링으로 래핑하는 예제입니다.optimizer = torch.optim.Adadelta(...) optimizer = smp.DistributedOptimizer( optimizer, static_loss_scale=
None
, dynamic_loss_scale=True
, dynamic_loss_args={ "scale_window":1000
, "min_scale":1
, "delayed_shift":2
} )
추정기 SageMaker PyTorch 구성
추정기 객체를 생성할 때 모델 병렬성을 위한 분포 구성에 FP16 파라미터 ("fp16"
) 를 추가합니다. SageMaker PyTorch 모델 병렬 처리용 구성 파라미터의 전체 목록은 smdistributed
용 구성
from sagemaker.pytorch import PyTorch smp_options = { "enabled": True, "parameters": { "microbatches":
4
, "pipeline_parallel_degree":2
, "tensor_parallel_degree":2
, ..., "fp16":True
} } fp16_estimator = PyTorch( entry_point="fp16_training_script.py
", # Specify your train script ..., distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": {...} } ) fp16_estimator.fit(...)
FP16훈련이 시작되면 모델과 옵티마이저는 FP16_Optimizer
각각 Apex 유틸리티의 수정된 smdistributed
버전인 FP16_Module
와 로 래핑됩니다.FP16_Module
모델을 FP16 dtype으로 변환하고 순방향 전달을 처리합니다. FP16
작은 정보
optimizer.step
전에 clip_master_grads
를 호출하여 그라디언트 클리핑을 적용합니다.
optimizer.clip_master_grads(max_norm) # max_norm(float or int): max norm of the gradients
작은 정보
torch.optim.lr_scheduler
사용하고 FP16 학습할 때는 옵티마이저가 아닌 LR optimizer.optimizer
스케줄러로 전달해야 합니다. 다음 예제 코드를 참조하세요.
from torch.optim.lr_scheduler import StepLR scheduler = StepLR( optimizer.optimizer if smp.state.cfg.fp16 else optimizer, step_size=1, gamma=args.gamma )