評價此頁

使用儀器和跟蹤技術 (ITT) API 對 PyTorch 工作負載進行效能分析#

創建於:2022 年 10 月 27 日 | 最後更新:2024 年 10 月 24 日 | 最後驗證:未驗證

在本實踐中,您將學習

  • 什麼是 Intel® VTune™ Profiler

  • 什麼是儀器和跟蹤技術 (ITT) API

  • 如何在 Intel® VTune™ Profiler 中視覺化 PyTorch 模型層次結構

  • 一個簡短的程式碼示例,展示瞭如何使用 PyTorch ITT API

要求#

  • PyTorch 1.13 或更高版本

  • Intel® VTune™ Profiler

安裝 PyTorch 的說明可在 pytorch.org 上找到。

什麼是 Intel® VTune™ Profiler#

Intel® VTune™ Profiler 是一款用於序列和多執行緒應用程式的效能分析工具。對於熟悉 Intel 架構的使用者,Intel® VTune™ Profiler 提供了一套豐富的指標,可幫助使用者瞭解應用程式在 Intel 平臺上的執行情況,從而瞭解效能瓶頸所在。

更詳細的資訊,包括入門指南,可在 Intel 網站 上找到。

什麼是儀器和跟蹤技術 (ITT) API#

Intel® VTune™ Profiler 提供的 儀器和跟蹤技術 API (ITT API) 允許目標應用程式在執行期間生成和控制跟蹤資料的收集。

ITT 功能的優勢在於可以在 Intel® VTune™ Profiler GUI 上標記單個 PyTorch 運算子以及自定義區域的時間跨度。當用戶發現任何異常時,定位行為異常的運算子將非常有幫助。

注意

ITT API 自 1.13 版本起已整合到 PyTorch 中。使用者無需呼叫原始的 ITT C/C++ API,只需呼叫 PyTorch 中的 Python API 即可。更詳細的資訊可在 PyTorch Docs 中找到。

如何在 Intel® VTune™ Profiler 中視覺化 PyTorch 模型層次結構#

PyTorch 提供了兩種使用方式

  1. 隱式呼叫:預設情況下,當啟用 ITT 功能時,所有按照 PyTorch 運算子註冊機制註冊的運算子都將自動被 ITT 功能標記。

  2. 顯式呼叫:如果需要自定義標記,使用者可以使用 PyTorch Docs 中提到的 API 來顯式標記所需的範圍。

要啟用顯式呼叫,應該在 torch.autograd.profiler.emit_itt() 作用域下呼叫預期的標記程式碼。例如:

with torch.autograd.profiler.emit_itt():
  <code-to-be-profiled...>

啟動 Intel® VTune™ Profiler#

要驗證該功能,您需要啟動一個 Intel® VTune™ Profiler 例項。請查閱 Intel® VTune™ Profiler 使用者指南 以瞭解啟動 Intel® VTune™ Profiler 的步驟。

注意

使用者還可以透過遵循 Intel® VTune™ Profiler Web Server UI 指南 來使用 web-server-ui,例如:vtune-backend –web-port=8080 –allow-remote-access –enable-server-profiling

一旦您啟動了 Intel® VTune™ Profiler GUI,您應該會看到如下的使用者介面:

../_images/vtune_start.png

在左側導航欄的 sample (matrix) 專案下有三個示例結果。如果您不希望分析結果出現在此預設示例專案中,可以透過藍色 Configure Analysis… 按鈕下的 New Project… 按鈕建立一個新專案。要開始新的分析,請點選藍色 Configure Analysis… 按鈕來啟動分析配置。

配置 CPU 分析#

點選 Configure Analysis… 按鈕後,您應該會看到如下螢幕:

../_images/vtune_config.png

視窗的右側分為三部分:WHERE(左上角)、WHAT(左下角)和 HOW(右側)。使用 WHERE,您可以指定要在其上執行分析的機器。使用 WHAT,您可以設定要分析的應用程式的路徑。要分析 PyTorch 指令碼,建議將所有手動步驟(包括啟用 Python 環境和設定必要的環境變數)包裝到一個 bash 指令碼中,然後分析此 bash 指令碼。在上圖的截圖中,我們將所有步驟包裝到 launch.sh bash 指令碼中,並以引數 <path_of_launch.sh> 分析 bash。在右側 HOW 部分,您可以選擇任何您想要分析的型別。Intel® VTune™ Profiler 提供了許多可供選擇的分析型別。詳細資訊可在 Intel® VTune™ Profiler 使用者指南 中找到。

配置 XPU 分析#

選擇 GPU Offload Profiling Type 而不是 Hotspots,並按照與 CPU 相同的說明來啟動應用程式。

../_images/vtune_xpu_config.png

讀取分析結果#

透過成功的 ITT 分析,您可以開啟分析結果的 Platform 選項卡,在 Intel® VTune™ Profiler 時間線上看到標記。

../_images/vtune_timeline.png

時間線顯示主執行緒作為頂部的 python 執行緒,以及下面的各個 OpenMP 執行緒。標記的 PyTorch 運算子和自定義區域顯示在主執行緒行中。所有以 aten:: 開頭的運算子都是 PyTorch 中 ITT 功能隱式標記的運算子。標籤 iteration_N 是透過特定的 API torch.profiler.itt.range_push()torch.profiler.itt.range_pop()torch.profiler.itt.range() 作用域顯式標記的。請參考下一節的示例程式碼以獲取詳細資訊。

注意

標記為 convolutionreorder 的紅色框是從 Intel® oneAPI Deep Neural Network Library (oneDNN) 標記的。

如右側導航欄所示,時間線行中的棕色部分顯示了各個執行緒的 CPU 使用情況。執行緒行的高度佔棕色部分的比例與該時間戳下該執行緒的 CPU 使用率相對應。因此,從這條時間線可以直觀地理解以下幾點:

  1. 每個執行緒的 CPU 核心利用率如何。

  2. 所有執行緒的 CPU 核心利用率如何平衡。所有執行緒的 CPU 使用率是否良好?

  3. OpenMP 執行緒的同步情況如何。啟動 OpenMP 執行緒或 OpenMP 執行緒完成時是否有抖動。

當然,Intel® VTune™ Profiler 提供了更多豐富的分析功能來幫助您理解效能問題。當您瞭解效能問題的根本原因時,就可以修復它。更詳細的使用說明可在 Intel® VTune™ Profiler 使用者指南 中找到。

讀取 XPU 分析結果#

透過成功的 ITT 分析,您可以開啟分析結果的 Platform 選項卡,在 Intel® VTune™ Profiler 時間線上看到標記。

../_images/vtune_xpu_timeline.png

時間線顯示頂部的 python 執行緒為主執行緒。標記的 PyTorch 運算子和自定義區域顯示在主執行緒行中。所有以 aten:: 開頭的運算子都是 PyTorch 中 ITT 功能隱式標記的運算子。時間線還顯示頂部的 GPU 計算佇列,使用者可以看到不同的 XPU 核心被分派到 GPU 佇列。

一個簡短的程式碼示例,展示瞭如何使用 PyTorch ITT API#

下面的示例程式碼是在上述截圖中用於效能分析的指令碼。

拓撲由兩個運算子 Conv2dLinear 組成。進行了三次推理迭代。每次迭代都透過 PyTorch ITT API 標記為文字字串 iteration_N。成對的 torch.profile.itt.range_pushtorch.profile.itt.range_poptorch.profile.itt.range 作用域執行自定義標記功能。

# sample.py

import torch
import torch.nn as nn

class ITTSample(nn.Module):
  def __init__(self):
    super(ITTSample, self).__init__()
    self.conv = nn.Conv2d(3, 5, 3)
    self.linear = nn.Linear(292820, 1000)

  def forward(self, x):
    x = self.conv(x)
    x = x.view(x.shape[0], -1)
    x = self.linear(x)
    return x

def main():
  m = ITTSample
  # unmark below code for XPU
  # m = m.to("xpu")
  x = torch.rand(10, 3, 244, 244)
  # unmark below code for XPU
  # x = x.to("xpu")
  with torch.autograd.profiler.emit_itt():
    for i in range(3)
      # Labeling a region with pair of range_push and range_pop
      #torch.profiler.itt.range_push(f'iteration_{i}')
      #m(x)
      #torch.profiler.itt.range_pop()

      # Labeling a region with range scope
      with torch.profiler.itt.range(f'iteration_{i}'):
        m(x)

if __name__ == '__main__':
  main()

下面顯示了在 Intel® VTune™ Profiler GUI 截圖中提到的 launch.sh bash 指令碼,用於包裝所有手動步驟。

# launch.sh

#!/bin/bash

# Retrieve the directory path where the path contains both the sample.py and launch.sh so that this bash script can be invoked from any directory
BASEFOLDER=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
<Activate a Python environment>
cd ${BASEFOLDER}
python sample.py