官網(wǎng)鏈接
Fast Transformer Inference with Better Transformer — PyTorch Tutorials 2.0.1+cu117 documentation
使用 BETTER TRANSFORMER 快速的推理TRANSFORMER
本教程介紹了作為PyTorch 1.12版本的一部分的Better Transformer (BT)。在本教程中,我們將展示如何使用更好的Transformer與torchtext進(jìn)行生產(chǎn)推理。Better Transformer是一個(gè)具備生產(chǎn)條件fastpath并且可以加速在CPU和GPU上具有高性能的Transformer模型的部署。對(duì)于直接基于PyTorch核心nn.module或基于torchtext的模型,fastpath功能可以透明地工作。
使用PyTorch核心torch.nn.module類TransformerEncoder, TransformerEncoderLayer和MultiHeadAttention的模型,可以通過Better Transformer fastpath 執(zhí)行加速。此外,torchtext已經(jīng)更新為使用核心庫模塊,以受益于fastpath加速。(將來可能會(huì)啟用其他模塊的fastpath執(zhí)行。)
Better Transformer提供兩種類型的加速:
- 實(shí)現(xiàn)CPU和GPU的Native multihead attention(MHA),提高整體執(zhí)行效率。
- 利用NLP推理中的稀疏性。由于輸入長度可變,輸入令牌可能包含大量填充令牌,可以跳過處理,從而顯著提高速度。
Fastpath執(zhí)行受制于一些標(biāo)準(zhǔn)。最重要的是,模型必須在推理模式下執(zhí)行,并且在不收集梯度信息的輸入張量上運(yùn)行(例如,使用torch.no_grad運(yùn)行)。
本教程中Better Transformer 特點(diǎn)
- 加載預(yù)訓(xùn)練模型(1.12之前沒有Better Transformer)
- 在CPU上并且沒有BT fastpath(僅本機(jī)MHA))的情況下 運(yùn)行和基準(zhǔn)測試推斷
- 在設(shè)備(可配置)上并且沒有BT fastpath(僅本機(jī)MHA))的情況下 運(yùn)行和基準(zhǔn)測試推斷
- 啟用稀疏性支持
- 在設(shè)備(可配置)上并且沒有BT fastpath(僅本機(jī)MHA+稀疏性))的情況下 運(yùn)行和基準(zhǔn)測試推斷
額外的信息
關(guān)于Better Transformer的其他信息可以在PyTorch.Org 博客中找到。A Better Transformer for Fast Transformer Inference.
設(shè)置
加載預(yù)訓(xùn)練模型
我們按照torchtext.models中的說明從預(yù)定義的torchtext模型下載XLM-R模型。我們還將DEVICE設(shè)置為執(zhí)行加速器上的測試。(根據(jù)您的環(huán)境適當(dāng)啟用GPU執(zhí)行。)
import torch
import torch.nn as nn
print(f"torch version: {torch.__version__}")
DEVICE = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
print(f"torch cuda available: {torch.cuda.is_available()}")
import torch, torchtext
from torchtext.models import RobertaClassificationHead
from torchtext.functional import to_tensor
xlmr_large = torchtext.models.XLMR_LARGE_ENCODER
classifier_head = torchtext.models.RobertaClassificationHead(num_classes=2, input_dim = 1024)
model = xlmr_large.get_model(head=classifier_head)
transform = xlmr_large.transform()
數(shù)據(jù)集搭建
我們設(shè)置了兩種類型的輸入:一個(gè)小的輸入批次和一個(gè)具有稀疏性的大的輸入批次。
small_input_batch = [
"Hello world",
"How are you!"
]
big_input_batch = [
"Hello world",
"How are you!",
"""`Well, Prince, so Genoa and Lucca are now just family estates of the
Buonapartes. But I warn you, if you don't tell me that this means war,
if you still try to defend the infamies and horrors perpetrated by
that Antichrist- I really believe he is Antichrist- I will have
nothing more to do with you and you are no longer my friend, no longer
my 'faithful slave,' as you call yourself! But how do you do? I see
I have frightened you- sit down and tell me all the news.`
It was in July, 1805, and the speaker was the well-known Anna
Pavlovna Scherer, maid of honor and favorite of the Empress Marya
Fedorovna. With these words she greeted Prince Vasili Kuragin, a man
of high rank and importance, who was the first to arrive at her
reception. Anna Pavlovna had had a cough for some days. She was, as
she said, suffering from la grippe; grippe being then a new word in
St. Petersburg, used only by the elite."""
]
接下來,我們選擇小批量或大批量輸入,對(duì)輸入進(jìn)行預(yù)處理并測試模型。
input_batch=big_input_batch
model_input = to_tensor(transform(input_batch), padding_value=1)
output = model(model_input)
output.shape
最后,我們設(shè)置基準(zhǔn)迭代計(jì)數(shù):
ITERATIONS=10
執(zhí)行
在CPU上并且沒有BT fastpath(僅本機(jī)MHA)的情況下 運(yùn)行和基準(zhǔn)測試推斷
我們在CPU上運(yùn)行模型,并收集概要信息:
- 第一次運(yùn)行使用傳統(tǒng)方式(“slow path”)執(zhí)行。
- 第二次運(yùn)行通過使用model.eval()將模型置于推理模式來啟用BT fastpath執(zhí)行,并使用torch.no_grad()禁用梯度收集。
當(dāng)模型在CPU上執(zhí)行時(shí),您可以看到改進(jìn)(其大小取決于CPU模型)。注意,fastpath配置文件顯示了本機(jī)TransformerEncoderLayer實(shí)現(xiàn)aten::_transformer_encoder_layer_fwd.中的大部分執(zhí)行時(shí)間。
?
print("slow path:")
print("==========")
with torch.autograd.profiler.profile(use_cuda=False) as prof:
for i in range(ITERATIONS):
output = model(model_input)
print(prof)
model.eval()
print("fast path:")
print("==========")
with torch.autograd.profiler.profile(use_cuda=False) as prof:
with torch.no_grad():
for i in range(ITERATIONS):
output = model(model_input)
print(prof)
?
在設(shè)備(可配置)上并且沒有BT fastpath(僅本機(jī)MHA))的情況下 運(yùn)行和基準(zhǔn)測試推斷
我們檢查BT 稀疏性設(shè)置:
model.encoder.transformer.layers.enable_nested_tensor
我們禁用BT 稀疏性:
model.encoder.transformer.layers.enable_nested_tensor=False
我們在DEVICE上運(yùn)行模型,并收集DEVICE上本機(jī)MHA執(zhí)行的配置文件信息:
- 第一次運(yùn)行使用傳統(tǒng)方式(“slow path”)執(zhí)行。
- 第二次運(yùn)行通過使用model.eval()將模型置于推理模式來啟用BT fastpath執(zhí)行,并使用torch.no_grad()禁用梯度收集。
當(dāng)在GPU上執(zhí)行時(shí),你應(yīng)該看到一個(gè)顯著的加速,特別是對(duì)于包含稀疏性的大輸入批處理設(shè)置:文章來源:http://www.zghlxwxcb.cn/news/detail-645124.html
model.to(DEVICE)
model_input = model_input.to(DEVICE)
print("slow path:")
print("==========")
with torch.autograd.profiler.profile(use_cuda=True) as prof:
for i in range(ITERATIONS):
output = model(model_input)
print(prof)
model.eval()
print("fast path:")
print("==========")
with torch.autograd.profiler.profile(use_cuda=True) as prof:
with torch.no_grad():
for i in range(ITERATIONS):
output = model(model_input)
print(prof)
總結(jié)
在本教程中,我們介紹了使用 Better Transformer fastpath快速的transformer 推理,在torchtext 中使用PyTorch核心的 Better Transformer包支持Transformer Encoder 模型。在確認(rèn)BT fastpath可用性的前提下,我們已經(jīng)演示了 Better Transformer 的使用。我們已經(jīng)演示并測試了BT fastpath 執(zhí)行模式·、本機(jī)MHA執(zhí)行和BT稀疏性加速的使用。文章來源地址http://www.zghlxwxcb.cn/news/detail-645124.html
到了這里,關(guān)于PyTorch翻譯官網(wǎng)教程-FAST TRANSFORMER INFERENCE WITH BETTER TRANSFORMER的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!