Prestasi komputer adalah mengenai pertukaran masa dan memori. Memandangkan pengiraan peranti jauh lebih mahal, kebanyakan masa, masa adalah keutamaan untuk diambil berat.
Kenapa guna profiler?
Terdapat tiga pemprofil:
Profil autograd menggunakan torch.cuda.Event() untuk mengukur prestasi.
Profil PyTorch menggunakan profil kaedah() daripada pengurus konteks Profiler obor.profiler untuk menganalisis prestasi.
Anda boleh mengeksport hasil sebagai fail .json dan memuat naiknya ke chrome://tracing/ untuk menggambarkannya.
Kursus ini menyediakan program mudah untuk menunjukkan cara menggunakan profiler autograd untuk menganalisis prestasi tiga cara untuk melakukan operasi segi empat sama:
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)
Hasil di bawah dilakukan pada GPU NVIDIA T4.
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
Ternyata:
Terdapat beberapa cara untuk melakukannya:
Kita boleh menggunakan load_inline daripada torch.utils.cpp_extendsion untuk memuatkan kernel CUDA sebagai sambungan PyTorch oleh load_inline(nama, cpp_sources, cuda_sources, functions, with_cuda, build_directory).
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))
Apabila menggunakan autograd profiler, ingat:
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))
Atas ialah kandungan terperinci Nota tentang kuliah Mod GPU 1. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!