首页 >>  正文

引入pytorch库代码写法

来源:baiyundou.net   日期:2024-09-21

在 PyTorch Conference 2022 上,PyTorch 官方正式发布了 PyTorch 2.0,与先前的 1.x 版本相比,2.0 中有了跨越式的变化。

译者 | 刘春霖 责编 | 杨紫艳

出品 | CSDN (ID:csdnnews)

在11月初,PyTorch 团队在官方博客宣布 Pytorch 1.13 发布。据官方介绍,PyTorch 1.13 中包括了 BetterTransformer 的稳定版,且不再支持 CUDA 10.2 及 11.3,并完成了向 CUDA 11.6 及 11.7 的迁移。此外 Beta 版还增加了对 Apple M1 芯片及 functorch 的支持。令人意外的是,12月2日,PyTorch 2.0 正式发布!与先前的 1.x 版本相比,2.0 中有了跨越式的变化。PyTorch 2.0 中发布了大量足以改变 PyTorch 使用方式的新功能,它提供了相同的 eager mode 和用户体验,同时通过 torch.compile 增加了一个编译模式,在训练和推理过程中可以对模型进行加速,从而提供更佳的性能和对 Dynamic Shapes 及分布式运行的支持。PyTorch 团队表示,PyTorch 2.0 是他们向 2.x 系列迈出的第一步,其稳定版预计在 2023 年 3 月初发布。

PyTorch 2.x:更快、更 Python!

PyTorch 2.0 官宣了一个重要特性 —— torch.compile,这一特性将 PyTorch 的性能推向了新的高度,并将 PyTorch 的部分内容从 C++ 移回 Python。torch.compile 是一个完全附加的(可选的)特性,因此 PyTorch 2.0 是 100% 向后兼容的。

支撑 torch.compile 的技术包括研发团队新推出的 TorchDynamo、AOTAutograd、PrimTorch 和 TorchInductor。

TorchDynamo:使用 Python Frame Evaluation Hooks 安全地捕获 PyTorch 程序,这项重大创新是 PyTorch 过去 5 年来在安全图结构捕获方面的研发成果汇总;

AOTAutograd:重载 PyTorch 的 autograd 引擎,作为一个跟踪 autodiff,用于生成 ahead-of-time 向后跟踪;

PrimTorch:将约 2000 多个 PyTorch 算子归纳为一组约 250 个原始算子的闭集,开发人员可以将其作为构建完整 PyTorch 后端的目标。这大大降低了编写 PyTorch 功能或后端的流程;

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

TorchDynamo、AOTAutograd、PrimTorch 和 TorchInductor 是用 Python 编写的,并支持 dynamic shapes(无需重新编译就能发送不同大小的向量),这使得它们具备灵活、易于破解的特性,降低了开发人员和供应商的使用门槛。

为了验证这些技术,研发团队在机器学习领域测试了 163 个开源模型,包括图像分类、目标检测、图像生成等、NLP 任务,如语言建模、问答、序列分类、推荐系统和强化学习任务,测试模型主要有 3 个来源:

46 个来自 HuggingFace Transformers 的模型;

来自 TIMM 的 61 个模型:由 Ross Wightman 收集的SOTA PyTorch 图像模型;

来自 TorchBench 的 56 个模型:包含来自 Github 上收集的一组流行代码库。

对于开源模型,PyTorch 官方没有进行修改,只是增加了一个 torch.compile 调用来进行封装

接下来 PyTorch 工程师在这些模型中测量速度并验证精度,由于加速可能取决于数据类型,因此研究团队选择测量 Float32 和自动混合精度 (AMP) 的加速。

在 163 个开源模型中,该团队发现使用 2.0 可以将训练速度提高 38-76%。torch.compile 在 93% 的情况下都有效,模型在 NVIDIA A100 GPU 上的训练速度提高了 43%。在 Float32 精度下,它的平均运行速度提高了 21%,而在 AMP 精度下,它的运行速度平均提高了 51%。

目前,torch.compile 还处于早期开发阶段,预计 2023 年 3 月上旬将发布第一个稳定的 2.0 版本。在官方博客中,PyTorch 团队还公布了他们对于整个 2.0 系列的展望:

开发背景

PyTorch 的开发理念自始至终都是灵活性和 hackability 第一,性能则是第二,致力于:

1. 高性能的 eager execution

2. 不断 Python 化内部结构

3. 分布式、自动比较、数据加载、加速器等的良好抽象

PyTorch 自 2017 年面世以来,硬件加速器(如 GPU)的计算速度提高了约 15倍,内存访问速度提高了约 2 倍。

为了保持高性能的 eager execution,PyTorch 内部的大部分内容不得不转移到 C++ 中,这使得 PyTorch hackability 下降,也增加了开发者参与代码贡献的门槛。

从第一天起,PyTorch 官方就意识到了 eager execution 的性能局限。2017 年 7 月,官方开始致力于为 PyTorch 开发一个编译器。该编译器需要在不牺牲 PyTorch 体验的前提下,加速 PyTorch 程序的运行,其关键标准是保持某种程度上的灵活性 (flexibility):支持开发者广泛使用的 dynamic shapes 以及 dynamic programs。

开发者 Sylvain Gugger 表示:“只需添加一行代码,PyTorch 2.0 就能在训练 Transformers 模型时实现 1.5 倍到 2.0 倍的速度提升。这是自混合精度训练问世以来最令人兴奋的事情!”

技术概述

多年来,研究者们在 PyTorch 中建立过好几个编译器项目,这些编译器可以分为 3 类:

图结构的获取图结构的降低图结构的编译

其中,在构建 PyTorch 编译器时,图结构的获取是更难的挑战。

过去 5 年中,官方尝试了 torch.jit.trace、TorchScript、FX tracing 以及 Lazy Tensors,但它们有些够灵活但不够快,有些够快但不灵活,有些既不快也不灵活,有些用户体验不好。

虽然 TorchScript 很有前途,但它需要大量修改代码和依赖,可行性并不高。

PyTorch 编译流程示意图

TorchDynamo:可靠快速地获取图结构

TorchDynamo 使用了 PEP-0523 中引入的CPython 功能,称为框架评估 API (Frame Evaluation API)。为此,官方采取了一种数据驱动的方法来验证其在 Graph Capture 上的有效性,使用 7000 多个用 PyTorch 编写的 Github 项目作为验证集。

结果显示,TorchDynamo 在 99% 的时间里都能正确、安全地获取图结构,而且开销可以忽略不计,因为它无需对原始代码做任何修改。

TorchInductor:用 define-by-run IR 进行更迅速的 codegen

对于 PyTorch 2.0 的新编译器后端,团队从用户如何编写高性能的自定义内核中得到了灵感:越来越多地使用 Triton 语言。

此外,对于 PyTorch 2.0 全新的编译器后端,官方还希望能够使用与 PyTorch eager 类似的抽象,并且具有足够的通用性能支持 PyTorch 中广泛的功能。

TorchInductor 使用 Pythonic define-by-run loop level IR,自动将 PyTorch 模型映射到 GPU 上生成的 Triton 代码以及 CPU 上的 C++/OpenMP。

TorchInductor 的 core loop level IR 只包含大约 50 个算子,而且是用 Python 实现的,这使得它具有很强的 hackability 和扩展性。

AOTAutograd:对于 ahead-of-time graph,重用 Autograd

PyTorch 2.0 要想加速训练,不仅要捕获用户级代码,而且要捕获反向传播算法 (backpropagation)。

AOTAutograd 利用 PyTorch torch_dispatch 扩展机制来追踪 Autograd 引擎,使开发者得以提前捕获反向传播 (backwards pas),从而使开发者得以使用 TorchInductor 加速前向和后向通道。

PrimTorch:稳定的 Primitive operator

PyTorch 有 1200多个运算符,如果考虑到每个运算符的各种重载,数量高达 2000+。

2000+ PyTorch 算子的分类概况

因此,编写后端或交叉功能 (cross-cutting feature) 成为一项耗费精力的工作。PrimTorch 致力于定义更小更稳定的运算符集。PyTorch 程序可以持续降级到这些运算符集。

官方的目标是定义两个运算符集:

Prim ops 包含约 250 个相对底层的运算符,因为足够底层,所以这些运算符更适用于编译器,开发者需要将这些算子进行融合,才能获得良好的性能。

ATen ops 包含约 750 个典型运算符 (canonical operator),适合于直接输出。这些运算符适用于已经在 ATen 级别上集成的后端,或者没有经过编译的后端,才能从底层运算符集(如 Prim ops) 恢复性能。

动态形状

在研究支持 PyTorch 代码通用性的必要条件时,一个关键要求是支持动态形状,并允许模型接受不同大小的张量,而不会在每次形状变化时引起重新编译。目前为止,对动态形状的支持有限,并且正在进行中。它将在稳定版本中具有完整的功能。在不支持动态形状的情况下,常见的解决方法是将其填充到最接近的 2 次方。然而,正如我们从下面的图表中所看到的,它产生了大量的性能开销,同时也带来了明显更长的编译时间。现在,有了对动态形状的支持,PyTorch 2.0 也就获得了比 Eager 高出了最多 40% 的性能。

简而言之,就是 PyTorch 2.0 stable 版本预计明年 3 月发布,PyTorch 2.0 在保留原有优势的同时,大力支持编译,torch.compile 为可选功能,只需一行代码即可运行编译,还有 4 项重要技术:TorchDynamo、AOTAutograd、PrimTorch 以及 TorchInductor,PyTorch 1.x 代码无需向 2.0 迁移,更多用户体验以及Q&A,大家可以查看下方链接中原文呦~

参考链接:

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

☞☞
","force_purephv":"0","gnid":"9fc42865018ab4897","img_data":[{"flag":2,"img":[{"desc":"","height":"80","s_url":"https://p0.ssl.img.360kuai.com/t0186957a1ca5352752_1.gif","title":"","url":"https://p0.ssl.img.360kuai.com/t0186957a1ca5352752.gif","width":"640"},{"desc":"","height":"425","title":"","url":"https://p0.ssl.img.360kuai.com/t0135d81125a697948b.jpg","width":"888"},{"desc":"","height":"536","title":"","url":"https://p0.ssl.img.360kuai.com/t010b8e0d77acd497b4.jpg","width":"936"},{"desc":"","height":"437","s_url":"https://p0.ssl.img.360kuai.com/t01849b97dd2fb69bcc_1.gif","title":"","url":"https://p0.ssl.img.360kuai.com/t01849b97dd2fb69bcc.gif","width":"652"},{"desc":"","height":"474","title":"","url":"https://p0.ssl.img.360kuai.com/t0107ba544991128d22.jpg","width":"936"},{"desc":"","height":"862","title":"","url":"https://p0.ssl.img.360kuai.com/t01ee21da6450e51986.jpg","width":"690"},{"desc":"","height":"532","title":"","url":"https://p0.ssl.img.360kuai.com/t0191bbf16972fd898c.jpg","width":"784"},{"desc":"","height":"80","s_url":"https://p0.ssl.img.360kuai.com/t01404514a879746b60_1.gif","title":"","url":"https://p0.ssl.img.360kuai.com/t01404514a879746b60.gif","width":"960"}]}],"original":0,"pat":"art_src_1,fts0,sts0","powerby":"hbase","pub_time":1670227453000,"pure":"","rawurl":"http://zm.news.so.com/d6d9035692ac3033f4e905ffe1525103","redirect":0,"rptid":"29c9ca27b7a43d64","s":"t","src":"CSDN","tag":[{"clk":"ktechnology_1:gpu","k":"gpu","u":""}],"title":"PyTorch 2.0 发布,一行代码将训练提速 76%!

余健疤1293怎么将pychar项目导入到githup已有的库里面 -
羊清轮15399492898 ______ 1. 目标:把本地已经存在的项目,推送到github服务端,实现共享.2. 实现步骤:(1). 先从github创建一个空的仓库(2). 初始化本地仓库,并提交内容到本地(3). 连接到远程仓库,并将代码同步到远程仓库(4). 继续修改本地代码,然后提交并推送到github出处:CnPeng(专业人士)

余健疤1293如何把c的文件打包上传到pypi,让用户通过pip安装的时候编译c的代码 -
羊清轮15399492898 ______ 使用distutils.core中的Extension函数即可.具体方法为,在setup.py中,添加如下代码:my_c_exten = Extension('期望编译后的库名', sources=['c库文件的相对路径']) setup(...ext_modules=[my_c_exten],) 这样,在打包时,指定的c库文件也会被上传上去,在用户执行install时,就会在安装目录中(例如是lib/python2.7/site-packages/)中生成把这个c文件进行编译.这样就可以python代码中调用该库了.

余健疤1293如何调用另一个python文件中的代码 -
羊清轮15399492898 ______ 一个python文件就相当于是一个包一样,跟导入自带的库一样的导入使用,就像导入import os一样

余健疤1293如何在Eclipse中导入已有的jar文件? -
羊清轮15399492898 ______ 如图,首先右键点击项目,选择最下面的properties,中文版应该是属性这样的,然后进去之后点击java build path,右边会出来4个选项卡,选择libraries,这时候最右边会有多个选项,第一个add jars是添加项目文件中的jar包,即已经在你的...

余健疤1293python引入torch时报错是什么原因 -
羊清轮15399492898 ______ python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模 块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用 如果你要使用的模块(py文件)和当前模块在同一目录,只要import相应的文件名就好!

余健疤1293pytorch怎么安装 -
羊清轮15399492898 ______ 下载pip到/usr/local/src # cd /usr/local/src # wget " " --no-check-certificate 如果提示:-bash: wget: command not found 那么安抄装wget,执行zhidao如下: # yum -y install wget 解夺安装pip # tar -xzvf pip-1.5.4.tar.gz # cd pip-1.5.4 # python setup.py install

余健疤1293Python语言中怎么导入类库 -
羊清轮15399492898 ______ 用法1:import math 用法2:使用的别名,使代码简洁 import math as m

余健疤1293求现成C#连接数据库代码 -
羊清轮15399492898 ______ 如果你不用App.config(Web.config)配置的话,可以直接在程序中加入以下连接:string ConStr= "server=.;database=数据库;user id=sa;password=密码"; SqlConnection conn = new SqlConnection(ConStr); conn.Open(); 就可以打开数...

余健疤1293如何导入python模块 -
羊清轮15399492898 ______ 1. python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题.模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象,则要导入这个模块才可以使用,除了...

余健疤1293如何在Visual Studio Code中安装Python库 -
羊清轮15399492898 ______ 首先最重要的一点,你得安装并且配置好Python运行环境,那么如何检查是否正确配置好运行环境呢,按Windows+R组合键在运行窗口输入cmd并在命令提示符窗口输入Python确定即可,如下动图所示: 正确安装Python环境后,接下来打开...

(编辑:自媒体)
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图 @ 白云都 2024