コンピュータのパフォーマンスは、時間とメモリのトレードオフによって決まります。計算デバイスは非常に高価であるため、ほとんどの場合、時間を最優先に考慮する必要があります。
プロファイラーを使用する理由
3 つのプロファイラーがあります:
Autograd プロファイラーは torch.cuda.Event() を利用してパフォーマンスを測定します。
PyTorch プロファイラーは、プロファイラー コンテキスト マネージャー torch.profiler のメソッド profile() を利用してパフォーマンスを分析します。
結果を .json ファイルとしてエクスポートし、chrome://tracing/ にアップロードして視覚化できます。
このコースでは、autograd プロファイラーを使用して 2 乗演算を実行する 3 つの方法のパフォーマンスを分析する方法を示す簡単なプログラムを提供します。
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 中国語 Web サイトの他の関連記事を参照してください。