• 教程 >
  • 利用英特尔®高级矩阵扩展
快捷键

利用英特尔®高级矩阵扩展(AMX)¶

创建时间:2025 年 4 月 1 日 | 最后更新时间:2025 年 4 月 1 日 | 最后验证:未验证

简介

高级矩阵扩展(AMX),也称为英特尔®高级矩阵扩展(英特尔® AMX),是一种 x86 扩展,它引入了两个新组件:一个名为“tiles”的二维寄存器文件和一个能够对这些 tiles 进行操作的 Tile 矩阵乘法(TMUL)加速器。AMX 旨在在 CPU 上加速深度学习训练和推理,非常适合自然语言处理、推荐系统和图像识别等工作负载。

英特尔通过第 4 代英特尔® 至强® 可扩展处理器和英特尔® AMX 技术,将 AI 能力提升至前一代的 3 倍至 10 倍,详见《使用英特尔® AMX 加速 AI 工作负载》。与运行英特尔® 高级矢量扩展 512 神经网络指令(英特尔® AVX-512 VNNI)的第三代英特尔® 至强® 可扩展处理器相比,运行英特尔 AMX 的第 4 代英特尔® 至强® 可扩展处理器每周期可执行 2,048 个 INT8 操作,而第三代处理器每周期只能执行 256 个 INT8 操作。它们还可以每周期执行 1,024 个 BF16 操作,相比之下,每周期只能执行 64 个 FP32 操作,详见《使用英特尔® AMX 加速 AI 工作负载》第 4 页。有关 AMX 的更多详细信息,请参阅英特尔® AMX 概述。

PyTorch 中的 AMX 应用指南¶

PyTorch 通过其后端 oneDNN 利用 AMX 进行计算密集型操作,支持 BFloat16 和 INT8 量化,从而在支持 AMX 的 x86 CPU 上实现即插即用的更高性能。有关 oneDNN 的更多详细信息,请参阅 oneDNN。

该操作完全由 oneDNN 根据生成的执行代码路径处理。例如,当支持的运算在具有 AMX 支持的硬件平台上执行到 oneDNN 实现时,oneDNN 内部将自动调用 AMX 指令。由于 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
...

如果您获取了 avx512_core_amx_bf16 的详细模式,表示 BFloat16 已激活;或 avx512_core_amx_int8 的详细模式,表示 INT8 量化已激活。

结论 ¶

在本教程中,我们简要介绍了 AMX,如何在 PyTorch 中利用 AMX 加速工作负载,以及如何确认 AMX 正在被使用。

随着 PyTorch 和 oneDNN 的改进和更新,AMX 的使用可能相应地发生变化。

如有问题或疑问,请使用论坛或 GitHub 问题来联系。


评分这个教程

© 版权所有 2024,PyTorch。

使用 Sphinx 构建,主题由 Read the Docs 提供。
//暂时添加调查链接

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得您的疑问解答

查看资源