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

PyTorch 훈련 스크립트 조정

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

참고

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

PyTorch 1.12.0의 경우

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

  1. 후크를 생성합니다.

    (권장) SageMaker 내 훈련 작업용

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

    예측기에서 DebuggerHookConfig, TensorBoardConfig 또는 규칙을 사용하여 SageMaker Python SDK를 사용하여 Debugger로 훈련 작업 시작의 훈련 작업을 시작하면 SageMaker는 get_hook 함수가 선택한 훈련 인스턴스에 JSON 구성 파일을 추가합니다. 참고로, 예측기에 구성 API를 포함하지 않으면 후크가 찾을 수 있는 구성 파일이 없어지고 함수가 None를 반환한다는 점에 유의하세요.

    (선택 사항) SageMaker 외부 훈련 직무용

    SageMaker Notebook 인스턴스, Amazon EC2 인스턴스 또는 자체 로컬 디바이스에서 직접 로컬 모드에서 훈련 작업을 실행하는 경우 smd.Hook 클래스를 사용하여 후크를 생성하세요. 그러나 이 접근 방식은 텐서 컬렉션만 저장할 수 있으며 TensorBoard 시각화에 사용할 수 있습니다. SageMaker Debugger에 내장된 규칙은 로컬 모드에서 작동하지 않습니다. 규칙을 사용하려면 SageMaker ML 훈련 인스턴스와 S3가 원격 인스턴스의 출력을 실시간으로 저장해야 하기 때문입니다. 이 경우 smd.get_hook API가 None를 반환합니다.

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

    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 SDK를 사용하여 Debugger로 훈련 작업 시작에서 구성을 통해 제공할 정규 표현식과 일치하는 텐서를 찾습니다. 이 후크 메서드를 통해 컬렉션 가능한 텐서는 가중치, 편향, 활성화, 그라데이션, 입력 및 출력입니다.

    hook.register_module(model)
    작은 정보

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

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

    hook.register_loss 메서드는 손실 함수를 래핑하는 것입니다. SageMaker Python SDK를 사용하여 Debugger로 훈련 작업 시작에서 구성 중에 설정하는 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 SDK를 사용하여 Debugger로 훈련 작업 시작 섹션으로 넘어갑니다.