Pytorch2.0发布了,向下兼容,加一句代码,性能翻番

news2024/9/20 11:00:05

概述

介绍PyTorch 2.0,我们迈向PyTorch下一代2系列发行版的第一步。在过去的几年里,我们进行了创新和迭代,从PyTorch 1.0到最近的1.13,并转移到新成立的PyTorch基金会,它是Linux基金会的一部分。

除了我们令人惊叹的社区之外,PyTorch最大的优势是我们继续作为一流的Python集成、命令式风格、API和选项的简单性。PyTorch 2.0提供了相同的急切模式开发和用户体验,同时从根本上改变和加强了PyTorch在底层编译器级别的操作方式。我们能够为动态形状和分布式提供更快的性能和支持。

下面你会发现你需要更好地理解PyTorch 2.0是什么,它的发展方向,更重要的是今天如何开始(例如,教程,需求,模型,常见的常见问题)的所有信息。还有很多东西需要学习和开发,但我们期待社区的反馈和贡献,使2系列更好,感谢所有使1系列如此成功的人。

PYTORCH 2.X:更快,更python化,和以前一样动态

今天,我们宣布了torch.compile,这一特性将PyTorch的性能推到新的高度,并开始将PyTorch的部分内容从c++移回Python。我们相信这是PyTorch的一个重要的新方向——因此我们称之为2.0。compile是一个完全可添加的(可选的)特性,因此根据定义2.0是100%向后兼容的。

  • 支持torch.compile的是一些新技术——TorchDynamo, AOTAutograd, PrimTorch和TorchInductor。

  • TorchDynamo使用Python框架评估钩子安全地捕获PyTorch程序,这是我们在安全图形捕获方面进行了5年研发的一个重大创新

  • AOTAutograd会重载PyTorch的autograd引擎,作为一个跟踪autodiff来生成提前向后的跟踪。

  • PrimTorch将大约2000多个PyTorch操作符规范化,简化为一个大约250个基本操作符的封闭集合,开发人员可以针对这些操作符构建一个完整的PyTorch后端。这大大降低了编写PyTorch特性或后端的障碍。

  • TorchInductor是一个深度学习编译器,可以为多个加速器和后端生成快速代码。对于NVIDIA gpu,它使用OpenAI Triton作为关键构建块。

  • 46个HuggingFace Transomer的模型

  • TIMM的61个模型:由Ross Wightman收集最先进的PyTorch图像模型

  • TorchBench的56个模型:一组来自整个github的流行代码库

我们不修改这些开源模型,只是添加了一个torch.compile调用来包装它们。

然后我们测量加速并验证这些模型的准确性。由于加速可以依赖于数据类型,我们在float32和自动混合精度(AMP)上测量加速。我们报告了一个不均匀的加权平均加速0.75 * AMP + 0.25 * float32,因为我们发现AMP在实践中更常见。

在这163个开源模型中,torch.compile的工作时间达到93%,在NVIDIA A100 GPU上训练时,该模型的运行速度要快43%。在Float32精度上,它的运行速度平均快21%,在AMP精度上,它的运行速度平均快51%。

注意:在桌面级GPU(如NVIDIA 3090)上,我们测量的速度要低于服务器级GPU(如A100)。到今天为止,我们的默认后端TorchInductor支持cpu和NVIDIA Volta和安培gpu。它(还)不支持其他gpu, xpu或更老的NVIDIA gpu。

TorchDynamo、AOTAutograd、PrimTorch和TorchInductor都是用Python编写的,支持动态形状(即可以发送不同大小的张量而不需要重新编译),这使得它们灵活、容易被黑客攻击,并降低了开发人员和供应商的进入门槛。

为了验证这些技术,我们在不同的机器学习领域使用了163个不同的开源模型。我们仔细地构建了这个基准测试,包括图像分类、目标检测、图像生成、各种NLP任务,如语言建模、问答、序列分类、推荐系统和强化学习。我们将基准分为三类:
在这里插入图片描述

不妨试试:torch.compile正处于开发的早期阶段。从今天开始,您可以在夜间的二进制文件中尝试使用torch.compile。我们预计在2023年3月初发布第一个稳定的2.0版本。

在PyTorch 2的路线图中。X,我们希望在性能和可伸缩性方面将编译模式推进得越来越远。正如我们今天在会议上谈到的,其中一些工作正在进行中。其中一些工作还没有开始。其中一些工作是我们希望看到的,但我们自己没有足够的带宽去做。如果你有兴趣投稿,请在本月开始的Ask the Engineers: 2.0 Live Q&A系列中与我们聊天(详情见本文末尾)或通过Github / forum。

动机

我们在PyTorch上的理念一直是把灵活性和可破解性放在首位,性能紧随其后。我们争取:

  • 高性能快速执行

  • 整洁的内部

  • 对分布式,自动差异,数据加载,加速器等更好的抽象。

自从我们在2017年推出PyTorch以来,硬件加速器(如gpu)的计算速度提高了约15倍,内存访问速度提高了约2倍。因此,为了保持在高性能状态下的快速执行,我们不得不将PyTorch内部的大量部分迁移到c++中。将内部代码迁移到c++中使其不易被黑客攻击,并增加了代码贡献的进入障碍。

从第一天起,我们就知道急切执行的性能极限。2017年7月,我们开始了第一个为PyTorch开发编译器的研究项目。编译器需要使PyTorch程序快速,但不能以牺牲PyTorch体验为代价。我们的关键标准是保持某种灵活性——支持研究人员在不同探索阶段使用的动态形状和动态程序。

用户体验

我们介绍一个简单的函数torch.compile,它包装模型并返回一个编译后的模型:

compiled_model = torch.compile(model)

compiled_model保存对模型的引用,并将转发函数编译为一个更优化的版本。在编译模型时,我们给了几个旋钮来调整它:

def torch.compile(model: Callable,
*,
mode: Optional[str] = "default",
dynamic: bool = False,
fullgraph:bool = False,
backend: Union[str, Callable] = "inductor",
# advanced backend options go here as kwargs
**kwargs
) -> torch._dynamo.NNOptimizedModule

mode:指定编译器在编译时应该优化什么。

  • 默认模式是一种预设模式,它试图有效地编译,而不会花费太长时间编译或使用额外的内存。
  • 其他模式,如reduce-overhead,可以大大减少框架开销,但只消耗少量额外内存。Max-autotune编译了很长时间,试图为您提供它所能生成的最快的代码。

dynamic指定是否启用动态形状的代码路径。某些编译器优化不能应用于动态形状程序。明确您想要一个带有动态形状还是静态形状的编译程序,将有助于编译器提供更好的优化代码。

fullgraph类似于Numba的nopython。它将整个程序编译成一个图形,或者给出一个错误解释为什么它不能这样做。大多数用户不需要使用这种模式。如果您非常注重性能,那么您可以尝试使用它。

Backend指定要使用哪个编译器后端。默认情况下,使用TorchInductor,但还有其他一些可用的工具。

在这里插入图片描述
一个完整的实例:

import torch
import torchvision.models as models

model = models.resnet18().cuda()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
compiled_model = torch.compile(model)

x = torch.randn(16, 3, 224, 224).cuda()
optimizer.zero_grad()
out = compiled_model(x)
out.sum().backward()
optimizer.step()

第一次运行compiled_model(x)时,它将编译模型。因此,它需要更长的运行时间。后续的运行速度很快。

Modes

编译器有一些预设,可以用不同的方式调优编译后的模型。由于框架开销,您可能正在运行一个速度较慢的小型模型。或者,您可能正在运行一个几乎无法装入内存的大型模型。根据您的需要,您可能需要使用不同的模式。

# API NOT FINAL
# default: optimizes for large models, low compile-time
#          and no extra memory usage
torch.compile(model)

# reduce-overhead: optimizes to reduce the framework overhead
#                and uses some extra memory. Helps speed up small models
torch.compile(model, mode="reduce-overhead")

# max-autotune: optimizes to produce the fastest model,
#               but takes a very long time to compile
torch.compile(model, mode="max-autotune")

reduce-overhead适用于小模型,max-autotune类似TensorRT那样生成一个更加快速的模型。

如何安装Pytorch2.0

CUDA 11.7

pip install numpy --pre torch[dynamo] torchvision torchaudio --force-reinstall --extra-index-url https://download.pytorch.org/whl/nightly/cu117

CUDA 11.6

pip install numpy --pre torch[dynamo] torchvision torchaudio --force-reinstall --extra-index-url https://download.pytorch.org/whl/nightly/cu116

CPU

pip install numpy --pre torch torchvision torchaudio --force-reinstall --extra-index-url https://download.pytorch.org/whl/nightly/cpu

总结

核心是compile,增加一句话,实现模型近一倍的提速,我表示怀疑,等正式版吧!欢迎勇士去做尝试,如果有问题请留言讨论。

参考:

https://pytorch.org/get-started/pytorch-2.0/#distributed

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python中的全局变量与命名法

--------------------------------------------------------------------------------------------------------------------------------- 在本文章中,我们来讨论一下python中的全局变量,我们将学习如何定义全局变量,然后如何在函数中访问它…

HTML静态网页作业——澳门英文旅游网站设计与实现HTML+CSS+JavaScript

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

在windows server 2016安装Web服务器(IIS)

无论是用.NET开发网站和Web服务,都需要发布于Web服务器(IIS)上,以下记录在windows server 2016 标准版上安装Web服务器(IIS)的过程。 1.打开服务器管理器,选择“添加角色和功能” 2.确认管理员帐户为强密码…

[附源码]计算机毕业设计基于springboot的汽车租赁系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Android S(31) PMS 服务启动原理

1、PMS 启动 SystemServer进程启动引导服务时启动PMS,方法调用SystemServer.run()-startBootstrapServices,通过 PackageManagerService.main中 new PackageManagerService()实例化PackageManagerService对象。 PMS 的主要作用是解析 system/和 data/ 目录下的apk…

讲讲我是如何一步步成为CSDN博客专家的心路历程

大家好,给大家先做个自我介绍 我是码上代码,大家可以叫我码哥 我也是一个普通本科毕业的最普通学生,我相信大部分程序员或者想从事程序员行业的都是普通家庭的孩子,所以我也是靠自己的努力,从毕业入职到一家传统企业&a…

pytorch 学习第三天 交叉熵

交叉熵 信息量 假设X是一个离散型随机变量,其取值集合为X,概率分布函数为p(x)Pr(Xx),x∈X 我们定义事件Xx0的信息量为:I(x0)−log(p(x0)),可以理解为,一个事件发生的概率越大,则它所携带的信息量就越小&a…

计算机网络(自顶向下)—第四章测验题

“计算机网络”第四章测验题 一个 B 类网络 128.16.0.0/16 被网络管理员划分为 16 个大小相同的子网,则子网掩码为255.255.240.0。如果按照 IP 地址从小到大对子网进行编号,写出第2 个子网的地址范围,用 a.b.c.d/x 的形式表示128.16.16.0/20。…

阿里最新产,SpringCloud 微服务核心技术全解手册 Github 星标 50k

SpringCloud 想必每一位 Java 程序员都不会陌生,很多人一度把他称之为“微服务全家桶”,它通过简单的注解,就能快速地架构微服务,这也是 SpringCloud 的最大优势。但是最近有去面试过的朋友就会发现,现在面试你要是没有…

C语言第十七课:初阶指针

目录 前言: 一、指针是什么: 1.那么指针到底是什么呢? 2.内存中的数据存储原理: 3.数据存储与指针使用实例: 4.存储编址原理: 二、指针和指针类型: 1.决定了指针的步长: 2.决定了…

[附源码]计算机毕业设计基于Springboot的项目管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【Autopsy数字取证篇】Autopsy案例更改时区

【Autopsy数字取证篇】Autopsy案例更改时区 Autopsy—【蘇小沐】 文章目录【Autopsy数字取证篇】Autopsy案例更改时区1.实验环境2.Autopsy下载安装(一)"添加数据源"处修改(二)"数据分析完成"处修改总结1.实验…

认证服务------功能实现逻辑

认证服务分为两种,一种是社交登录,一种是单点登录,都交给认证中心(OAuth2.0)来处理,用一个专门的服务来作这个认证中心,所有的登录注册都是由这个认证中心来处理的,由于注册要发短信…

【负荷预测】基于双向LSTM模型进行电力需求预测(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🎉作者研究:🏅🏅🏅主要研究方向是电力系统和智能算法、机器学…

html大学生网站开发实践作业:传统文化网页设计题材【绒花6页】HTML+CSS+JavaScript

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

图解curator如何实现zookeeper分布式锁

文章目录一、前言二、curator分布式锁种类三、Zookeeper分布式锁概述1、Zookeeper分布式锁实现思路2、Zookeeper分布式锁解决的问题3、Zookeeper分布式锁优缺点?四、InterProcessMute实现分布式锁原理1、加锁流程(acquire()方法)0&#xff09…

【消息中间件】为什么选择RocketMQ及SpringBoot整合使用案例

目录 一、为什么选择RocketMQ 1、为什么是为什么选择RocketMQ 2、RocketMQ、ActiveMQ和Kafka之间的比较 2.1、对比1 2.2、对比2,接着上表 二、使用案例 1、引入依赖 2、编写启动类 3、编写application.yml配置文件 4、创建rocketmq文件夹 4.1、创建生产者…

YOLO算法创新改进系列项目汇总(入门级教程指南)

🚀🚀🚀——YOLO算法创新改进系列项目汇总——🎄🎄🎄 🚀 YOLO算法创新改进系列项目汇总 🎄🎈 🍀 改进YOLOv5/YOLOv7——魔改YOLOv5/YOLOv7提升检测精度&#x…

Redis原理篇——内存回收

Redis是基于内存存储的,性能强。Redis的性能瓶颈也在于内存,但是单节点内存不宜过大,会影响持久化或主从同步性能。 通过配置文件来设置Redis的最大内存: 一、过期策略 Redis是键值类型的数据库,所有的key和value保…

MySQL高级语句(二)

一、VIEW(视图) 1、 概念 可以被当作是虚拟表或存储查询 视图跟表格的不同是,表格中有实际储存资料,而视图是建立在表格之上的一个架构,它本身并不实际储存资料。 临时表在用户退出或同数据库的连接断开后就自动消…