PyTorch 훈련 스크립트 조정 - Amazon SageMaker

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

PyTorch 훈련 스크립트 조정

모델 출력 텐서 수집을 시작하고 훈련 문제를 디버깅하려면 PyTorch 훈련 스크립트를 다음과 같이 수정합니다.

참고

SageMaker 디버거는 torch.nn.functional API 작업에서 모델 출력 텐서를 수집할 수 없습니다. PyTorch 훈련 스크립트를 작성할 때는 대신 torch.nn 모듈을 사용하는 것이 좋습니다.

PyTorch 1.12.0의 경우

PyTorch 훈련 스크립트를 가져오는 경우 훈련 작업을 실행하고 훈련 스크립트에 몇 개의 추가 코드 줄을 사용하여 모델 출력 텐서를 추출할 수 있습니다. sagemaker-debugger 클라이언트 라이브러리에서 후크APIs를 사용해야 합니다. 코드 예제를 사용하여 단계를 세분화하는 다음 지침을 살펴보세요.

  1. 후크를 생성합니다.

    (권장) 내 훈련 작업의 경우 SageMaker

    import smdebug.pytorch as smd hook=smd.get_hook(create_if_not_exists=True)

    추정기의 SageMaker DebuggerHookConfig TensorBoardConfig, 또는 규칙 중 하나를 SageMaker Python을 사용하여 Debugger로 훈련 작업 시작 SDK 사용하여 에서 훈련 작업을 시작하면 는 get_hook 함수가 픽업하는 훈련 인스턴스에 JSON 구성 파일을 추가합니다. APIs 추정기에 구성을 포함하지 않으면 후크가 찾을 구성 파일이 없으며 함수가 를 반환합니다None.

    (선택 사항) 외부 훈련 작업의 경우 SageMaker

    SageMaker 노트북 인스턴스, Amazon 인스턴스 EC2 또는 자체 로컬 디바이스에서 직접 로컬 모드에서 훈련 작업을 실행하는 경우 smd.Hook 클래스를 사용하여 후크를 생성합니다. 그러나 이 접근 방식은 텐서 컬렉션만 저장할 수 있으며 TensorBoard 시각화에 사용할 수 있습니다. SageMaker 규칙은 원격 인스턴스의 출력을 실시간으로 저장하도록 SageMaker ML 훈련 인스턴스 및 S3를 요구하기 때문에 디버거의 기본 제공 규칙은 로컬 모드에서 작동하지 않습니다. 이 경우 는 Nonesmd.get_hook API 반환합니다.

    로컬 모드에서 텐서를 저장하기 위해 수동 후크를 생성하려면 로직과 함께 다음 코드 조각을 사용하여 가 smd.get_hook API 반환되는지 확인하고 smd.Hook 클래스를 사용하여 수동 후크를 None 생성합니다. 참고로 사용자는 로컬 머신의 모든 출력 디렉터리를 지정할 수 있습니다.

    import smdebug.pytorch as smd hook=smd.get_hook(create_if_not_exists=True) if hook is None: hook=smd.Hook( out_dir='/path/to/your/local/output/', export_tensorboard=True )
  2. 후크의 클래스 메서드로 모델을 래핑하세요.

    hook.register_module() 메서드는 모델을 가져와 각 레이어를 반복하면서 SageMaker Python을 사용하여 Debugger로 훈련 작업 시작 SDK에서 구성을 통해 제공할 정규 표현식과 일치하는 텐서를 찾습니다. 이 후크 메서드를 통해 컬렉션 가능한 텐서는 가중치, 편향, 활성화, 그라데이션, 입력 및 출력입니다.

    hook.register_module(model)
    작은 정보

    대규모 딥러닝 모델에서 전체 출력 텐서를 컬렉션하면 해당 컬렉션의 전체 크기가 기하급수적으로 증가하여 병목 현상이 발생할 수 있습니다. 특정 텐서를 저장하려는 경우 hook.save_tensor() 메서드를 사용할 수도 있습니다. 이 메서드를 사용하면 특정 텐서의 변수를 선택하고 원하는 이름의 사용자 지정 컬렉션에 저장할 수 있습니다. 이 단계에 대한 자세한 내용은 7단계를 참조하세요.

  3. 후크의 클래스 메서드를 사용하여 손실 함수를 왜곡하세요.

    hook.register_loss 메서드는 손실 함수를 래핑하는 것입니다. SageMaker Python을 사용하여 Debugger로 훈련 작업 시작 SDK에서 구성 중에 설정하는 save_interval마다 손실 값을 추출하여 "losses" 컬렉션에 저장합니다.

    hook.register_loss(loss_function)
  4. 훈련 블록에 hook.set_mode(ModeKeys.TRAIN)을 추가합니다. 이는 텐서 컬렉션이 훈련 단계에서 추출되었음을 나타냅니다.

    def train(): ... hook.set_mode(ModeKeys.TRAIN)
  5. 검증 블록에 hook.set_mode(ModeKeys.EVAL)를 추가합니다. 이는 텐서 컬렉션이 검증 단계에서 추출되었음을 나타냅니다.

    def validation(): ... hook.set_mode(ModeKeys.EVAL)
  6. 사용자 지정 스칼라를 저장하는 데 hook.save_scalar()를 사용합니다. 사용자는 모델에 없는 스칼라 값을 저장할 수 있습니다. 예를 들어, 평가 중에 계산된 정확도 값을 기록하려면 정확도를 계산하는 줄 아래에 다음 코드 줄을 추가하세요.

    hook.save_scalar("accuracy", accuracy)

    참고로 사용자 지정 스칼라 컬렉션의 이름을 지정하려면 문자열을 첫 번째 인수로 제공해야 합니다. 에서 스칼라 값을 시각화하는 데 사용되는 이름 TensorBoard이며 원하는 문자열일 수 있습니다.

  7. 사용자 지정 텐서를 저장하는 데 hook.save_tensor()를 사용합니다. hook.save_scalar()와 마찬가지로 사용자는 텐서를 추가로 저장하여 고유한 텐서 컬렉션을 정의할 수 있습니다. 예를 들어, 사용자는 모델에 전달된 입력 이미지 데이터를 추출하고 다음 코드 라인을 추가하여 사용자 지정 텐서로 저장할 수 있습니다. 여기서 "images"는 사용자 지정 텐서의 예제 이름이고, image_inputs는 입력 이미지 데이터의 예제 변수입니다.

    hook.save_tensor("images", image_inputs)

    참고로 사용자 지정 텐서의 이름을 지정하려면 첫 번째 인수에 문자열을 제공해야 합니다. hook.save_tensor()는 사용자 지정 텐서를 저장할 텐서 컬렉션을 지정하는 세 번째 인수 collections_to_write가 있습니다. 기본값은 collections_to_write="default"입니다. 세 번째 인수를 명시적으로 지정하지 않으면 사용자 지정 텐서가 "default" 텐서 컬렉션에 저장됩니다.

훈련 스크립트 조정을 완료한 후 SageMaker Python을 사용하여 Debugger로 훈련 작업 시작 SDK 섹션으로 넘어갑니다.