首页>动态>正文
全球速讯:使用PyTorch 2.0 加速Hugging Face和TIMM库的模型
2022-12-25 22:27:46    来源:

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

设为星标,干货直达!

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-25

全球球精选!上海老年人可以种牙吗?

上海老年人可以种牙吗?种植牙是目前比较先进的一种种植技术,可以帮助很多的牙齿缺失患者恢复牙齿健康以及美观,牙齿缺失比较多的患者基本都2022-12-25

【机会挖掘】各地氢能产业规划落地 关注三条投资主线:环球观察

据福建日报消息,近日,福建省发改委印发《福建省氢能产业发展行动计划(2022—2025年)》,提出福建省氢能产业发展目标到2025年,培育20家具2022-12-24

海底捞北京门店客流回升明显,双旦有望加速消费回暖:天天速看

海底捞北京门店客流回升明显,双旦有望加速消费回暖2022年12月23日19:04中国网财经2022-12-23

2023年春运火车票明起开售|全球微速讯

证券时报网讯,据央视新闻,2023年铁路春运将从明年1月7日开始,2月15日结束,共40天。明天也就是12月24日,春运火车票就要开始发售,可以通过2022-12-23

当前要闻:海外财经媒体焦点:美国住宅销量以创纪录速度下滑 普京称俄罗斯希望尽快结束冲突

(原标题:海外财经媒体焦点:美国住宅销量以创纪录速度下滑普京称俄罗斯希望尽快结束冲突)财联社12月23日讯,隔夜,海外市场聚焦美国经济动2022-12-23

120余件近代儿童传统服饰在沪集中展出_前沿资讯

银红缎地三蓝绣花卉纹琵琶襟坎肩为宽身圆领,琵琶襟,两侧开衩,面料用银红色缎地,三蓝绣四季花卉纹。领口、袖笼、衣襟和下摆处黑缎地三蓝绣2022-12-22

港股异动 | 现代牙科(03600)涨超8%领涨医美股 消费场景恢复带动医美景气度边际修复_当前简讯

医美概念股集体走高,截至发稿,瑞丽医美(02135)涨6 9%,报0 155港元;现代牙科(03600)涨6 82%,报2 35港元;时代天使(06699)涨4 73%,报115 22022-12-22

华泰柏瑞中证稀土产业ETF净值下跌1.18% 请保持关注_每日头条

华泰柏瑞中证稀土产业ETF净值下跌1 18%请保持关注2022-12-22

4000只产品已报名!第四届中国银河专业交易策略公开赛即将启动-天天速讯

随着梅西带领阿根廷队捧起大力神杯,2022卡塔尔世界杯落下帷幕;与此同时,另一项盛大赛事即将鸣哨开赛。2023年1月1日,第四届中国银河专业交2022-12-21

热点聚焦:海南三亚今起免费发放7万多粒退烧药

“三亚发布”微信公众号消息,12月21日,三亚市市场监督管理局牵头组织首批18家市内药店,并持续组织更多市内爱心药店加入免费发放退烧药的队2022-12-21

天天快消息!50亿元人民币央行票据在港发行

本报北京12月20日电 (记者徐佩玉)20日,中国人民银行在香港成功发2022-12-21

红土创新丰睿中短债债券延期结束募集:每日资讯

红土创新丰睿中短债债券延期结束募集2022-12-20

美国2022:中期选举的“驴象之争”

(华府观察)美国2022:中期选举的“驴象之争”  中新社华盛顿12月19日电题:美国2022:中期选举的“驴象之争”  中新社记者沙晗汀  随着12022-12-20

当前快看:联泓新科: 关于2023年度开展套期保值业务的公告

联泓新科:关于2023年度开展套期保值业务的公告2022-12-19

阿根廷夺冠!义乌商家“赚翻”了?_环球要闻

卡塔尔世界杯落下帷幕。最大赢家除了最后的冠军阿根廷和梅西,义乌商人在世界杯期间赚翻了的说法也引发关注。过去两个月,以义乌为代表的中国2022-12-19

邮你贷首付2000有风险吗_天天简讯

可能会。如果用户使用网贷消费之后出现了逾期,并且经过网贷机构和第三方的催收人员催缴欠款无果之后,网贷公司可能就会向法院提起诉讼。网贷2022-12-19

太康县建立生活物资配送服务队 全力保障民生需求

3月27日上午,从孙涛手里接过胰岛素药品,糖尿病患者石先生急忙赶回家中注射到体内。石先生患有糖尿病已有27年。今年3月,受到疫情影响,石先2022-12-19

招商银行薪福通|普惠数字服务 减少企业转型负担

招商银行薪福通|普惠数字服务减少企业转型负担2022-12-18

即时看!中国激光产业发源地:国产装备闪亮海内外

华工科技党委书记、董事长马新强指出,华工科技对中国激光产业的最大贡献,在于率先探索激光的工业化应用、率先推进核心部件的国产化。他强调2022-12-17

木耳煮多久熟 木耳煮多长时间才能熟_全球即时看

1、木耳一般煮两到三分钟可以熟。木耳在水中浸泡后,如果直接做菜吃,味道不会特别好,煮熟木耳可以解决这个问题。木耳可以在沸水中煮两到三分2022-12-17

奥特维(688516.SH):无锡华信方面持股降至5%以下_环球今日讯

格隆汇12月16日丨奥特维(688516 SH)公布,公司近日收到股东无锡华信的《无锡华信安全设备股份有限公司简式权益变动报告书》,获悉无锡华信于2022年112022-12-16

阳煤化工董秘回复:公司目前暂未收到股东关于股权转让和股权质押事项新的通知,进展情况请关注公司公告:世界今日报

阳煤化工(600691)12月16日在投资者关系平台上答复了投资者关心的问题。投资者:你好,当前的股东华阳集团是否控股?股权质押情况如何?是否没2022-12-16

景顺2023展望:即使有衰退,也是温和的

对于2023年投资前景,景顺认为很大程度上取决于货币政策路径,高度依赖通胀路径。距离2023年还有16天,2022年以来,全球多国央行不约而同地持2022-12-15

China Nationa Offshore Oil Corporation增持中国海洋石油(00883.HK)1164.4万股 每股作价约9.98港元

香港联交所最新资料显示,12月13日,ChinaNationaOffshoreOilCorporation增持中国海洋石油(00883 HK)11642022-12-15