파이토치 프로파일러
- 원글 : PyTorch Profiler
- 이 글은 파이토치 프로파일러를 사용하는 방법과 모델이 동작할 때 소요되는 시간과 메모리 사용량을 측정하는 방법을 설명한다.
Introduction
- 파이토치에는 모델에서 가장 자원이 많이 소요되는 연산을 파악하는데 유용한 간단한 프로파일러 API를 가지고 있다.
- 참고) 모델에서 연산의 양과 요구되는 자원이 적절하게 대응되지 않아서, 성능 상의 병목이 일어나거나 시간 소요가 많이 되는 연산을 비싼(expensive) 연산 또는 연산자(operator)라고 한다.
- 이 글에서는 설명을 위해 단순한 Resnet 모델을 활용하여, 모델의 성능을 분석하기 위해서 프로파일러를 사용하는 방법을 설명한다.
Setup
pip install torch torchvision
Steps
- 필요한 모든 라이브러리를 불러온다.
- 단순한 ResNet 모델을 생성한다.
- 프로파일러를 통해 실행시간을 분석한다.
- 프로파일러를 통해 메모리 사용량을 분석한다.
- 트레이싱(tracing) 기능을 사용한다.
- 스택(stack) 트레이싱을 확인한다.
- 프로파일러를 통해 실행이 오래 걸리는 작업들을 분석한다.
#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)
댓글