Shortcuts

备注

PyTorch Vulkan后端不再维护。请查看`ExecuTorch Vulkan Delegate <https://pytorch.org/executorch/stable/native-delegates-executorch-vulkan-delegate.html>`_ 的实现。

PyTorch Vulkan后端用户工作流程

Created On: Oct 26, 2020 | Last Updated: Oct 16, 2024 | Last Verified: Nov 05, 2024

作者: Ivan Kobzarev

简介

PyTorch 1.7支持在支持Vulkan图形和计算API的GPU上运行模型推理。主要目标设备是安卓设备上的移动GPU。Vulkan后端也可用于Linux、Mac和Windows桌面版本,以使用诸如英特尔集成GPU这样的Vulkan设备。该功能处于原型阶段,可能会发生变化。

构建带Vulkan后端的PyTorch

Vulkan后端默认不包括在内。包括Vulkan后端的主开关是cmake选项``USE_VULKAN``,可以通过环境变量``USE_VULKAN``设置。

要使用带Vulkan后端的PyTorch,需要从源码构建并设置额外配置。从GitHub主分支检出PyTorch源码。

Vulkan包装器的可选使用

默认情况下,Vulkan库将在运行时通过vulkan_wrapper库加载。如果您指定环境变量``USE_VULKAN_WRAPPER=0``,libvulkan将直接链接。

桌面构建

Vulkan SDK

从https://vulkan.lunarg.com/sdk/home下载VulkanSDK并设置环境变量``VULKAN_SDK``

解压 VulkanSDK 到 VULKAN_SDK_ROOT 文件夹,根据您系统的 VulkanSDK 指南安装 VulkanSDK。

针对 Mac:

cd $VULKAN_SDK_ROOT
source setup-env.sh
sudo python install_vulkan.py

构建 PyTorch:

针对 Linux:

cd PYTORCH_ROOT
USE_VULKAN=1 USE_VULKAN_SHADERC_RUNTIME=1 USE_VULKAN_WRAPPER=0 python setup.py install

针对 Mac:

cd PYTORCH_ROOT
USE_VULKAN=1 USE_VULKAN_SHADERC_RUNTIME=1 USE_VULKAN_WRAPPER=0 MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py install

成功构建后,打开另一个终端并验证已安装的 PyTorch 版本。

import torch
print(torch.__version__)

在撰写此教程时,版本为 1.8.0a0+41237a4。根据您从 master 分支检出的代码时间可能会看到不同的版本号,但应该大于 1.7.0。

Android 构建

使用 Vulkan 后端为指定的 ANDROID_ABI 构建 LibTorch 以用于安卓。

cd PYTORCH_ROOT
ANDROID_ABI=arm64-v8a USE_VULKAN=1 sh ./scripts/build_android.sh

准备 pytorch_android aars,可直接在您的应用中使用:

cd $PYTORCH_ROOT
USE_VULKAN=1 sh ./scripts/build_pytorch_android.sh

模型准备

安装 torchvision,获取默认的预训练浮点模型。

pip install torchvision

保存预训练的 mobilenet_v2 到文件的 Python 脚本如下:

import torch
import torchvision

model = torchvision.models.mobilenet_v2(pretrained=True)
model.eval()
script_model = torch.jit.script(model)
torch.jit.save(script_model, "mobilenet2.pt")

PyTorch 1.7 的 Vulkan 后端仅支持 32 位浮点运算符。默认模型需要额外的优化步骤以进行算子融合。

from torch.utils.mobile_optimizer import optimize_for_mobile
script_model_vulkan = optimize_for_mobile(script_model, backend='vulkan')
torch.jit.save(script_model_vulkan, "mobilenet2-vulkan.pt")

结果模型只能用于 Vulkan 后端,因为它包含专门针对 Vulkan 后端的算子。

默认情况下,optimize_for_mobilebackend=&apos;vulkan&apos; 会重写图形,使得输入转到 Vulkan 后端,输出转到 CPU 后端,因此模型可以在 CPU 输入上运行并生成 CPU 输出。若关闭此功能,请在 optimize_for_mobile 中添加参数 optimization_blocklist={MobileOptimizerType.VULKAN_AUTOMATIC_GPU_TRANSFER}。(MobileOptimizerType 可以从 torch.utils.mobile_optimizer 导入)

查看更多信息,请参阅 torch.utils.mobile_optimizerAPI 文档 <https://pytorch.org/docs/stable/mobile_optimizer.html>

代码中使用 Vulkan 后端

C++ API

at::is_vulkan_available()
auto tensor = at::rand({1, 2, 2, 3}, at::device(at::kCPU).dtype(at::kFloat));
auto tensor_vulkan = t.vulkan();
auto module = torch::jit::load("$PATH");
auto tensor_output_vulkan = module.forward(inputs).toTensor();
auto tensor_output = tensor_output.cpu();

at::is_vulkan_available() 函数尝试初始化 Vulkan 后端,如果成功找到 Vulkan 设备并创建上下文,它将返回 true,否则为 false。

在张量上调用 .vulkan() 函数时,张量将被复制到 Vulkan 设备,对于以此张量为输入调用的运算符,它将在 Vulkan 设备上运行,其输出也将位于 Vulkan 设备上。

在 Vulkan 张量上调用 .cpu() 函数时,张量的数据将被复制到 CPU 张量(默认设置)。

以 Vulkan 设备上的张量为输入调用的运算符将会在 Vulkan 设备上执行。如果某个运算符不支持 Vulkan 后端,将会抛出异常。

支持运算符列表:

_adaptive_avg_pool2d
_cat
add.Scalar
add.Tensor
add_.Tensor
addmm
avg_pool2d
clamp
convolution
empty.memory_format
empty_strided
hardtanh_
max_pool2d
mean.dim
mm
mul.Scalar
relu_
reshape
select.int
slice.Tensor
transpose.int
transpose_
unsqueeze
upsample_nearest2d
view

这些运算符允许在 Vulkan 后端使用 torchvision 模型进行图像分类。

Python API

torch.is_vulkan_available() 已在 Python API 中公开。

tensor.to(device=&apos;vulkan&apos;) 的效果类似于 .vulkan(),将张量移至 Vulkan 设备。

截至撰写此教程时,.vulkan() 尚未公开给 Python API,但计划添加。

Android Java API

在加载模型时,我们需要指定模型将在 Vulkan 后端运行:

import org.pytorch.Device;
Module module = Module.load("$PATH", Device.VULKAN)
FloatBuffer buffer = Tensor.allocateFloatBuffer(1 * 3 * 224 * 224);
Tensor inputTensor = Tensor.fromBlob(buffer, new int[]{1, 3, 224, 224});
Tensor outputTensor = mModule.forward(IValue.from(inputTensor)).toTensor();

在这种情况下,所有输入会透明地从 CPU 复制到 Vulkan 设备,模型将在 Vulkan 设备上运行,输出也会透明地复制到 CPU。

有关使用 Vulkan 后端的示例可以在 PyTorch 仓库中的测试应用程序找到: https://github.com/pytorch/pytorch/blob/master/android/test_app/app/src/main/java/org/pytorch/testapp/MainActivity.java#L133

构建带 Vulkan 的安卓测试应用

cd $PYTORCH_ROOT
USE_VULKAN=1 sh ./scripts/build_pytorch_android.sh

或者如果您只需要指定的 abi,可以将其作为参数设置:

cd $PYTORCH_ROOT
USE_VULKAN=1 sh ./scripts/build_pytorch_android.sh $ANDROID_ABI

将准备好的模型 mobilenet2-vulkan.pt 添加到测试应用资产中:

cp mobilenet2-vulkan.pt $PYTORCH_ROOT/android/test_app/app/src/main/assets/
cd $PYTORCH_ROOT
gradle -p android test_app:installMbvulkanLocalBaseDebug

成功安装后,可以在设备上启动名为 &apos;MBQ&apos; 的应用程序。

无需上传到安卓设备即可测试模型

Vulkan 软件实现(例如 https://swiftshader.googlesource.com/SwiftShader )可用于测试模型是否可以使用 PyTorch Vulkan 后端运行(例如检查是否支持所有模型运算符)。

文档

访问 PyTorch 的详细开发者文档

查看文档

教程

获取针对初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并获得问题的解答

查看资源