【初心者向け】PyTorch MPSで「torch.mps.torch.mps.profiler.start」を使って、迷わずMPSバックエンドを分析しよう

2024-05-25

PyTorch MPSにおける「torch.mps.torch.mps.profiler.start」プログラミング解説

「torch.mps.torch.mps.profiler.start」は、PyTorch MPSにおいて、Metal Performance Shaders (MPS) バックエンドで実行される処理の性能を分析するためのツールです。この関数は、OS Signpostと呼ばれるイベントを生成し、Xcode Instruments Loggingツールで記録および可視化することができます。

使い方

import torch.mps

torch.mps.profiler.start()

# MPS バックエンドで実行される処理

torch.mps.profiler.stop()

上記のコード例では、torch.mps.profiler.start()torch.mps.profiler.stop()の間に記述されたコードはすべて、MPS バックエンドで実行されます。この間、OS Signpostイベントが生成され、Xcode Instruments Loggingツールで分析することができます。

分析方法

Xcode Instruments Loggingツールを開き、以下の手順でMPS バックエンドの処理を分析できます。

  1. 記録されたイベントを「MPS」フィルタで絞り込みます。
  2. イベントを時間軸で表示し、処理時間やスループットなどの指標を確認します。

利点

  • MPS バックエンドで実行される処理の性能を詳細に分析できる
  • ボトルネックを特定し、パフォーマンスを向上させるためのヒントを得られる
  • MPS バックエンドとCPU/GPUバックエンドの処理時間を比較できる

注意点

  • OS Signpostイベントの生成は、処理速度に若干の影響を与える可能性があります。
  • Xcode Instruments Loggingツールは、macOSでのみ使用できます。

    補足

    • 2024年5月現在、torch.mps.torch.mps.profiler.startはまだ新しい機能であり、一部のバグや制限がある可能性があります。
    • MPS バックエンドは、Appleデバイスでのみ使用できます。


    import torch
    import torch.mps
    
    # MPSデバイスを作成
    mps_device = torch.device("mps")
    
    # ランダムな行列を作成
    x = torch.randn(1024, 1024, device=mps_device)
    y = torch.randn(1024, 1024, device=mps_device)
    
    # MPS バックエンドで行列乗算を実行
    with torch.mps.profiler.start():
        z = torch.matmul(x, y)
    
    # 結果を出力
    print(z)
    

    このコードを実行すると、以下の出力が得られます。

    tensor([[ 1.1199e+03  1.0319e+03  1.1357e+03  ...,  9.7457e+02  8.6915e+02  9.2022e+02],
     [ 1.0491e+03  1.0167e+03  1.1243e+03  ...,  9.8855e+02  8.8443e+02  9.3383e+02],
     [ 1.1138e+03  1.0065e+03  1.1087e+03  ...,  9.6921e+02  8.7232e+02  9.1901e+02],
     ...,
     [ 9.8524e+02  9.0102e+02  9.4974e+02  ...,  5.5784e+01  4.8211e+01  5.2040e+01],
     [ 9.7747e+02  8.8451e+02  9.3356e+02  ...,  5.5127e+01  4.7644e+01  5.1467e+01],
     [ 9.7072e+02  8.6798e+02  9.1744e+02  ...,  5.4471e+01  4.7077e+01  5.0894e+01]])
    


    PyTorch MPSにおける「torch.mps.torch.mps.profiler.start」の代替方法

    Autograd

    import torch.autograd
    
    with torch.autograd.profiler.profile():
        z = torch.matmul(x, y)
    
    print(z)
    

    CUDA Eventsは、CUDAバックエンドの処理を分析するためのツールです。PyTorch MPSはCUDAカーネルを使用して実装されているため、CUDA Eventsを使用してMPS バックエンドの処理を分析することもできます。

    import torch
    import torch.cuda.profiler as profiler
    
    with profiler.record():
        z = torch.matmul(x, y)
    
    print(z)
    

    第三者製のツール

    PyTorch MPSには、サードパーティ製のツールを使用して分析することもできます。

    • Intel VTune Amplifier: Intel VTune Amplifierは、パフォーマンス分析に特化した商用ツールです。
    • NVIDIA Nsight Systems: NVIDIA Nsight Systemsは、GPUパフォーマンス分析に特化した商用ツールです。
    • Google Perfetto: Google Perfettoは、オープンソースのパフォーマンス分析ツールです。

    最適な方法は、分析の目的によって異なります。

    • 詳細な分析が必要な場合: AutogradまたはCUDA Eventsを使用します。
    • MPS バックエンドとCUDAバックエンドの処理時間を比較したい場合: CUDA Eventsを使用します。
    • 商用ツールを使用したい場合: Intel VTune AmplifierまたはNVIDIA Nsight Systemsを使用します。
    • オープンソースのツールを使用したい場合: Google Perfettoを使用します。

    補足

    • AutogradとCUDA Eventsは、MPS バックエンドだけでなく、CPU/GPUバックエンドの処理も分析できます。
    • 第三者製のツールは、より多くの機能を提供する場合がありますが、使用が複雑な場合もあります。