计算机性能取决于时间和内存的权衡。由于计算设备比较昂贵,所以大多数时候,时间是首先要关心的。
为什么要使用分析器?
共有三个分析器:
Autograd 分析器利用 torch.cuda.Event() 来测量性能。
PyTorch profiler 利用 Profiler 上下文管理器 torch.profiler 中的 profile() 方法来分析性能。
您可以将结果导出为 .json 文件并将其上传到 chrome://tracing/ 进行可视化。
课程提供了一个简单的程序来展示如何使用autograd profiler来分析三种平方运算方法的性能:
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,functions,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 profiler 时,请记住:
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 模式讲座 1 的笔记的详细内容。更多信息请关注PHP中文网其他相关文章!