快捷方式

TunableOp

注意

這是一個原型功能,這表示它處於早期階段,用於收集回饋和測試,並且其元件可能會發生變更。

概觀

此模組公開了 TunableOp 介面。

某些運算,例如 GEMM,可以使用多個函式庫或多種技術來實作。例如,GEMM 可以使用 blas 或 blasLt 函式庫為 CUDA 或 ROCm 實作。此外,ROCm 的 rocblas 和 hipblaslt 函式庫允許使用者查詢所有可能的演算法,然後選擇一個。如何知道哪種實作最快且應選擇?這就是 TunableOp 提供的功能。

分別啟用 TunableOp 與 Tuning (調校)

TunableOp 功能的啟用與 Tuning (調校) 階段的啟用是分開的。啟用 TunableOp 表示 PyTorch 會將所有標準運算子替換為其 Tunable 實作。任何對 TunableOp 的呼叫都會先檢查是否已針對給定的運算子輸入進行 Tuning (調校)。如果是,它會立即呼叫經過 Tuning (調校) 的運算;即使啟用了 Tuning (調校) 設定,也不會進行進一步的 Tuning (調校)。相反地,如果沒有找到 Tuning (調校) 結果,且啟用了 Tuning (調校),TunableOp 會針對給定的一組輸入,對該運算子的每個已註冊的實作進行基準測試,並選擇最快的實作。

檔案輸入與輸出

第一次調用任何 TunableOp 時,將會嘗試從給定的檔案讀取結果,以準備已調校運算的內部資料庫。預設檔名為 ‘tunableop_results.csv’。為了支援在多個進程中使用多個 GPU 進行調校,GPU 裝置序號會自動插入檔名中,以避免多個進程覆蓋同一個檔案。

如果啟用了 Tuning (調校),並且在您的工作負載過程中發現了新的 Tuning (調校) 結果,它也會將所有 Tuning (調校) 結果 (包括啟動時讀入的結果以及執行時找到的新結果) 寫入到同一個檔名。例如,這可用於透過重複使用同一個檔案,在多個工作負載中建立 Tuning (調校) 檔案。應用程式終止時會自動建立輸出檔案。此行為可以透過 C++ 和 Python API 控制,但不能透過環境變數控制。

假設您指定了一個檔名,您最終會得到一個類似如下內容的 CSV 檔案

Validator,PT_VERSION,2.2.0
Validator,ROCM_VERSION,6.0.0.0-12969-1544e39
Validator,HIPBLASLT_VERSION,0.6.0-a9c5cc7
Validator,ROCBLAS_VERSION,4.0.0-72e57364-dirty
GemmTunableOp_float_NT,nt_25088_4096_64,1219,1.262
GemmTunableOp_float_NT,nt_4096_4096_64,1216,0.033

請注意 “Validator” 行。如果您更改了函式庫版本、ROCm 版本或 PyTorch 版本,TunableOp 會偵測到這一點並拒絕 Tuning (調校) 檔案,因為先前的 Tuning (調校) 結果可能會受到其他軟體變更的影響。

剩餘的行是您執行期間遇到的每個 TunableOp 的已調校解決方案。每一行由 4 個逗號分隔的欄位組成:運算子名稱、運算子參數、解決方案名稱和平均執行時間。執行時間是一個可選欄位。CSV 檔案可以編輯,但要小心。例如,解決方案名稱 (欄位 3) 可以更改為 “Default”,它會回退到原始的 PyTorch 未 Tuning (調校) 的實作。或者,對於 ROCm 的 hipBLAS 或 hipBLASLt 函式庫,如果您知道特定的解決方案索引,您可以透過替換該值來覆蓋 TunableOp 選擇的解決方案。運算子名稱和參數 (欄位 1 和 2) 在內部命名,不應修改。對於 GemmTunableOp,欄位 1 指示資料類型以及輸入是否已轉置 (T) 或未轉置 (N),欄位 2 指示 M、N、K 輸入形狀。

有一個選項可以啟用詳細輸出,但建議僅用於偵錯目的。這將產生大量診斷訊息,但可能對於查看 TunableOp 是否正在被使用很有用。否則,除了檔案輸出之外,TunableOp 完全是靜默的,除非在使用過程中出現警告或錯誤。verbose 選項只能透過設定環境變數 PYTORCH_TUNABLEOP_VEROBSE=1 來使用。

關於 Tuning (調校) 行為的注意事項

Tuning (調校) 運算子包括迭代已註冊實作的列表並對每個實作進行分析。該分析透過在迴圈中多次執行單個實作並取得平均執行時間來建立。

預設情況下,給定運算子的每個可能的解決方案將運行 100 次迭代,或者在 30 毫秒內可以運行的迭代次數 (以較小者為準),並計算其平均執行時間。將選擇所有成功分析的解決方案中最快的解決方案。如果給定的解決方案沒有達到與預設實作相同的準確度,或者如果解決方案返回錯誤代碼,則分析可能會失敗。

目前的 Tunable 運算子

ROCm 的 TunableGemm

目前僅實作了 ROCm 的 TunableGemm。請注意,使用 TunableOp 時,PyTorch 的 CUDA 建置將正常運作,但 CUDA 建置唯一可用的解決方案是 ‘Default’ 實作,即原始的 cuBLAS 預設實作,現在透過 TunableOp 呼叫。任何對 at::cuda::blas::gemm() 或 ::bgemm() 的呼叫,在啟用時都會透過 TunableOp 路由。針對給定的一組輸入參數 (transa, transb, m, n, k) 呼叫 gemm() 將嘗試使用 rocblas 和 hipblaslt 中最快的可用實作。

Tuning (調校) 內容

TunableOp 的行為目前透過環境變數、at::cuda::tunable::getTuningContext() 的 C++ 介面或封裝 C++ TuningContext 的 torch.cuda.tunable python 介面進行操作。環境變數的優先順序高於您使用 C++ 或 Python API 操作的任何設定。

API 參考

torch.cuda.tunable.enable(val=True)[source][source]

這是所有 TunableOp 實作的大型開/關切換器。

torch.cuda.tunable.is_enabled()[source][source]

傳回是否已啟用 TunableOp 功能。

回傳類型

bool

torch.cuda.tunable.tuning_enable(val=True)[source][source]

啟用 TunableOp 實作的 Tuning (調校)。

啟用後,如果找不到已調校的條目,則執行 Tuning (調校) 步驟並記錄該條目。

torch.cuda.tunable.tuning_is_enabled()[原始碼][原始碼]

回傳是否可以調整 TunableOp 的實作。

回傳類型

bool

torch.cuda.tunable.record_untuned_enable(val=True)[原始碼][原始碼]

啟用記錄 TunableOp 操作中未調整的部分,以便進行離線調整。

啟用後,若找不到已調整的項目,會將其寫入未調整的檔案中。

torch.cuda.tunable.record_untuned_is_enabled()[原始碼][原始碼]

回傳是否記錄 TunableOp 操作中未調整的部分,以便進行離線調整。

回傳類型

bool

torch.cuda.tunable.set_max_tuning_duration(duration)[原始碼][原始碼]

設定調整給定解決方案的最長時間,單位為毫秒。

如果同時設定了最大調整時間和迭代次數,則會採用兩者中較小的值。 至少會執行 1 次調整迭代。

torch.cuda.tunable.get_max_tuning_duration()[原始碼][原始碼]

取得調整給定解決方案的最長時間。

回傳類型

int

torch.cuda.tunable.set_max_tuning_iterations(iterations)[原始碼][原始碼]

設定調整給定解決方案的最大迭代次數。

如果同時設定了最大調整時間和迭代次數,則會採用兩者中較小的值。 至少會執行 1 次調整迭代。

torch.cuda.tunable.get_max_tuning_iterations()[原始碼][原始碼]

取得調整給定解決方案的最大迭代次數。

回傳類型

int

torch.cuda.tunable.set_filename(filename, insert_device_ordinal=False)[原始碼][原始碼]

設定用於輸入/輸出調整結果的檔名。

如果 insert_device_ordinalTrue,則目前的裝置序數將會自動新增到給定的檔名中。 這可用於每個 GPU 一個程序的場景,以確保所有程序都寫入到不同的檔案。

torch.cuda.tunable.get_filename()[原始碼][原始碼]

取得結果檔名。

回傳類型

str

torch.cuda.tunable.get_results()[原始碼][原始碼]

傳回所有 TunableOp 的結果。

回傳類型

Tuple[str, str, str, float]

torch.cuda.tunable.get_validators()[原始碼][原始碼]

傳回 TunableOp 驗證器。

回傳類型

Tuple[str, str]

torch.cuda.tunable.write_file_on_exit(val)[原始碼][原始碼]

在 Tuning Context 銷毀期間,將檔案寫入磁碟。

如果您的應用程式由於正常操作或錯誤而終止,這可用作將結果最終刷新到磁碟的方式。 您可以透過手動呼叫 write_file() 來手動刷新您的結果。

torch.cuda.tunable.write_file(filename=None)[原始碼][原始碼]

將結果寫入 CSV 檔案。

如果未提供 filename,則會呼叫 get_filename()

回傳類型

bool

torch.cuda.tunable.read_file(filename=None)[原始碼][原始碼]

從 TunableOp CSV 檔案讀取結果。

如果未提供 filename,則會呼叫 get_filename()

回傳類型

bool

torch.cuda.tunable.tune_gemm_in_file(filename)[原始碼][原始碼]

在檔案中調整 GEMM。

torch.cuda.tunable.mgpu_tune_gemm_in_file(filename_pattern, num_gpus)[原始碼][原始碼]

處理一個或多個檔案,並將工作分配到一個或多個 GPU 上。

文件

存取 PyTorch 的完整開發人員文件

檢視文件

教學課程

取得適用於初學者和進階開發人員的深入教學課程

檢視教學課程

資源

尋找開發資源並取得您問題的解答

檢視資源