PyTorch XLA 워크로드 프로파일링

프로파일링은 모델 성능을 분석하고 개선하는 방법 중 하나입니다. 이외에도 훨씬 더 많은 기능이 있지만, 때로는 기기(TPU)와 호스트(CPU) 양쪽에서 다 실행되는 타이밍 작업 및 코드 부분이라고 생각하면 도움이 됩니다. 이 가이드에서는 학습 또는 추론을 위해 코드를 프로파일링하는 방법을 간략하게 설명합니다. 생성된 프로필을 분석하는 방법에 관한 자세한 내용은 다음 가이드를 참고하세요.

시작하기

TPU 만들기

  1. 환경 변수 내보내기

    $ export TPU_NAME=your_tpu_name
    $ export ZONE=us-central2-b
    $ export PROJECT_ID=project-id
    $ export ACCELERATOR_TYPE=v4-8
    $ export RUNTIME_VERSION=tpu-vm-v4-pt-2.0

    변수 설명 내보내기

    TPU name
    Cloud TPU에 사용할 이름입니다.
    zone
    Cloud TPU를 만들려는 영역입니다.
    project ID
    모델을 학습하고 프로파일링하는 데 사용 중인 프로젝트 ID입니다.
    accelerator-type
    가속기 유형은 만들려는 Cloud TPU의 버전과 크기를 지정합니다. 각 TPU 버전에서 지원되는 가속기 유형에 대한 자세한 내용은 TPU 버전을 참조하세요.
    version
    Cloud TPU 런타임 버전입니다. 기본값은 내보낸 변수에 표시되지만 지원되는 구성 목록에서 하나를 사용할 수도 있습니다.
  2. TPU 리소스 실행

    $ gcloud compute tpus tpu-vm create ${TPU_NAME} \
    --zone us-central2-b \
    --accelerator-type ${ACCELERATOR_TYPE} \
    --version ${RUNTIME_VERSION} \
    --project $PROJECT_ID \
    --subnetwork=tpusubnet
  3. gcloud scp 명령어를 사용하여 TPU VM의 홈 디렉터리로 코드를 이동합니다. 예를 들면 다음과 같습니다.

    $ gcloud compute tpus tpu-vm scp my-code-file ${TPU_NAME}: --zone ${ZONE}

프로파일링

프로필은 capture_profile.py를 통해 수동으로 캡처하거나 torch_xla.debug.profiler API를 사용하여 학습 스크립트 내에서 프로그래매틱 방식으로 캡처할 수 있습니다.

프로필 서버 시작

프로필을 캡처하려면 프로필 서버가 학습 스크립트 내에서 실행 중이어야 합니다. 다음 명령어와 같이 원하는 포트 번호(예: 9012)로 서버를 시작합니다.

import torch_xla.debug.profiler as xp
server = xp.start_server(9012)

main 함수의 시작 부분에서 서버를 시작할 수 있습니다.

이제 다음 섹션에 설명된 대로 프로필을 캡처할 수 있습니다. 이 스크립트는 하나의 TPU 기기에서 발생하는 모든 내용을 프로파일링합니다.

Trace 추가

호스트 머신에서 작업을 프로파일링하려면 코드에 xp.StepTrace 또는 xp.Trace를 추가하면 됩니다. 이러한 함수는 호스트 머신에서 Python 코드를 추적합니다. (이는 TPU 기기로 "그래프"를 전달하기 전 호스트(CPU)에서 Python 코드를 실행하는 데 걸리는 시간을 측정하는 것과 같습니다. 따라서 추적 오버헤드를 분석할 때 가장 유용합니다.) 예를 들어 코드가 데이터 배치를 처리하는 학습 루프 내에 이를 추가할 수 있습니다.

for step, batch in enumerate(train_dataloader):
    with xp.StepTrace('Training_step', step_num=step): 
       ...

또는 다음으로 코드의 개별 부분을 래핑할 수 있습니다.

 with xp.Trace('loss'): 
    loss = ...

Lighting을 사용하는 경우 코드의 일부에서 자동으로 수행되기 때문에 추적 추가를 건너뛸 수 있습니다. 하지만 trace를 추가하려면 이를 학습 루프 내에 삽입해도 됩니다.

초기 컴파일 후 기기 활동을 캡처할 수 있습니다. 모델이 학습 또는 추론 단계를 시작할 때까지 기다리세요.

수동 캡처

Pytorch XLA 저장소의 capture_profile.py 스크립트를 사용하면 프로필을 빠르게 캡처할 수 있습니다. 이렇게 하려면 캡처 프로필 파일을 TPU VM에 직접 복사합니다. 다음 명령어는 캡처 프로필 파일을 홈 디렉터리에 복사합니다.

$ gcloud compute tpus tpu-vm ssh ${TPU_NAME} \
--zone us-central2-b \
--worker=all \
--command="wget https://raw.githubusercontent.com/pytorch/xla/master/scripts/capture_profile.py"

학습이 실행되는 동안 다음을 실행하여 프로필을 캡처합니다.

$ gcloud compute tpus tpu-vm ssh ${TPU_NAME} \
--zone us-central2-b \
--worker=all \
--command="python3 capture_profile.py --service_addr "localhost:9012" --logdir ~/profiles/ --duration_ms 2000"

이 명령어는 .xplane.pb 파일을 logdir에 저장합니다. 로깅 디렉터리 ~/profiles/를 원하는 위치 및 이름으로 변경할 수 있습니다. Cloud Storage 버킷에 직접 저장할 수도 있습니다. 이렇게 하려면 logdirgs://your_bucket_name/으로 설정하세요.

프로그래매틱 캡처

스크립트를 트리거하여 프로필을 수동으로 캡처하는 대신 학습 스크립트 내부 torch_xla.debug.profiler.trace_detached API를 사용하여 프로필을 자동으로 트리거하도록 학습 스크립트를 구성할 수 있습니다.

예를 들어 특정 에포크 및 단계에서 프로필을 자동으로 캡처하려면 PROFILE_STEP, PROFILE_EPOCH, PROFILE_LOGDIR 환경 변수를 사용하도록 학습 스크립트를 구성하면 됩니다.

import os
import torch_xla.debug.profiler as xp

# Within the training script, read the step and epoch to profile from the
# environment.
profile_step = int(os.environ.get('PROFILE_STEP', -1))
profile_epoch = int(os.environ.get('PROFILE_EPOCH', -1))
...

for epoch in range(num_epoch):
   ...
   for step, data in enumerate(epoch_dataloader):
      if epoch == profile_epoch and step == profile_step:
         profile_logdir = os.environ['PROFILE_LOGDIR']
         # Use trace_detached to capture the profile from a background thread
         xp.trace_detached('localhost:9012', profile_logdir)
      ...

그러면 PROFILE_LOGDIR 환경 변수로 지정한 디렉터리에 .xplane.pb 파일이 저장됩니다.

텐서보드의 분석

프로필을 추가로 분석하려면 동일한 머신이나 다른 머신(권장)에서
TPU 텐서보드 플러그인과 함께 TensorBoard를 사용할 수 있습니다.

원격 머신에서 텐서보드를 실행하려면 SSH를 사용하여 원격 머신에 연결하고 포트 전달을 사용 설정합니다. 예를 들면 다음과 같습니다.

$ ssh -L 6006:localhost:6006 remote server address

또는

$ gcloud compute tpus tpu-vm ssh $TPU_NAME --zone=$ZONE --ssh-flag="-4 -L 6006:localhost:6006"

원격 머신에서 필요한 패키지를 설치하고 텐서보드를 실행합니다(해당 머신의 ~/profiles/ 아래에 프로필이 있다고 가정). 프로필을 다른 디렉터리 또는 Cloud Storage 버킷에 저장한 경우 경로를 올바르게 지정했는지 확인합니다(예: gs://your_bucket_name/profiles).

(vm)$ pip install tensorflow-cpu tensorboard-plugin-profile 
(vm)$ tensorboard --logdir ~/profiles/ --port 6006
(vm)$ pip uninstall tensorflow tf-nightly tensorboard tb-nightly tbp-nightly

텐서보드 실행

로컬 브라우저에서 http://localhost:6006/으로 이동하고 드롭다운 메뉴에서 PROFILE을 선택하여 프로필을 로드합니다.

텐서보드 도구 및 출력 해석 방법에 관한 자세한 내용은 TPU 도구를 참고하세요.

이미지

이미지