利用英特尔® 高级矩阵扩展¶
创建于:2023年6月14日 | 最后更新:2023年6月14日 | 最后验证:未验证
介绍¶
高级矩阵扩展(AMX),也称为英特尔® 高级矩阵扩展(Intel® AMX),是一种x86扩展,它引入了两个新组件:一个称为“tiles”的二维寄存器文件和一个能够在这些tiles上操作的Tile Matrix Multiplication(TMUL)加速器。AMX旨在处理矩阵,以加速CPU上的深度学习训练和推理,非常适合自然语言处理、推荐系统和图像识别等工作负载。
英特尔通过第四代英特尔® 至强® 可扩展处理器和英特尔® AMX 提升了 AI 能力,与上一代相比,推理和训练性能提高了 3 到 10 倍,请参阅 使用英特尔® AMX 加速 AI 工作负载。 与运行英特尔® 高级矢量扩展 512 神经网络指令(Intel® AVX-512 VNNI)的第三代英特尔至强可扩展处理器相比, 运行英特尔 AMX 的第四代英特尔至强可扩展处理器每周期可以执行 2,048 次 INT8 操作,而不是每周期 256 次 INT8 操作。它们还可以每周期执行 1,024 次 BF16 操作,相比之下每周期只能执行 64 次 FP32 操作,请参阅 使用英特尔® AMX 加速 AI 工作负载 的第 4 页。 有关 AMX 的更多详细信息,请参阅 英特尔® 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操作:
conv1dconv2dconv3dconv_transpose1dconv_transpose2dconv_transpose3dbmmmmbaddbmmaddmmaddbmmlinearmatmul
可以利用AMX的量化CPU操作:
conv1dconv2dconv3dconv_transpose1dconv_transpose2dconv_transpose3dlinear
确认正在使用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已被激活。