컴퓨터 성능은 시간과 메모리의 균형에 달려 있습니다. 계산 장치는 가격이 훨씬 비싸기 때문에 대부분 시간을 우선적으로 고려합니다.
프로파일러를 사용하는 이유는 무엇인가요?
세 가지 프로파일러가 있습니다.
Autograd 프로파일러는 torch.cuda.Event()를 활용하여 성능을 측정합니다.
PyTorch 프로파일러는 성능을 분석하기 위해 프로파일러 컨텍스트 관리자 torch.profiler의 profile() 메소드를 활용합니다.
결과를 .json 파일로 내보낸 후 chrome://tracing/에 업로드하여 시각화할 수 있습니다.
이 과정에서는 autograd 프로파일러를 사용하여 제곱 연산을 수행하는 세 가지 방법의 성능을 분석하는 방법을 보여주는 간단한 프로그램을 제공합니다.
def time_pytorch_function(func, input): # CUDA IS ASYNC so can't use python time module start = torch.cuda.Event(enable_timing=True) end = torch.cuda.Event(enable_timing=True) # Warmup for _ in range(5): func(input) start.record() func(input) end.record() torch.cuda.synchronize() return start.elapsed_time(end) time_pytorch_function(torch.square, b) time_pytorch_function(square_2, b) time_pytorch_function(square_3, b)
아래 결과는 NVIDIA T4 GPU에서 이루어졌습니다.
Profiling torch.square: Self CPU time total: 10.577ms Self CUDA time total: 3.266ms Profiling a * a: Self CPU time total: 5.417ms Self CUDA time total: 3.276ms Profiling a ** 2: Self CPU time total: 6.183ms Self CUDA time total: 3.274ms
결과는 다음과 같습니다.
다음과 같은 몇 가지 방법이 있습니다.
torch.utils.cpp_extendsion의 load_inline을 사용하면 load_inline(name, cpp_sources, cuda_sources, function, with_cuda, build_directory)을 통해 CUDA 커널을 PyTorch 확장으로 로드할 수 있습니다.
from torch.utils.cpp_extension import load_inline square_matrix_extension = load_inline( name='square_matrix_extension', cpp_sources=cpp_source, cuda_sources=cuda_source, functions=['square_matrix'], with_cuda=True, extra_cuda_cflags=["-O2"], build_directory='./load_inline_cuda', # extra_cuda_cflags=['--expt-relaxed-constexpr'] ) a = torch.tensor([[1., 2., 3.], [4., 5., 6.]], device='cuda') print(square_matrix_extension.square_matrix(a))
autograd 프로파일러를 사용할 때 다음 사항을 기억하세요.
def time_pytorch_function(func, input): # CUDA IS ASYNC so can't use python time module start = torch.cuda.Event(enable_timing=True) end = torch.cuda.Event(enable_timing=True) # Warmup for _ in range(5): func(input) start.record() func(input) end.record() torch.cuda.synchronize() return start.elapsed_time(end) time_pytorch_function(torch.square, b) time_pytorch_function(square_2, b) time_pytorch_function(square_3, b)
Profiling torch.square: Self CPU time total: 10.577ms Self CUDA time total: 3.266ms Profiling a * a: Self CPU time total: 5.417ms Self CUDA time total: 3.276ms Profiling a ** 2: Self CPU time total: 6.183ms Self CUDA time total: 3.274ms
from torch.utils.cpp_extension import load_inline square_matrix_extension = load_inline( name='square_matrix_extension', cpp_sources=cpp_source, cuda_sources=cuda_source, functions=['square_matrix'], with_cuda=True, extra_cuda_cflags=["-O2"], build_directory='./load_inline_cuda', # extra_cuda_cflags=['--expt-relaxed-constexpr'] ) a = torch.tensor([[1., 2., 3.], [4., 5., 6.]], device='cuda') print(square_matrix_extension.square_matrix(a))
위 내용은 GPU-Mode 강의 노트 1의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!