• 教程 >
  • PyTorch Vulkan 后端用户工作流程
快捷方式

注意

PyTorch Vulkan 后端不再维护。请查看 ExecuTorch Vulkan Delegate 的实现。

PyTorch Vulkan 后端用户工作流程

创建日期:2020 年 10 月 26 日 | 最后更新日期:2024 年 10 月 16 日 | 最后验证日期:2024 年 11 月 05 日

作者: Ivan Kobzarev

引言

PyTorch 1.7 支持在支持 Vulkan 图形和计算 API 的 GPU 上运行模型推理。主要目标设备是 Android 设备上的移动 GPU。Vulkan 后端也可用于 Linux、Mac 和 Windows 桌面构建,以使用 Intel 集成 GPU 等 Vulkan 设备。此功能处于原型阶段,可能会有所更改。

使用 Vulkan 后端构建 PyTorch

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

要使用带有 Vulkan 后端的 PyTorch,我们需要从源代码构建,并进行额外设置。从 GitHub master 分支检出 PyTorch 源代码。

可选的 vulkan wrapper 使用方法

默认情况下,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 构建

为指定的 ANDROID_ABI 构建带有 Vulkan 后端的 Android 版 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 后端的算子。

默认情况下,带有 backend='vulkan'optimize_for_mobile 会重写图,以便输入被传输到 Vulkan 后端,输出被传输到 CPU 后端,因此模型可以在 CPU 输入上运行并产生 CPU 输出。要禁用此功能,请将参数 optimization_blocklist={MobileOptimizerType.VULKAN_AUTOMATIC_GPU_TRANSFER} 添加到 optimize_for_mobile 中。(MobileOptimizerType 可以从 torch.utils.mobile_optimizer 导入)

更多信息,请参阅 torch.utils.mobile_optimizerAPI 文档

在代码中使用 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。

在 Tensor 上调用 .vulkan() 函数会将 tensor 复制到 Vulkan 设备,并且对于以此 tensor 作为输入的算子,该算子将在 Vulkan 设备上运行,其输出也将位于 Vulkan 设备上。

在 Vulkan tensor 上调用 .cpu() 函数会将其数据复制到 CPU tensor(默认)

以 Vulkan 设备上的 tensor 作为输入的算子将在 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='vulkan') 的作用类似于 .vulkan(),将 tensor 移动到 Vulkan 设备。

在编写本教程时,.vulkan() 尚未在 Python API 中暴露,但已计划将其加入。

Android Java API

对于 Android 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 构建 Android 测试应用

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

成功安装后,可以在设备上启动名为“MBQ”的应用。

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

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

文档

查阅全面的 PyTorch 开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源