PyTorch 2.2大更新!集成FlashAttention-2,性能提升2倍

2024-02-08 07:52

本文主要是介绍PyTorch 2.2大更新!集成FlashAttention-2,性能提升2倍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【新智元导读】新的一年,PyTorch也迎来了重大更新,PyTorch 2.2集成了FlashAttention-2和AOTInductor等新特性,计算性能翻倍。

新的一年,PyTorch也迎来了重大更新!

继去年十月份的PyTorch大会发布了2.1版本之后,全世界各地的521位开发者贡献了3628个提交,由此形成了最新的PyTorch 2.2版本。

新的版本集成了FlashAttention-2,使得scaled_dot_product_attention (SDPA)相较于之前的版本有了约2倍的性能提升。

PyTorch 2.2还引入了一个新的TorchInductor提前扩展,称为 AOTInductor,旨在为非python服务器端编译和部署PyTorch程序。

PyTorch中的torch.distributed支持了一个叫做device_mesh的新抽象,用于初始化和表示ProcessGroups。

另外,PyTorch 2.2提供了一个标准化的、可配置的日志记录机制,——TORCH_LOGS。

PyTorch 2.2还对torch.compile做了许多改进,包括改进了对编译优化器的支持,以及TorchInductor融合和布局优化。

最后值得注意的是,PyTorch将放弃对macOS x86的支持,PyTorch 2.2.x是支持macOS x64的最后一个版本。

PyTorch 2.2新特性

首先请注意,如果从源代码构建PyTorch 2.2,需要GCC 9.4或更高版本,PyTorch 代码库已从C++ 14迁移到C++ 17。

FlashAttention-2

FlashAttention-2通过优化GPU上不同线程块和warps之间的工作分区,来解决占用率低或不必要的共享内存读写。

FlashAttention-2调整了算法以减少非matmul的计算量,同时提升了Attention计算的并行性(即使是单个头,也可以跨不同的线程块,以增加占用率),在每个线程块中,优化warps之间的工作分配,以减少通过共享内存的通信。

PyTorch 2.2将FlashAttention内核更新到了v2版本,不过需要注意的是,之前的Flash Attention内核具有Windows实现,Windows用户可以强制使用sdp_kernel,仅启用Flash Attention的上下文管理器。

而在2.2中,如果必须使用 sdp_kernel 上下文管理器,请使用memory efficient或math内核(在Windows上)。

在FlashAttention-2的加持之下,torch.nn.functional.scaled_dot_product_attention的速度提升了大约2倍,在A100 GPU上达到了理论计算峰值的50%-73%。

AOTInductor

AOTInductor是TorchInductor的扩展,用于处理导出的PyTorch模型,对其进行优化,并生成共享库以及其他相关工件。

这些编译的工件可以部署在非Python环境中,经常用于服务器端的推理。

下面的示例演示了如何调用 aot_compile 将模型转换为共享库。

AOTInductor支持与Inductor相同的后端,包括CUDA、ROCm和CPU。

TORCH_LOGS

PyTorch 2.2提供了一个标准化的、可配置的日志记录机制,可用于分析各种子系统的状态,例如编译和分布式操作

可以通过TORCH_LOGS环境变量启用日志。比如通过在命令行中修改环境变量:

将TorchDynamo的日志级别设置为logging.ERROR,将TorchInductor的日志级别设置为logging.DEBUG。

当然也可以在代码中以API的形式使用:

torch.distributed.device_mesh

PyTorch 2.2引入了一个新的抽象,用于表示分布式并行中涉及的 ProcessGroups,称为torch.distributed.device_mesh。

为分布式训练设置分布式通信器(NCCL)是一件麻烦的事情。用户需要编写不同并行度的工作负载,并为每个并行度手动设置和管理NCCL通信器(ProcessGroup )。

这个过程可能很复杂,容易出错。而DeviceMesh 可以简化此过程,使其更易于管理。

DeviceMesh 是管理 ProcessGroup 的更高级别的抽象。它允许用户毫不费力地创建节点间和节点内进程组,而不必担心如何为不同的子进程组正确设置等级。

例如,数组的其中一个维度可以表示FSDP中的数据并行(data parallelism),而另一个维度可以表示FSDP中的张量并行(tensor parallelism)。

用户还可以通过 DeviceMesh 轻松管理底层process_groups,以实现多维并行。

DeviceMesh在处理多维并行性(如3D并行)时很有用。如上图所示,当你的并行解决方案需要跨主机和每个主机内部进行通信时,可以创建一个2D网格,用于连接每个主机中的设备,并以同构设置将每个设备与其他主机上的对应设备连接起来。

借助 init_device_mesh() ,我们可以在短短两行内完成上面这个2D设置:

而如果不使用DeviceMesh,我们大概需要自己写下面这一堆代码:

当然,如果需要,我们仍然可以访问底层 ProcessGroup:

优化器的改进

大概有以下几点:

编译优化器在所有基准测试中都提高了性能:HuggingFace +18%、TorchBench +19%、TIMM +8% E2E;

编译的优化器增加对cudagraphs的支持;

对测试套件中所有模型进行平均,每个测试套件的基准测试平均编译时间增加约40秒;正在进行的优化可能会将其降低到30秒以下。

用于多张量优化器编译的inductor中缺少的主要功能是foreach算子的高效编码生成。

在调度器内部,将所有在下放过程中注册的缓冲区列表凝聚到ForeachKernelSchedulerNodes中(FusedSchedulerNode的子类)。

为了检查融合是否合法,每个内部 SchedulerNode 执行的写操作必须与消费SchedulerNode在同一列表索引处的读操作相匹配。

此外,正常的垂直融合规则必须允许在消费者和生产者SchedulerNode列表的每个索引处进行融合。

如果满足了这些条件,ForeachKernelSchedulerNode将垂直融合成一个 ForeachKernelSchedulerNode,其中每个列表上的相应点操作都将被融合。

通过实现这种融合,可以将一系列 foreach 运算融合到单个内核中,从而实现多张量优化器的完全融合。

性能改进

TorchInductor中添加了许多性能优化,包括对torch.concat的水平融合支持、改进的卷积布局优化、以及改进scaled_dot_product_attention模式匹配。

PyTorch 2.2还包括aarch64的许多性能增强,包括对mkldnn权重预打包的支持、改进的ideep基元缓存,以及通过对OneDNN的固定格式内核改进,来提高推理速度。

参考资料:

https://pytorch.org/blog/pytorch2-2/

这篇关于PyTorch 2.2大更新!集成FlashAttention-2,性能提升2倍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/690378

相关文章

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

Swagger2与Springdoc集成与使用详解

《Swagger2与Springdoc集成与使用详解》:本文主要介绍Swagger2与Springdoc集成与使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1. 依赖配置2. 基础配置2.1 启用 Springdoc2.2 自定义 OpenAPI 信息3.