当前位置: 首页>资讯 >

使用PyTorch 2.0 加速Hugging Face和TIMM库的模型_全球关注

来源: | 时间: 2022-12-30 02:33:44 |

点蓝色字关注“机器学习算法工程师”


(相关资料图)

设为星标,干货直达!

PyTorch 2.0引入了**torch.compile()**来加速模型,这篇文章我们将介绍如何使用**torch.compile()**来加速Hugging Face和TIMM库的模型。

torch.compile() 使得尝试不同的编译器后端变得容易,从而使用单行装饰器 torch.compile() 使 PyTorch 代码更快。它可以直接在 nn.Module 上工作,作为 torch.jit.script() 的直接替代品,但不需要您进行任何源代码更改。我们希望这一行代码更改能够为您已经运行的绝大多数模型提供 30%-2 倍的训练时间加速。

opt_module=torch.compile(module)

torch.compile 支持任意 PyTorch 代码、控制流、变异,并带有对动态形状的实验性支持。我们对这一发展感到非常兴奋,我们将其称为 PyTorch 2.0。

这个版本对我们来说不同的是,我们已经对一些最流行的开源 PyTorch 模型进行了基准测试,并获得了 30% 到 2 倍的大幅加速(见https://github.com/pytorch/torchdynamo/issues/681) 。

这里没有技巧,我们已经 pip 安装了流行的库,比如https://github.com/huggingface/transformers, https://github.com/huggingface/accelerate 和 https://github.com/rwightman/pytorch-image-models等流行的库,然后对它们运行 torch.compile() 就可以了。

很难同时获得性能和便利性,但这就是核心团队发现 PyTorch 2.0 如此令人兴奋的原因。Hugging Face 团队也很兴奋,用他们的话说:

TIMM 的主要维护者 Ross Wightman:“PT 2.0 开箱即用,适用于推理和训练工作负载的大多数 timm 模型,无需更改代码。”

Sylvain Gugger 是 transformers 和 accelerate 的主要维护者:“只需添加一行代码,PyTorch 2.0 就可以在训练 Transformers 模型时提供 1.5 到 2.x 的加速。这是引入混合精度训练以来最激动人心的事情!”

本教程将向您展示如何使用这些加速,这样您就可以像我们一样对 PyTorch 2.0 感到兴奋。

安装教程

对于 GPU(新一代 GPU 的性能会大大提高):

pip3installnumpy--pretorch--force-reinstall--extra-index-urlhttps://download.pytorch.org/whl/nightly/cu117

对于CPU:

pip3install--pretorch--extra-index-urlhttps://download.pytorch.org/whl/nightly/cpu

当安装好后,你可以通过以下方式来进行验证:

gitclonehttps://github.com/pytorch/pytorchcdtools/dynamopythonverify_dynamo.py

另外一种安装方式是采用docker,我们还在 PyTorch nightly 二进制文件中提供了所有必需的依赖项,您可以使用它们下载:

dockerpullghcr.io/pytorch/pytorch-nightly

对于临时实验,只需确保您的容器可以访问所有 GPU:

dockerrun--gpusall-itghcr.io/pytorch/pytorch-nightly:latest/bin/bash

使用教程

让我们从一个简单的例子开始,一步步把事情复杂化。请注意,您的 GPU 越新,您可能会看到更显着的加速。

importtorchdeffn(x,y):a=torch.sin(x).cuda()b=torch.sin(y).cuda()returna+bnew_fn=torch.compile(fn,backend="inductor")input_tensor=torch.randn(10000).to(device="cuda:0")a=new_fn()

这个例子实际上不会运行得更快,但它具有教育意义。

以 torch.cos() 和 torch.sin() 为特色的示例,它们是逐点操作的示例,因为它们在向量上逐个元素地进行操作。你可能真正想要使用的一个更著名的逐点运算是类似 torch.relu() 的东西。eager模式下的逐点操作不是最优的,因为每个操作都需要从内存中读取一个张量,进行一些更改,然后写回这些更改。

PyTorch 2.0 为您所做的最重要的优化是融合。

回到我们的示例,我们可以将 2 次读取和 2 次写入变成 1 次读取和 1 次写入,这对于较新的 GPU 来说尤其重要,因为瓶颈是内存带宽(您可以多快地向 GPU 发送数据)而不是计算(您的速度有多快) GPU 可以处理浮点运算)。

PyTorch 2.0 为您做的第二个最重要的优化是 CUDA graphs。CUDA graphs有助于消除从 python 程序启动单个内核的开销。

torch.compile() 支持许多不同的后端,但我们特别兴奋的一个是生成 Triton 内核(https://github.com/openai/triton,用 Python 编写的,但性能优于绝大多数手写的 CUDA 内核)的 Inductor。假设我们上面的示例名为 trig.py,我们实际上可以通过运行来检查代码生成的 triton 内核:

TORCHINDUCTOR_TRACE=1pythontrig.py

@pointwise(size_hints=[16384],filename=__file__,meta={"signature":{0:"*fp32",1:"*fp32",2:"i32"},"device":0,"constants":{},"configs":[instance_descriptor(divisible_by_16=(0,1,2),equal_to_1=())]})@triton.jitdefkernel(in_ptr0,out_ptr0,xnumel,XBLOCK:tl.constexpr):xnumel=10000xoffset=tl.program_id(0)*XBLOCKxindex=xoffset+tl.reshape(tl.arange(0,XBLOCK),[XBLOCK])xmask=xindex

你可以验证融合这两个 sins 确实发生了,因为这两个 sin 操作发生在一个单一的 Triton 内核中,并且临时变量保存在寄存器中,可以非常快速地访问。

下一步,让我们尝试一个真实的模型,比如来自 PyTorch hub 的 resnet50。

importtorchmodel=torch.hub.load("pytorch/vision:v0.10.0","resnet18",pretrained=True)opt_model=torch.compile(model,backend="inductor")model(torch.randn(1,3,64,64))

如果您实际运行,您可能会惊讶于第一次运行很慢,那是因为正在编译模型。后续运行会更快,因此在开始对模型进行基准测试之前预热模型是常见的做法。

您可能已经注意到我们如何在此处使用“inductor”显式传递编译器的名称,但它不是唯一可用的后端,您可以在 torch._dynamo.list_backends() 中运行以查看可用后端的完整列表。为了好玩,您应该尝试 aot_cudagraphs 或 nvfuser。

现在让我们做一些更有趣的事情,我们的社区经常使用来自 transformers (https://github.com/huggingface/transformers) 或 TIMM (https://github.com/rwightman/pytorch-image-models)的预训练模型和我们的设计之一PyTorch 2.0 的目标是任何新的编译器堆栈都需要开箱即用,可以与人们实际运行的绝大多数模型一起工作。因此,我们将直接从 Hugging Face hub 下载预训练模型并对其进行优化。

importtorchfromtransformersimportBertTokenizer,BertModel#Copypastedfromherehttps://huggingface.co/bert-base-uncasedtokenizer=BertTokenizer.from_pretrained("bert-base-uncased")model=BertModel.from_pretrained("bert-base-uncased").to(device="cuda:0")model=torch.compile(model)#Thisistheonlylineofcodethatwechangedtext="Replacemebyanytextyou"dlike."encoded_input=tokenizer(text,return_tensors="pt").to(device="cuda:0")output=model(**encoded_input)

如果您从模型和 encoded_input 中删除 to(device="cuda:0") ,那么 PyTorch 2.0 将生成 C++ 内核,这些内核将针对在您的 CPU 上运行进行优化。你可以检查 Triton 或 C++ 内核的 BERT,它们显然比我们上面的三角函数示例更复杂,但如果你了解 PyTorch,你也可以类似地浏览它并理解。

相同的代码也可以https://github.com/huggingface/accelerate 和 DDP 一起使用。

同样让我们尝试一个 TIMM 示例:

importtimmimporttorchmodel=timm.create_model("resnext101_32x8d",pretrained=True,num_classes=2)opt_model=torch.compile(model,backend="inductor")opt_model(torch.randn(64,3,7,7))

我们使用 PyTorch 的目标是构建一个广度优先的编译器,该编译器将加速人们在开源中运行的绝大多数实际模型。Hugging Face Hub 最终成为我们非常有价值的基准测试工具,确保我们所做的任何优化实际上都有助于加速人们想要运行的模型。

本文翻译自https://pytorch.org/blog/Accelerating-Hugging-Face-and-TIMM-models/

关键词: 绝大多数 基准测试 的目标是

 

热文推荐

使用PyTorch 2.0 加速Hugging Face和TIMM库的模型_全球关注

点蓝色字关注“机器学习算法工程师”设为星标,干货直达!​PyTorch2 0引入了**torch compile()**来加速模型,这篇文章我们将介绍如何使用

2022-12-30

长春高新: 关于回购注销部分限制性股票减少注册资本暨通知债权人的公告

长春高新:关于回购注销部分限制性股票减少注册资本暨通知债权人的公告

2022-12-29

港股异动 | 赣锋锂业(01772)尾盘跌超3% 年末国内碳酸锂价格跌势明显加快:当前消息

智通财经APP获悉,赣锋锂业尾盘跌超3%,截至发稿,跌3 07%,报58 35港元,成交额1 2亿港元。消息面上,上海钢联发布的数据显示,12月28日电池

2022-12-29

每日讯息!九典制药(300705)12月29日主力资金净买入412.80万元

截至2022年12月29日收盘,九典制药(300705)报收于23 6元,上涨3 6%,换手率1 9%,成交量4 05万手,成交额9407 77万元。12月29

2022-12-29

微粒贷借款逾期1天多久会上征信系统_天天快看

网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天后上报给征信机构,因为有些借贷机构可

2022-12-29

宇邦新材(301266)12月28日主力资金净卖出361.47万元-微资讯

截至2022年12月28日收盘,宇邦新材(301266)报收于76 59元,上涨4 95%,换手率6 63%,成交量1 72万手,成交额1 29亿元。12月28

2022-12-29

今日报丨让“软塑”重获“新生”

■本报记者李晨阳用完的洗衣液外包装、吃完的零食包装算什么垃圾?如果把它们收集起来重新高值利用,你愿不愿意加入其中?由绿色再生塑料供应

2022-12-29

鲁阳节能(002088.SZ):拟1.75亿元剥离岩棉业务资产

格隆汇12月28日丨鲁阳节能(002088)(002088 SZ)公布,基于公司战略规划,拟逐步退出玄武岩纤维产品(简称“岩棉”或“玄武岩”)的生产和经营,将母

2022-12-28

发布在即,小米 POCO C50 预计将于 1 月 3 日在印度发布_今日关注

IT之家12月28日消息,据91mobiles报道,业内人士透露,POCOC50将于1月3日登陆印度市场。这将是继2021年9月的POCOC31和2020年10月…

2022-12-28

57岁刘嘉玲在家过圣诞节,晒豪宅曝光奢华内景,有如欧式宫殿|今日热议

12月26日晚,刘嘉玲分享了自己在豪宅里拍摄的照片,豪宅布置的圣诞氛围很浓郁,网友都留言直呼这豪宅太艳丽了!57岁的刘嘉玲一身伦敦风穿扮显

2022-12-28

2022重庆欢乐谷营业时间(日场+夜场)

图源:乐多2022重庆欢乐谷营业时间营业时间(即日起至2023年1月21日)周一至周四(不含元旦节)为10:00-19:00,周五至周日为10:00-22:00

2022-12-28

中山兔年纪念币预约额度工商银行查询入口 全球简讯

中山兔年纪念币工商银行预约额度查询入口工商银行预约额度查询入口:https: jnb icbc com cn ICBCCOINWEBPC amountQu

2022-12-27

世界快讯:驻马店市行政服务中心荣获2022年全国政务服务标准引领典范

驻马店市行政服务中心荣获2022年全国政务服务标准引领典范

2022-12-27

天天观点:彭斯发言人否认提交2024年大选参选资料

当地时间12月26日,美国前副总统彭斯的发言人奥马利(DevinO’Malley)在社交网站发文,称“麦克·彭斯今天没有提交参选总统资料。”奥马利随

2022-12-27

长城证券(002939.SZ):完成公开发行20亿元公司债券

格隆汇12月26日丨长城证券(002939)(002939 SZ)公布,公司2022年面向专业投资者公开发行公司债券(第三期)的发行时间为2022年12月22日

2022-12-26

外媒:乌军无人机袭击俄境内机场 三人丧生:天天新视野

参考消息网12月26日报道据塔斯社12月26日报道,俄罗斯国防部26日通报说,俄空天军的防空系统阻止了乌克兰无人机对萨拉托夫(@参考消息)

2022-12-26

权益基金12月加码派发“红包雨” 年内基金分红逾2300亿元

权益基金12月加码派发“红包雨”年内基金分红逾2300亿元

2022-12-26

孕后期吃板栗好吗?:热消息

怀孕后期吃板栗是非常好的。常吃板栗可以预防高血压、冠心病、骨质疏松、口腔溃疡等,孕妇可以少量食用。在怀孕期间,任何食物都不要一次性的

2022-12-25

今日观点!娱乐圈的这对CP,是我最后的底线

娱乐圈的爱情,还有救吗?好像已经习惯了在热搜上摁头吃明星的八点档情感烂瓜。洪欣老公被爆跟经纪人关系不清,张嘉倪老公疑似出轨女大学生。

2022-12-25

卖官地收287亿劲泻73% 13年新低:每日播报

大公报报导,本港前两年挺过新冠疫情四波来袭后,终被今年初第五波疫情大爆发攻陷,经济出现衰退,而刚性需求强烈的楼市,亦在美国加息及本港

2022-12-24

资讯

使用PyTorch 2.0 加速Hugging Face和TIMM库的模型_全球关注

点蓝色字关注“机器学习算法工程师”设为星标,干货直达!​PyTorch2 0引入了**torch compile()**来加速模型,这篇文章我们将介绍如何使用

2022-12-30     
长春高新: 关于回购注销部分限制性股票减少注册资本暨通知债权人的公告

长春高新:关于回购注销部分限制性股票减少注册资本暨通知债权人的公告

2022-12-29     
港股异动 | 赣锋锂业(01772)尾盘跌超3% 年末国内碳酸锂价格跌势明显加快:当前消息

智通财经APP获悉,赣锋锂业尾盘跌超3%,截至发稿,跌3 07%,报58 35港元,成交额1 2亿港元。消息面上,上海钢联发布的数据显示,12月28日电池

2022-12-29     
每日讯息!九典制药(300705)12月29日主力资金净买入412.80万元

截至2022年12月29日收盘,九典制药(300705)报收于23 6元,上涨3 6%,换手率1 9%,成交量4 05万手,成交额9407 77万元。12月29

2022-12-29     
微粒贷借款逾期1天多久会上征信系统_天天快看

网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天后上报给征信机构,因为有些借贷机构可

2022-12-29     
宇邦新材(301266)12月28日主力资金净卖出361.47万元-微资讯

截至2022年12月28日收盘,宇邦新材(301266)报收于76 59元,上涨4 95%,换手率6 63%,成交量1 72万手,成交额1 29亿元。12月28

2022-12-29