PyTorch翻译官网教程-FAST TRANSFORMER INFERENCE WITH BETTER TRANSFORMER

官网链接

Fast Transformer Inference with Better Transformer — PyTorch Tutorials 2.0.1+cu117 documentation

使用 BETTER TRANSFORMER 快速的推理TRANSFORMER

本教程介绍了作为PyTorch 1.12版本的一部分的Better Transformer (BT)。在本教程中,我们将展示如何使用更好的Transformertorchtext进行生产推理。Better Transformer是一个具备生产条件fastpath并且可以加速在CPU和GPU上具有高性能的Transformer模型的部署。对于直接基于PyTorch核心nn.module或基于torchtext的模型,fastpath功能可以透明地工作。

使用PyTorch核心torch.nn.module类TransformerEncoder, TransformerEncoderLayer和MultiHeadAttention的模型,可以通过Better Transformer fastpath 执行加速。此外,torchtext已经更新为使用核心库模块,以受益于fastpath加速。(将来可能会启用其他模块的fastpath执行。)

Better Transformer提供两种类型的加速:

  • 实现CPU和GPU的Native multihead attention(MHA),提高整体执行效率。
  • 利用NLP推理中的稀疏性。由于输入长度可变,输入令牌可能包含大量填充令牌,可以跳过处理,从而显著提高速度。


Fastpath执行受制于一些标准。最重要的是,模型必须在推理模式下执行,并且在不收集梯度信息的输入张量上运行(例如,使用torch.no_grad运行)。

本教程中Better Transformer 特点

  • 加载预训练模型(1.12之前没有Better Transformer)
  • 在CPU上并且没有BT fastpath(仅本机MHA))的情况下 运行和基准测试推断
  • 在设备(可配置)上并且没有BT fastpath(仅本机MHA))的情况下 运行和基准测试推断
  • 启用稀疏性支持
  • 在设备(可配置)上并且没有BT fastpath(仅本机MHA+稀疏性))的情况下 运行和基准测试推断

额外的信息

关于Better Transformer的其他信息可以在PyTorch.Org 博客中找到。A Better Transformer for Fast Transformer Inference.

设置

加载预训练模型

我们按照torchtext.models中的说明从预定义的torchtext模型下载XLM-R模型。我们还将DEVICE设置为执行加速器上的测试。(根据您的环境适当启用GPU执行。)

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()

数据集搭建

我们设置了两种类型的输入:一个小的输入批次和一个具有稀疏性的大的输入批次。

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."""
]

接下来,我们选择小批量或大批量输入,对输入进行预处理并测试模型。

input_batch=big_input_batch

model_input = to_tensor(transform(input_batch), padding_value=1)
output = model(model_input)
output.shape

最后,我们设置基准迭代计数:

ITERATIONS=10

执行

在CPU上并且没有BT fastpath(仅本机MHA)的情况下 运行和基准测试推断

我们在CPU上运行模型,并收集概要信息:

  • 第一次运行使用传统方式(“slow path”)执行。
  • 第二次运行通过使用model.eval()将模型置于推理模式来启用BT fastpath执行,并使用torch.no_grad()禁用梯度收集。

当模型在CPU上执行时,您可以看到改进(其大小取决于CPU模型)。注意,fastpath配置文件显示了本机TransformerEncoderLayer实现aten::_transformer_encoder_layer_fwd.中的大部分执行时间。
 

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)


 

在设备(可配置)上并且没有BT fastpath(仅本机MHA))的情况下 运行和基准测试推断

我们检查BT 稀疏性设置:

model.encoder.transformer.layers.enable_nested_tensor

我们禁用BT 稀疏性:

model.encoder.transformer.layers.enable_nested_tensor=False


我们在DEVICE上运行模型,并收集DEVICE上本机MHA执行的配置文件信息:

  • 第一次运行使用传统方式(“slow path”)执行。
  • 第二次运行通过使用model.eval()将模型置于推理模式来启用BT fastpath执行,并使用torch.no_grad()禁用梯度收集。

当在GPU上执行时,你应该看到一个显著的加速,特别是对于包含稀疏性的大输入批处理设置:

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)

总结

在本教程中,我们介绍了使用 Better Transformer fastpath快速的transformer 推理,在torchtext 中使用PyTorch核心的 Better Transformer包支持Transformer Encoder 模型。在确认BT fastpath可用性的前提下,我们已经演示了 Better Transformer 的使用。我们已经演示并测试了BT fastpath 执行模式·、本机MHA执行和BT稀疏性加速的使用。

### 使用 PyTorch 实现 Swin-Transformer 进行自定义数据集训练 为了使用 PyTorch 实现 Swin-Transformer 并将其应用于自定义数据集的训练,需遵循一系列配置和编码实践。这不仅涉及模型本身的构建,还包括环境设置、数据处理以及具体训练过程中的细节调整。 #### 环境准备 首先,确保开发环境中已安装必要的依赖库。对于 Swin-Transformer 的实现而言,除了基础的 PyTorch 外,还需特别关注 `mmcv` 和特定版本兼容性的安装[^4]: ```bash pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.9/index.html ``` 上述命令假设 CUDA 版本为 11.3 及 PyTorch 版本为 1.9;实际操作时应依据个人环境选择合适的版本组合。 接着,克隆官方仓库并完成本地包的安装以获取最新版 Swin-Transformer 模型及相关工具[^1]: ```bash git clone https://github.com/SwinTransformer/Swin-Transformer-Semantic-Segmentation.git cd Swin-Transformer-Semantic-Segmentation pip install -e . ``` #### 数据集适配 针对自定义数据集的应用场景,在开始之前需要对其进行适当转换以便于后续流程顺利执行。通常情况下,这意味着将原始图像及其标签按照指定格式整理好,并编写相应的 Dataset 类用于加载这些资源到内存中供迭代器访问。如果采用 COCO 或 VOC 标准,则可以直接利用现有框架支持简化此步骤。 当涉及到语义分割任务时,可能还需要额外考虑掩码(mask)文件的存在形式——即每个像素点对应类别ID的地图。这部分工作可以通过脚本来批量生成或手动标注获得高质量样本集合。 #### 修改配置文件 根据项目需求定制化修改默认配置文件是非常重要的一步。例如,在路径 `/config/swin/` 下找到适合当前项目的配置模板(如 upernet_swin_tiny_patch4_window7_512x512_160k_ade20k.py),然后针对性地编辑其中的关键参数以匹配所使用的硬件条件和个人偏好设定[^3]。 值得注意的是,某些高级选项可能会显著影响最终效果的好坏程度,因此建议仔细阅读官方文档了解各项功能的具体含义后再做决定。 #### 开始训练 一切准备工作就绪之后就可以启动正式训练环节了。一般会通过调用预先编写的 Python 脚本来触发整个过程,期间可以监控日志输出查看进度状况并及时作出相应调整优化性能表现。 遇到类似 `"KeyError: CascadeRCNN: 'SwinTransformer is not in the backbone registry'"` 错误提示时,可能是由于注册表未正确更新所致,此时可尝试重启内核重新导入模块解决该类问题。 ```python import torch from mmdet.apis import init_detector, inference_detector, show_result_pyplot from mmdet.models import build_detector from mmcv.runner import load_checkpoint from mmseg.apis import set_random_seed # 加载预训练权重 checkpoint_file = './checkpoints/pretrained_model.pth' model = init_detector(config_file='configs/my_custom_config.py', checkpoint=checkpoint_file) set_random_seed(0, deterministic=True) data_loader = model.data_preprocessor.dataset.load_as_dataloader() for i, data_batch in enumerate(data_loader): results = model(return_loss=False, **data_batch) ``` 以上代码片段展示了如何初始化带有预训练权重的检测器实例,并创建一个简单的推理循环来评估新输入的数据批次。当然,实际应用中往往还会包含更多复杂的逻辑控制与结果可视化部分。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值