前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一睹为快!PyTorch1.11 亮点一览

一睹为快!PyTorch1.11 亮点一览

作者头像
OpenMMLab 官方账号
发布于 2022-04-09 08:51:07
发布于 2022-04-09 08:51:07
60800
代码可运行
举报
文章被收录于专栏:OpenMMLabOpenMMLab
运行总次数:0
代码可运行

文章翻译自 PyTorch 官方 Blog 并添加少量修改

MMCV 自 v1.4.7 开始提供 PyTorch1.11 预编译包啦

PyTorch 官方 Blog 链接:

https://pytorch.org/blog/pytorch-1.11-released/

MMCV v1.4.7 链接:

https://github.com/open-mmlab/mmcv/releases/tag/v1.4.7

前言

近日,PyTorch 推出 PyTorch 1.11,本次亮点可总结为如下 :

· TorchData:一个新的用于通用模块化数据加载的库,可以轻松构建灵活、高性能的数据 pipeline

· functorch:一个类 JAX 的向 PyTorch 添加可组合函数转换的库

· DDP 静态图优化正式可用

TorchData 网址:

https://github.com/pytorch/data

functorch 网址:

https://github.com/pytorch/functorch

TorchData

TorchData 是一个通用模块化数据加载库,用于轻松构建灵活且高性能的数据 pipeline。根据社区反馈,PyTorch 发现现有的 DataLoader 将太多的功能耦合在一起,难以扩展;此外,不同的用例通常必须重写相同的数据加载程序,造成代码冗余。为了解决这些问题,PyTorch 设计了 TorchData,其目标是通过 Iterable-style 和 Map-style 的 DataPipe 来实现可组合的数据加载。DataPipe 用来替代之前版本的 Dataset,并内置了大量数据相关操作,如打开文件、解析文本、转换样本、缓存、混洗和批处理等。

DataPipe 接受 Python 的一些访问函数,例如 __iter__ 和 __getitem__,前者用于 IterDataPipe,后者用于 MapDataPipe,它们会返回一个新的访问函数。您可以将多个 DataPipe 连在一起,形成数据 pipeline,以执行必要的数据转换工作。PyTorch 目前提供了 50+ DataPipe。

在 PyTorch1.11 中,一些 PyTorch 库已经将数据集迁移到 DataPipe。在 TorchText 中提供的数据集是使用 DataPipe 实现的,其 SST-2 二进制文本分类教程的一部分演示了如何使用 DataPipe 预处理数据。在 TorchVision 和 TorchRec 中还有其他数据集的原型实现,您可以参考官方示例。

TorchData 文档 已经上线,它包含一个教程,教程介绍了如何使用 DataPipe、将它们与 DataLoader 一起使用以及如何实现自定义 Datapipe。

SST-2 二进制文本分类教程网址:

https://pytorch.org/text/0.12.0/tutorials/sst2_classification_non_distributed.html#dataset

官方示例网址:

https://pytorch.org/data/0.3.0/examples.html

TorchData 文档网址:

https://pytorch.org/data/beta/index.html

下面我们举一个例子来了解一下 DataPipe:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from torchdata.datapipes.iter import IterDataPipe
import torchdata.datapipes as dp

@functional_datapipe("map")
class MapperIterDataPipe(IterDataPipe):
    def __init__(self, source_dp: IterDataPipe, fn) -> None:
        super().__init__()
        self.dp = source_dp
        self.fn = fn

    def __iter__(self):
        for d in self.dp:
            yield self.fn(d)

# Using functional form (recommended)
datapipes1 = dp.iter.FileOpener(['a.file', 'b.file']).map(fn=decoder).

这个 MapperIterDataPipe 看起来有点像 Iterable-style dataset,因为它也实现了 __iter__ 方法,但它并不是描述数据本身,而是描述对数据的变换。可以看到,在 __init__ 里,它接收两个参数,一个是源 DataPipe,一个是对数据进行转换的函数,然后在 __iter__ 里,它对 DataPipe 的每一个元素依次做转换,并用 yield 返回,这种 lazy 模式使得整体的 DataPipe 是内存友好的。另外,MapperIterDataPipe 可以通过一个装饰器 functional_datapipe 注册为函数(map),这样就可以通过 DataPipe.map(...) 的形式使用该 DataPipe。

functorch

PyTorch 官方宣布推出 functorch 的首个 beta 版本,该库受到 Google JAX 的极大启发。functorch 是一个向 PyTorch 添加可组合函数转换的库,旨在提供可组合的 vmap(向量化)和 autodiff 转换,可与 PyTorch 模块和 PyTorch autograd 一起使用,并具有良好的动态模式(eager-mode)性能。

可组合的函数转换可以帮助解决当前在 PyTorch 中难以实现的许多用例:

· 计算每个样本的梯度

· 单机运行多个模型的集成

· 在元学习(MAML)内循环中高效地批处理任务

· 高效地计算雅可比矩阵(Jacobians)和海森矩阵(Hessians)

vmap(向量化)、vjp(反向模式 autodiff)和 jvp(前向模式 autodiff)转换的组合使得用户毫不费劲地表达上述内容,无需为每个转换设计单独的库。

例如计算雅各比矩阵:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import torch.nn as nn
import torch.nn.functional as F
from functools import partial
from functorch import vmap, vjp

D = 16
weight = torch.randn(D, D)
bias = torch.randn(D)
x = torch.randn(D)
unit_vectors = torch.eye(D)

def predict(weight, bias, x):
    return F.linear(x, weight, bias).tanh()

# PyTorch 方式
def compute_jac(xp):
    jacobian_rows = [torch.autograd.grad(predict(weight, bias, xp), xp, vec)[0]
                     for vec in unit_vectors]
    return torch.stack(jacobian_rows)

jacobian = compute_jac(x)

# functorch 方式
_, vjp_fn = vjp(partial(predict, weight, bias), x)
ft_jacobian, = vmap(vjp_fn)(unit_vectors)

可以看到 functorch 方式用 vmap 替代了 for 循环,而 vmap 是经过优化的并行计算,因而可以极大地提高运行速度,同时 functorch 没有使用 autograd.grad 而是使用了 vjp,这是因为 vmap 不能直接用于 autograd.grad。另外,在 output size 大于 input size 时,还可以使用 jvp 替代 vjp 以进一步提高效率。

DDP 静态图

DDP 静态图假设用户的模型在每次迭代中都使用相同的一组已使用或未使用的参数,因此它对一些相关状态的了解是确定的,例如哪些 hook 将被触发、触发的次数以及第一次迭代后的梯度计算就绪顺序。

静态图在第一次迭代中缓存这些状态,因此它可以支持 DDP 在以往版本中无法支持的功能,例如无论是否有未使用的参数,在相同参数上支持多个激活检查点。当存在未使用的参数时,静态图功能也会应用性能优化,例如避免遍历图在每次迭代中搜索未使用的参数,并启用动态分桶(bucketing)顺序。DDP 静态图中的这些优化为一些推荐模型带来了 10% 的 QPS 增益。

要启用静态图,只需在 DDP 中设置 static_graph=True,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ddp_model = DistributedDataParallel(model, static_graph=True)

MMCV 支持

MMCV 自 v1.4.7 开始提供 PyTorch1.11 预编译包,安装命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu115/torch1.11/index.html
pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.11/index.html
# 下面这条命令只在 Linux 平台有效,因为 torch 1.11.0 没有提供 cuda 10.2 在 Windows 平台 的预编译包,所以 mmcv 也没有提供
pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu102/torch1.11/index.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenMMLab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
面试官:View.post() 为什么能够获取到 View 的宽高?
说一些题外话,Android 面试进阶指南 其实是我在小专栏维护的一个付费专栏,且已经有部分付费用户。本文是第九篇文章了,为了维护付费用户的权益,没有办法把所有文章都同步到公众号。如果你对这个专栏感兴趣,不妨点击文末 阅读原文 了解专栏详情。
路遥TM
2021/08/31
1.4K0
从 Android 开发到读懂源码 第03期:View.post 源码解析
这个方法在日常开发中是经常用到的,例如在子线程中我们需要更新 UI,可以通过 post 一个 runnable ,在 run 方法中去绘制 UI ,或者我们需要在 Activity 的 onCreate 中获取一个 View 的宽高时,也会通过 post 一个 runnable 并在 run 方法中获取这个 View 的 width 和 height 信息。本文基于 Android 9.0 的源码进行分析。
数据库交流
2022/04/25
3140
从 Android 开发到读懂源码 第03期:View.post 源码解析
View的postDelayed方法深度思考
突然某天好友老瑞问我 “View的postdelay方法,延迟时间如果设置10分钟或者更长的时间有什么问题吗?“ 。当时听到这个问题时候我只能联想到 Handle.postDelay ,与此同时让我回想起了之前的一些疑问?
静默加载
2020/05/29
2.2K0
【Andorid源码解析】View.post() 到底干了啥
emmm,大伙都知道,子线程是不能进行 UI 操作的,或者很多场景下,一些操作需要延迟执行,这些都可以通过 Handler 来解决。但说实话,实在是太懒了,总感觉写 Handler 太麻烦了,一不小心又很容易写出内存泄漏的代码来,所以为了偷懒,我就经常用 View.post() or View.postDelay() 来代替 Handler 使用。
请叫我大苏
2018/05/17
1.4K0
Carson带你学Android:为什么view.post()能保证获取到view的宽高?
为什么view.post()能保证获取到view的宽高?本文将手把手带你深入源码了解view.post() 原理。
Carson.Ho
2021/12/06
4320
Carson带你学Android:为什么view.post()能保证获取到view的宽高?
看完这篇,别再说你不了解 Handler 消息机制了
原文链接 https://juejin.cn/post/7291935623476183067
GeeJoe
2023/10/24
7740
看完这篇,别再说你不了解 Handler 消息机制了
Android Handler与Looper原理浅析
本文分析下Android的消息处理机制,主要是针对Handler、Looper、MessageQueue组成的异步消息处理模型,先主观想一下这个模型需要的材料:
看书的小蜗牛
2018/06/29
1.2K0
Android Handler与Looper原理浅析
Android | View.post 到底是在什么时候执行的?
相信绝大部分人都使用过 view.post这个方法,且使用场景基本上都是用来获取 view 的一些属性数据,并且我们也都知道,该方法会使用 handler 发送一个消息,并且该消息被回调执行的时候 view 是已经绘制完成的,今天我们来聊一聊它内部的一些细节。
345
2023/05/02
6180
深入Handler、Looper、MessageQueue
Handler、Looper、MessageQueue基本了解可以看下这篇文章 Android源码解读-Handler、Loop、MessageQueue
笔头
2022/01/24
3810
又一年对Android消息机制(Handler&Looper)的思考
Android消息机制对于每一个Android开发者来说都不陌生,在日常的开发中我们不可避免的要经常涉及这部分的内容。从开发角度来说,Handler是Android消息机制的上层接口,这使得在开发过程中只需要和Handler交互即可。Handler的使用过程很简单,通过它可以轻松的将一个任务切换Handler所在的线程中去执行。很多人认为Handler的作用是更新UI,这的确没错,但是更新UI仅仅是Handler的一个特殊的使用场景。具体来说是这样的;有时候需要再子线程中进行耗时的I/O操作,可能是读取文件或访问网络等。。。。。
静默加载
2020/05/31
1.1K2
View的onAttachedToWindow引发的图片轮播问题探究
本篇文章是在View的postDelayed方法深度思考这篇文章的所有的基础理论上进行研究的,可以说是对于View的postDelayed方法深度思考这篇文章知识点的实践。
静默加载
2023/01/14
5910
View的onAttachedToWindow引发的图片轮播问题探究
面试必考体系庞大的Handler你真的都了解吗?Handler二十七问带你打破砂锅问到底!
既然它如此重要,不知对面的你了解它多深呢?今天就和大家一起打破砂锅问到底,看看Handler这口砂锅的底到底在哪里。
Android技术干货分享
2021/03/24
5710
面试必考体系庞大的Handler你真的都了解吗?Handler二十七问带你打破砂锅问到底!
「细品源码」 Android 系统的血液:Handler
作为 Android 开发者,相信对于 Handler 的使用早已烂熟于心。Handler 对于 Android 非常重要,可以说,没有它,Android App 就是一堆“破铜烂铁”,它就像 Android 的血液,穿梭在 App 的各个角落,输送养分。
开发的猫
2020/06/19
1K0
「细品源码」 Android 系统的血液:Handler
面试问关于Handler的这些问题你知道吗?
Q :在线程中可以直接调用 Handler 无参的构造方法吗?在主线程和子线程中有没有区别? A:在主线程中可以;在子线程中会抛出RuntimeException, 需要先调用 Looper.prepare()。主线程在启动的时候已经在调用过Looper.prepare()。
103style
2022/12/19
2930
View三问—斗鱼真题
Android作为一种前端语言,view肯定是占据着很重要的位置,熟用view也是我们必须具备的能力,今天就来看看view相关的那些问题:
码上积木
2020/10/29
6040
从 Android 开发到读懂源码 第07期:Message 机制源码解析
核心类就是 ThreadLocal ,它提供线程局部变量,每个线程都有自己独立的一份变量,通常是类中的 private static 字段,它们希望将状态与某一个线程相关联,在多线程编程中常用,比如 Android 的绘制同步机制 Choreographer 中也有使用。
数据库交流
2022/04/25
3910
从 Android 开发到读懂源码 第07期:Message 机制源码解析
Android点将台:烽火狼烟[-Handler-]
张风捷特烈
2024/02/11
1810
Android点将台:烽火狼烟[-Handler-]
Android 一起来看看面试必问的消息机制
Android 消息机制的主要是指的是 Handler 的运行机制以及 Handler 所附带的 MessageQueue 和 Looper 的工作过程,这三者实际上是一个整体,只不过我们在开发过程中比较多地接触 Handler 而已。
developerHaoz
2018/08/20
3430
Android View post 方法
说起post方法,我们很容易联想到Handler的post方法,都是接收一个Runnable对象。那么这两个方法有啥不同呢?
玖柒的小窝
2021/09/20
5030
Android View post 方法
java中的onresume_android onCreate onResume中获取 View 宽高为0分析
xmlns:tools=”http://schemas.android.com/tools”
全栈程序员站长
2022/09/05
4180
推荐阅读
相关推荐
面试官:View.post() 为什么能够获取到 View 的宽高?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档