国产精品久久久久久久久久九秃_午夜福利09不卡片在线机视频_电击抽搐潮喷调教视频_女高中生穿jk自慰污污网站_日本高清www午色夜在线网站

首頁 >  資訊 >  詳情

使用PyTorch 2.0 加速Hugging Face和TIMM庫的模型

2022-12-29 16:28:49來源:

點藍色字關(guān)注“機器學(xué)習(xí)算法工程師”

設(shè)為星標,干貨直達!


【資料圖】

?

PyTorch 2.0引入了**torch.compile()**來加速模型,這篇文章我們將介紹如何使用**torch.compile()**來加速Hugging Face和TIMM庫的模型。

torch.compile() 使得嘗試不同的編譯器后端變得容易,從而使用單行裝飾器 torch.compile() 使 PyTorch 代碼更快。它可以直接在 nn.Module 上工作,作為 torch.jit.script() 的直接替代品,但不需要您進行任何源代碼更改。我們希望這一行代碼更改能夠為您已經(jīng)運行的絕大多數(shù)模型提供 30%-2 倍的訓(xùn)練時間加速。

opt_module=torch.compile(module)

torch.compile 支持任意 PyTorch 代碼、控制流、變異,并帶有對動態(tài)形狀的實驗性支持。我們對這一發(fā)展感到非常興奮,我們將其稱為 PyTorch 2.0。

這個版本對我們來說不同的是,我們已經(jīng)對一些最流行的開源 PyTorch 模型進行了基準測試,并獲得了 30% 到 2 倍的大幅加速(見https://github.com/pytorch/torchdynamo/issues/681) 。

這里沒有技巧,我們已經(jīng) pip 安裝了流行的庫,比如https://github.com/huggingface/transformers, https://github.com/huggingface/accelerate 和 https://github.com/rwightman/pytorch-image-models等流行的庫,然后對它們運行 torch.compile() 就可以了。

很難同時獲得性能和便利性,但這就是核心團隊發(fā)現(xiàn) PyTorch 2.0 如此令人興奮的原因。Hugging Face 團隊也很興奮,用他們的話說:

TIMM 的主要維護者 Ross Wightman:“PT 2.0 開箱即用,適用于推理和訓(xùn)練工作負載的大多數(shù) timm 模型,無需更改代碼。”

Sylvain Gugger 是 transformers 和 accelerate 的主要維護者:“只需添加一行代碼,PyTorch 2.0 就可以在訓(xùn)練 Transformers 模型時提供 1.5 到 2.x 的加速。這是引入混合精度訓(xùn)練以來最激動人心的事情!”

本教程將向您展示如何使用這些加速,這樣您就可以像我們一樣對 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

當(dāng)安裝好后,你可以通過以下方式來進行驗證:

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

使用教程

讓我們從一個簡單的例子開始,一步步把事情復(fù)雜化。請注意,您的 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模式下的逐點操作不是最優(yōu)的,因為每個操作都需要從內(nèi)存中讀取一個張量,進行一些更改,然后寫回這些更改。

PyTorch 2.0 為您所做的最重要的優(yōu)化是融合。

回到我們的示例,我們可以將 2 次讀取和 2 次寫入變成 1 次讀取和 1 次寫入,這對于較新的 GPU 來說尤其重要,因為瓶頸是內(nèi)存帶寬(您可以多快地向 GPU 發(fā)送數(shù)據(jù))而不是計算(您的速度有多快) GPU 可以處理浮點運算)。

PyTorch 2.0 為您做的第二個最重要的優(yōu)化是 CUDA graphs。CUDA graphs有助于消除從 python 程序啟動單個內(nèi)核的開銷。

torch.compile() 支持許多不同的后端,但我們特別興奮的一個是生成 Triton 內(nèi)核(https://github.com/openai/triton,用 Python 編寫的,但性能優(yōu)于絕大多數(shù)手寫的 CUDA 內(nèi)核)的 Inductor。假設(shè)我們上面的示例名為 trig.py,我們實際上可以通過運行來檢查代碼生成的 triton 內(nèi)核:

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 確實發(fā)生了,因為這兩個 sin 操作發(fā)生在一個單一的 Triton 內(nèi)核中,并且臨時變量保存在寄存器中,可以非??焖俚卦L問。

下一步,讓我們嘗試一個真實的模型,比如來自 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))

如果您實際運行,您可能會驚訝于第一次運行很慢,那是因為正在編譯模型。后續(xù)運行會更快,因此在開始對模型進行基準測試之前預(yù)熱模型是常見的做法。

您可能已經(jīng)注意到我們?nèi)绾卧诖颂幨褂谩癷nductor”顯式傳遞編譯器的名稱,但它不是唯一可用的后端,您可以在 torch._dynamo.list_backends() 中運行以查看可用后端的完整列表。為了好玩,您應(yīng)該嘗試 aot_cudagraphs 或 nvfuser。

現(xiàn)在讓我們做一些更有趣的事情,我們的社區(qū)經(jīng)常使用來自 transformers (https://github.com/huggingface/transformers) 或 TIMM (https://github.com/rwightman/pytorch-image-models)的預(yù)訓(xùn)練模型和我們的設(shè)計之一PyTorch 2.0 的目標是任何新的編譯器堆棧都需要開箱即用,可以與人們實際運行的絕大多數(shù)模型一起工作。因此,我們將直接從 Hugging Face hub 下載預(yù)訓(xùn)練模型并對其進行優(yōu)化。

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++ 內(nèi)核,這些內(nèi)核將針對在您的 CPU 上運行進行優(yōu)化。你可以檢查 Triton 或 C++ 內(nèi)核的 BERT,它們顯然比我們上面的三角函數(shù)示例更復(fù)雜,但如果你了解 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 的目標是構(gòu)建一個廣度優(yōu)先的編譯器,該編譯器將加速人們在開源中運行的絕大多數(shù)實際模型。Hugging Face Hub 最終成為我們非常有價值的基準測試工具,確保我們所做的任何優(yōu)化實際上都有助于加速人們想要運行的模型。

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

關(guān)鍵詞: 絕大多數(shù) 基準測試 的目標是

[ 相關(guān)文章 ]

[ 相關(guān)新聞 ]