Amazon Web Services 한국 블로그

새로운 기능 – Amazon SageMaker Debugger 기반 기계 학습 훈련 작업 프로파일링

오늘 Amazon SageMaker Debugger가 기계 학습 모델을 프로파일링하여 하드웨어 리소스 사용으로 인한 훈련 문제를 훨씬 쉽게 식별하고 수정할 수 있음을 발표하게 되어 매우 기쁩니다.

다양한 비즈니스 문제에 대해 인상적인 성능을 발휘하고 있지만 기계 학습(ML)은 여전히 신비한 주제입니다. 이를 바로 잡는 것은 과학, 장인 정신(일부는 마법사라고 말할 것입니다), 때로는 행운의 연금술입니다. 특히 모델 훈련은 데이터 세트의 품질, 알고리즘, 파라미터 및 훈련 중인 인프라에 따라 결과가 달라지는 복잡한 프로세스입니다.

딥 러닝처럼 ML 모델이 점점 더 커지고 복잡해짐에 따라, 점점 대두되고 있는 문제는 모델을 훈련시키는 데 필요한 인프라의 양입니다. 예를 들어, 공개적으로 사용 가능한 COCO 데이터 세트에 대한 BERT 훈련은 8개의 NVIDIA V100 GPU가 있는 단일 p3dn.24xlarge 인스턴스에서 6시간 이상 걸립니다. 자율 주행 차량 회사와 같은 일부 고객은 훨씬 더 큰 데이터 세트를 처리하고 며칠 동안 물체 감지 모델을 훈련합니다.

복잡한 훈련 작업이 이렇게 오래 걸리면 무언가가 잘못되어 쓸모가 없어질 확률이 꽤 높습니다. 시간과 돈을 낭비할 뿐만 아니라 많은 좌절을 야기합니다. 근본 원인을 조사하고 파악하여 문제를 해결하려고 시도한 다음 훈련 작업을 다시 실행하는 동안 중요한 작업이 다음으로 미뤄지게 됩니다. 종종 문제를 해결하기 위해 몇 번 반복해야 합니다.

사용하는 ML 프레임워크와 해당 버전에 따라 기존 프레임워크 관련 도구를 사용하거나 사용하지 못할 수도 있습니다. 종종 자체 맞춤형 도구를 구축하고 유지해야 합니다. 이 작업은 숙련된 실무자의 경우에도 많은 시간과 노력이 필요합니다. 저와 같은 일반 개발자에게 이것은 정말 어려운 작업입니다.

Amazon SageMaker Debugger에서 모델 프로파일링 소개
지난해 AWS re:Invent에서 출시된 Amazon SageMaker Debugger는 ML 훈련 작업에서 발생하는 복잡한 문제를자동으로 식별하는 Amazon SageMaker의 기능입니다. 여기에는 감소하지 않는 손실, 기울기 폭발 등이 포함됩니다.

이제 SageMaker Debugger는 하드웨어 리소스 사용량을 모니터링할 수 있으며 훈련 작업을 프로파일링하여 리소스 사용량과 훈련 스크립트의 ML 작업에 대한 상관 관계를 파악할 수 있습니다. 따라서 성능 문제를 훨씬 빠르게 해결하고 훈련 작업을 훨씬 빠르게 반복할 수 있습니다.

자율 주행 및 운전자 보조 시스템을 구축하는 인텔 회사인 Mobileye의 ML 알고리즘 개발자인 Chaim Rand는 새로운 프로파일링 기능을 사용할 수 있는 기회를 얻었고 다음과 같이 말했습니다. “Mobileye에서 개발한 자율 주행 차량 기술은 심층 신경망 모델 훈련에 의존하여 차량, 보행자, 과속 방지턱, 도로 표지판 등을 포함한 다양한 도로 아티팩트를 감지합니다. 종종 이러한 모델은 극도로 큰 데이터 세트와 여러 대의 머신에서 최대 며칠 동안 훈련합니다. 하지만 Mobileye에서는 네트워크, CPU 및 GPU 리소스에 걸쳐 데이터 흐름을 분석하고 성능 문제를 정확히 파악하기 위한 고급 성능 프로파일링 기능 툴킷을 갖추는 것이 중요합니다. SageMaker Debugger의 프로파일링 기능은 소수의 전문가의 도메인에서 성능 프로파일링을 수행하고 알고리즘 개발자가 훈련 리소스 활용률을 극대화하고 모델 컨버전스를 가속화하며 비용을 절감할 수 있도록 지원합니다.

시작할 때 TensorFlow 2.x 및 PyTorch 1.x에서 SageMaker Debugger의 새로운 프로파일링 기능을 사용할 수 있습니다. Amazon SageMaker에서 해당 기본 제공 프레임워크를 사용하여 훈련을 하기만 하면 됩니다. 분산 훈련은 바로 사용할 수 있습니다.

SageMaker 추정기에서 단일 파라미터를 설정하고 훈련 코드를 변경하지 않고 다음과 같은 인프라 및 모델 지표 모음을 활성화할 수 있습니다.

  • CPU 및 GPU,
  • RAM 및 GPU RAM,
  • 네트워크 I/O,
  • 스토리지 I/O (로컬 스토리지 및 파이프 모드),
  • Python 지표,
  • 데이터 로드 시간,
  • CPU 및 GPU에서 실행되는 ML 연산자에서 소요된 시간,
  • Horovod에 대한 분산 훈련 지표,
  • 및 기타

또한 전처리, 훈련 루프 및 후처리와 같은 여러 단계에서 소요된 시간을 시각화할 수 있습니다. 필요한 경우 각 훈련 에포크 및 훈련 스크립트의 각 함수를 드릴다운할 수 있습니다.

기본적으로 지표는 500ms마다 수집되며 이 값을 100ms, 200ms, 1초, 5초 및 1분으로 설정할 수도 있습니다. 세분화된 분석의 경우 훈련 코드에서 프로파일링을 명시적으로 활성화하거나 비활성화할 수 있으며 특정 부분에 대한 지표만 캡처할 수 있습니다.

훈련 작업이 실행되는 동안 ML을 위한 웹 기반 통합 개발 환경인 Amazon SageMaker Studio에서 이러한 지표를 쉽게 시각화할 수 있습니다. 예상대로 모든 데이터는 SageMaker Debugger API를 통해서도 사용할 수 있으며, 이를 검색하여 자체적으로 그래프를 작성할 수 있습니다.

훈련 작업과 동시에 실행되는 Amazon SageMaker Processing은 캡처된 데이터를 분석하고 그래프를 작성하며 잠재적인 문제에 대한 인사이트를 제공하는 보고서를 생성합니다. 이 분석은 완전 관리형 인프라의 기본 제공 컨테이너 내부에서 실행되므로 사용자측 작업은 필요하지 않습니다.

이제 PyTorch로 데모를 실행해 보겠습니다. 여기서 CIFAR-10 데이터 세트에 대한 ResNet-50 이미지 분류 모델 훈련을 프로파일링하겠습니다.

Amazon SageMaker Debugger를 사용한 훈련 작업 프로파일링
훈련 작업에 대한 프로파일링을 활성화하기 위해서는 SageMaker 추정기의 추가 파라미터만 필요합니다. 훈련 코드에서 줄을 변경할 필요가 없습니다. 기본적으로 SageMaker Debugger는 낮은 GPU 사용률과 같이 훈련 중에 발생할 수 있는 비정상적인 조건을 찾는 기본 제공 프로파일링 규칙 세트를 사용합니다. 이러한 조건을 보고하는 것 외에도 SageMaker DebuggerCloudWatch 이벤트에서 이벤트를 트리거합니다. 예를 들어 비효율적인 훈련 작업을 자동으로 중지하는 AWS Lambda 함수를 실행하는 데 사용할 수 있습니다.

먼저 500ms마다 데이터를 캡처하는 프로파일링 구성을 만듭니다. 옵션으로 작업의 특정 부분만 프로파일링하려는 경우 훈련 단계 간격을 선택할 수 있습니다.

import sagemaker
from sagemaker.profiler import ProfilerConfig 
profiler_config = ProfilerConfig(profiling_interval_millis=500)

그런 다음, 이 구성을 PyTorch 추정기에 전달하여 4개의 NVIDIA V100 GPU가 장착된 ml.p3.8xlarge 인스턴스에 대한 훈련을 제공합니다.

from sagemaker.pytorch import PyTorch
estimator = PyTorch(
    role=sagemaker.get_execution_role(),
    instance_count=1,
    instance_type='ml.p3.8xlarge',
    entry_point='train_pt.py',
    framework_version='1.5.0',
    hyperparameters={"batch_size":512, "epochs":10},
    profiler_config=profiler_config)

그런 다음 평소와 같이 훈련 작업을 시작합니다. 작업이 실행되면 프로파일링 데이터가 캡처되어 S3에 저장됩니다.

path = estimator.latest_job_profiler_artifacts_path()
print(path)
s3://sagemaker-us-east-2-123456789012/pt-train-pt-2020-11-17-17-38-43-231/profiler-output

SageMaker SDK를 사용하여 프로파일링 이벤트를 검색하고 계산할 수 있습니다.

from smdebug.profiler.system_metrics_reader import S3SystemMetricsReader
system_metrics_reader = S3SystemMetricsReader(path)
system_metrics_reader.refresh_event_file_list()
last_timestamp = system_metrics_reader.get_timestamp_of_latest_available_file()
events = system_metrics_reader.get_events(0, last_timestamp)
print("Found", len(events), "recorded system metric events. Latest recorded event:", last_timestamp)
Found 411853 recorded system metric events. Latest recorded event: 1605620280000000

물론 이러한 프로파일링 이벤트를 구문 분석 및 분석하고 자체 그래프를 작성하는 등의 작업을 수행할 수 있습니다. 대신, SageMaker Studio에서 거의 실시간으로 시각화해보겠습니다.

훈련 작업이 실행되는 동안, SageMaker Studio에서 훈련 작업을 찾아 [인사이트용 디버거 열기(Open Debugger for insights)]를 마우스 오른쪽 버튼으로 클릭합니다.

SageMaker 스크린샷

그러면 새 탭이 열리고 훈련 작업의 각 인스턴스에 대한 세부 통계를 볼 수 있는 [노드(Nodes)] 패널을 선택합니다. 그럼, 제 훈련 작업은 어떻게 진행되고 있을까요? 아래 이미지를 클릭하여 확대하세요.

SageMaker 스크린샷

분명히, 이 작업은 마음에 들지 않네요. GPU 사용률 및 GPU 메모리 사용률이 약 10%입니다. 멀티 GPU 인스턴스를 충분히 사용되지 않고 있네요. CPU를 계속 가동할 수 없기 때문에 GPU가 데이터를 충분히 빨리 수신하지 못하고 있나요? 시스템 사용률 히트맵을 확인해 보겠습니다.

SageMaker 스크린샷

CPU는 지금 가동되고 있지 않으며 20%의 사용량을 초과하지도 않습니다. 이 인스턴스는 충분히 가동되고 있지 않습니다 이 문제를 해결하기 위해 할 수 있는 일이 있을까요.

[Overview(개요)] 패널로 전환하면 기본 제공된 프로파일링 규칙 중 일부가 트리거된 것을 알 수 있습니다.

SageMaker 스크린샷

LowGPUUtilization항목이 위의 그래프에서 확인한 내용을 보여줍니다. BatchSize항목은 CPU에서 실행되는 훈련 스크립트에 의해 GPU로 전송되는 미니 배치의 크기를 늘리는 것을 제안하고 있기 때문에 매우 흥미롭습니다. 이를 통해 GPU 메모리를 채우고, 더 많은 GPU 코어를 작동시키고, 훈련 작업을 가속화하고, 인프라 사용을 개선하는 데 도움이 될 것입니다.

이 시점에서 비효율적인 훈련 작업을 중단하고 더 큰 배치 크기로 다시 시작해야 할지 결정해야합니다. 여기에서는 훈련 작업과 동시에 실행되는 SageMaker Processing 작업으로 생성된 보고서를 보여 주기 위해 이 작업을 완료까지 실행하겠습니다.

훈련 작업이 완료되면 [Overview(개요)] 패널에서 해당 요약을 볼 수 있습니다.

SageMaker 스크린샷

[보고서 다운로드(Download report)] 버튼을 클릭하면 추가 지표가 포함된 매우 세부적인 보고서가 표시됩니다(예: 훈련 작업의 여러 단계 간의 비율 또는 순방향 패스 및 역방향 패스 사이의 비율).

SageMaker 스크린샷

가장 시간이 많이 소요된 CPU 및 GPU 연산자에 대한 정보도 볼 수 있습니다. 코드를 최적화하려면 이 정보는 정말 중요합니다. 예를 들어, 아래 그래프는 훈련 작업에서 가장 많은 시간이 소요된 GPU 연산이 역방향 패스 합성곱 연산자임을 알려줍니다.

SageMaker 스크린샷

보고서에는 훨씬 더 많은 내용이 있습니다(규칙 요약, 훈련 루프 분석 등). 또한 그래프가 구축된 방식과 사용자의 요구 사항에 따라 그래프를 맞춤화할 수 있는 방법을 이해하는 데 도움이 되는 노트북도 제공됩니다.

시작하기
대략적으로 살펴봤는데요. Amazon SageMaker Debugger에는 모델 프로파일링 정보를 쉽게 수집, 분석 및 시각화할 수 있는 많은 기능이 있습니다. 이제 Amazon SageMaker를 사용할 수 있는 모든 리전에서 이 기능을 사용할 수 있습니다. 기본 제공 프로파일링 규칙을 실행하는 데 사용된 컴퓨팅에 대해서는 요금이 부과되지 않습니다.

Github에서 샘플 노트북을 찾을 수 있으므로 시도해 보고 의견을 알려주세요. 언제든지 AWS 지원 담당자나 SageMaker에 대한 AWS 포럼을 통해 피드백을 보내 주시기 바랍니다.

– Julien