利用 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.amp
或torch.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來聯絡。