• 教學 >
  • 利用 Intel® Advanced Matrix Extensions
捷徑

利用 Intel® Advanced Matrix Extensions

建立於:2023 年 6 月 14 日 | 最後更新:2023 年 6 月 14 日 | 最後驗證:未驗證

簡介

Advanced Matrix Extensions (AMX),也稱為 Intel® Advanced Matrix Extensions (Intel® AMX),是一種 x86 擴充功能,它引入了兩個新元件:一個稱為「tiles」的二維暫存器檔案和一個 Tile Matrix Multiplication (TMUL) 加速器,能夠在這些 tiles 上運算。 AMX 旨在處理矩陣,以加速 CPU 上的深度學習訓練和推論,並且非常適合自然語言處理、推薦系統和影像辨識等工作負載。

Intel 透過第四代 Intel® Xeon® 可擴充處理器和 Intel® AMX 提升 AI 功能,與前一代相比,提供 3 到 10 倍更高的推論和訓練效能,請參閱使用 Intel® AMX 加速 AI 工作負載。 與執行 Intel® Advanced Vector Extensions 512 Neural Network Instructions (Intel® AVX-512 VNNI) 的第三代 Intel Xeon 可擴充處理器相比,執行 Intel AMX 的第四代 Intel Xeon 可擴充處理器每個週期可以執行 2,048 個 INT8 運算,而不是每個週期 256 個 INT8 運算。 與每個週期 64 個 FP32 運算相比,它們還可以執行每個週期 1,024 個 BF16 運算,請參閱使用 Intel® AMX 加速 AI 工作負載的第 4 頁。 有關 AMX 的更多詳細資訊,請參閱Intel® AMX 概觀

PyTorch 中的 AMX

PyTorch 利用 AMX 及其後端 oneDNN 進行 BFloat16 的運算密集型運算子和 INT8 的量化,以便在支援 AMX 的 x86 CPU 上獲得更高的開箱即用效能。 有關 oneDNN 的更多詳細資訊,請參閱oneDNN

該運算完全由 oneDNN 根據產生的執行程式碼路徑處理。 例如,當支援的運算在具有 AMX 支援的硬體平台上執行到 oneDNN 實作中時,AMX 指令將在 oneDNN 內部自動調用。 由於 oneDNN 是 PyTorch CPU 的預設加速函式庫,因此無需手動操作即可啟用 AMX 支援。

使用工作負載利用 AMX 的準則

本節提供有關如何使用各種工作負載利用 AMX 的準則。

  • BFloat16 資料類型

    • 使用 torch.cpu.amptorch.autocast("cpu") 將利用 AMX 加速來支援運算子。

    model = model.to(memory_format=torch.channels_last)
    with torch.cpu.amp.autocast():
       output = model(input)
    

注意

使用 torch.channels_last 記憶體格式以獲得更好的效能。

  • 量化

    • 應用量化將利用 AMX 加速來支援運算子。

  • torch.compile

    • 當產生的圖形模型以支援的運算子執行到 oneDNN 實作中時,AMX 加速將會被啟用。

注意

在支援 AMX 的 CPU 上使用 PyTorch 時,該框架預設會自動啟用 AMX 使用。 這表示 PyTorch 會盡可能利用 AMX 功能來加速矩陣乘法運算。 然而,重要的是要注意,是否分派到 AMX 核心的決定最終取決於 oneDNN 函式庫和量化後端的內部最佳化策略,PyTorch 依靠這些策略來增強效能。 PyTorch 和 oneDNN 函式庫在內部處理 AMX 利用的具體細節可能會隨著框架的更新和改進而改變。

可以利用 AMX 的 CPU 運算子:

可以利用 AMX 的 BF16 CPU 運算

  • conv1d

  • conv2d

  • conv3d

  • conv_transpose1d

  • conv_transpose2d

  • conv_transpose3d

  • bmm

  • mm

  • baddbmm

  • addmm

  • addbmm

  • linear

  • matmul

可以利用 AMX 的量化 CPU 運算

  • conv1d

  • conv2d

  • conv3d

  • conv_transpose1d

  • conv_transpose2d

  • conv_transpose3d

  • linear

確認 AMX 是否正在使用

設定環境變數 export ONEDNN_VERBOSE=1,或使用 torch.backends.mkldnn.verbose 以啟用 oneDNN 來傾印詳細訊息。

with torch.backends.mkldnn.verbose(torch.backends.mkldnn.VERBOSE_ON):
    with torch.cpu.amp.autocast():
        model(input)

例如,取得 oneDNN 詳細資訊

onednn_verbose,info,oneDNN v2.7.3 (commit 6dbeffbae1f23cbbeae17adb7b5b13f1f37c080e)
onednn_verbose,info,cpu,runtime:OpenMP,nthr:128
onednn_verbose,info,cpu,isa:Intel AVX-512 with float16, Intel DL Boost and bfloat16 support and Intel AMX with bfloat16 and 8-bit integer support
onednn_verbose,info,gpu,runtime:none
onednn_verbose,info,prim_template:operation,engine,primitive,implementation,prop_kind,memory_descriptors,attributes,auxiliary,problem_desc,exec_time
onednn_verbose,exec,cpu,reorder,simple:any,undef,src_f32::blocked:a:f0 dst_f32::blocked:a:f0,attr-scratchpad:user ,,2,5.2561
...
onednn_verbose,exec,cpu,convolution,jit:avx512_core_amx_bf16,forward_training,src_bf16::blocked:acdb:f0 wei_bf16:p:blocked:ABcd16b16a2b:f0 bia_f32::blocked:a:f0 dst_bf16::blocked:acdb:f0,attr-scratchpad:user ,alg:convolution_direct,mb7_ic2oc1_ih224oh111kh3sh2dh1ph1_iw224ow111kw3sw2dw1pw1,0.628906
...
onednn_verbose,exec,cpu,matmul,brg:avx512_core_amx_int8,undef,src_s8::blocked:ab:f0 wei_s8:p:blocked:BA16a64b4a:f0 dst_s8::blocked:ab:f0,attr-scratchpad:user ,,1x30522:30522x768:1x768,7.66382
...

如果您獲得 BFloat16 的 avx512_core_amx_bf16 或 INT8 量化的 avx512_core_amx_int8 的詳細資訊,則表示 AMX 已啟用。

結論

在本教學中,我們簡要介紹了 AMX、如何在 PyTorch 中利用 AMX 來加速工作負載,以及如何確認 AMX 正在使用。

隨著 PyTorch 和 oneDNN 的改進和更新,AMX 的使用情況可能會相應地變更。

與往常一樣,如果您遇到任何問題或有任何疑問,可以使用論壇GitHub issues來聯絡。

文件

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

檢視文件

教學

取得適合初學者和進階開發人員的深入教學

檢視教學

資源

尋找開發資源並獲得問題解答

檢視資源