Heim > Artikel > Backend-Entwicklung > Hinweise zur GPU-Mode-Vorlesung 1
Bei der Computerleistung geht es um Zeit- und Speicherkompromisse. Da Rechengeräte viel teurer sind, steht in den meisten Fällen die Zeit im Vordergrund.
Warum einen Profiler verwenden?
Es gibt drei Profiler:
Der Autograd-Profiler verwendet Torch.cuda.Event(), um die Leistung zu messen.
Der PyTorch-Profiler nutzt die Methode „profile()“ des Profiler-Kontextmanagers „torch.profiler“, um die Leistung zu analysieren.
Sie können das Ergebnis als .json-Datei exportieren und zur Visualisierung auf chrome://tracing/ hochladen.
Der Kurs stellt ein einfaches Programm bereit, das zeigt, wie man mit dem Autograd-Profiler die Leistung von drei Möglichkeiten zur Durchführung von Quadratoperationen analysiert:
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)
Das folgende Ergebnis wurde auf der NVIDIA T4-GPU erstellt.
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
Es stellt sich heraus:
Es gibt mehrere Möglichkeiten, dies zu tun:
Wir können Load_inline von Torch.utils.cpp_extendsion verwenden, um den CUDA-Kernel als PyTorch-Erweiterung durch Load_inline(Name, CPP_Sources, Cuda_Sources, Funktionen, With_Cuda, Build_Directory) zu laden.
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))
Beachten Sie bei der Verwendung des Autograd-Profilers Folgendes:
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))
Das obige ist der detaillierte Inhalt vonHinweise zur GPU-Mode-Vorlesung 1. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!