본문 바로가기
A.I./PyTorch

PyTorch 문서) PyTorch Recipes - PyTorch Profiler

by 채소장사 2024. 11. 9.

파이토치 프로파일러

  • 원글 : PyTorch Profiler
  • 이 글은 파이토치 프로파일러를 사용하는 방법과 모델이 동작할 때 소요되는 시간과 메모리 사용량을 측정하는 방법을 설명한다.

Introduction

  • 파이토치에는 모델에서 가장 자원이 많이 소요되는 연산을 파악하는데 유용한 간단한 프로파일러 API를 가지고 있다.
    • 참고) 모델에서 연산의 양과 요구되는 자원이 적절하게 대응되지 않아서, 성능 상의 병목이 일어나거나 시간 소요가 많이 되는 연산을 비싼(expensive) 연산 또는 연산자(operator)라고 한다. 
  • 이 글에서는 설명을 위해 단순한 Resnet 모델을 활용하여, 모델의 성능을 분석하기 위해서 프로파일러를 사용하는 방법을 설명한다.

Setup

pip install torch torchvision

Steps

  1. 필요한 모든 라이브러리를 불러온다.
  2. 단순한 ResNet 모델을 생성한다.
  3. 프로파일러를 통해 실행시간을 분석한다.
  4. 프로파일러를 통해 메모리 사용량을 분석한다.
  5. 트레이싱(tracing) 기능을 사용한다.
  6. 스택(stack) 트레이싱을 확인한다.
  7. 프로파일러를 통해 실행이 오래 걸리는 작업들을 분석한다.

#1. 필요한 라이브러리를 모두 불러온다.

  • 프로파일러 모듈(profiler)을 포함하여, 모델 생성에 필요한 라이브러리들을 불러온다.
import torch
import torchvision.models as models
from torch.profiler import profile, record_function, ProfilerActivity

#2. Resnet 모델을 생성한다.

  • 미리 정의되어 있는 사전훈련된 Resnet 모델을 불러와 생성하고, 모델에 입력할 임의의 입력텐서를 준비한다.
model = models.resnet18()
inputs = torch.randn(5, 3, 224, 224)

#3. 프로파일러를 사용하여 실행시간을 분석한다.

  • 파이토치 프로파일러는 with 구문 안에서 사용할 수 있으며, 많은 매개변수를 가질 수 있다. 알아두면 좋을 매개변수에는 다음과 같은 것들이 있다.
    • 참고) 파이썬에서 자원관리를 위해 사용하는 with 구문을 컨텍스트 매니저(context manager)라고 한다. 
    • activities - 프로파일 분석을 할 액티비티(activity) 목록
      • ProfilerActivity.CPU - PyTorch 연산자, TorchScript 함수, 사용자 정의 코드 문자열(code label)
      • ProfilerActivity.CUDA - 온-디바이스 CUDA 커널
      • ProfilerAcitivity.XPU - 온-디바이스 XPU 커널
      • 참고) XPU는 CPU, GPU를 포함하여 다양한 가속장치(DPU, TPU 등)를 의미한다.
    • record_shapes - 연산자에 입력되는 텐서의 크기를 기록할지 여부
    • profile_memory - 모델 텐서에 의해 소비되는 메모리 사용량을 기록할지 여부
  • 참고로 CUDA를 사용할 때, 프로파일러는 (GPU가 아닌) 호스트에서 CUDA event의 실행시간(runtime)도 함께 보여준다.
  • 다음과 같은 방식으로 프로파일러에게 실행시간 분석을 요청할 수 있다.
with profile(activities=[ProfilerActivity.CPU], record_shapes=True) as prof:
    with record_function("model_inference"):
        model(inputs)

 

댓글