备注
PyTorch Vulkan 后端不再维护。请查阅 ExecuTorch Vulkan Delegate 实现方案。
PyTorch Vulkan 后端用户工作流程 ¶
创建于:2025 年 4 月 1 日 | 最后更新:2025 年 4 月 1 日 | 最后验证:2024 年 11 月 5 日
作者:伊万·科布扎列夫
简介
PyTorch 1.7 支持在支持 Vulkan 图形和计算 API 的 GPU 上运行模型推理。主要目标设备是 Android 设备上的移动 GPU。Vulkan 后端也可以用于 Linux、Mac 和 Windows 桌面构建,以使用 Vulkan 设备,如英特尔集成 GPU。此功能处于原型阶段,可能有所变动。
使用 Vulkan 后端构建 PyTorch ¶
默认情况下不包含 Vulkan 后端。要包含 Vulkan 后端,主要开关是 cmake 选项 USE_VULKAN
,可以通过环境变量 USE_VULKAN
设置。
要使用带有 Vulkan 后端的 PyTorch,我们需要从源代码构建,并使用额外的设置。从 GitHub master 分支检出 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 的系统说明进行安装。
For 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
For 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。您查看代码的时间可能不同,但应大于 1.7.0。
Android 构建
为指定 ANDROID_ABI
构建具有 Vulkan 后端的 LibTorch for android。
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
Python 脚本保存预训练的 mobilenet_v2 到文件:
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 后端仅支持 float 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_mobile
使用 backend='vulkan'
重新编写图,以便输入被传输到 Vulkan 后端,输出被传输到 CPU 后端,因此,该模型可以在 CPU 输入上运行并产生 CPU 输出。要禁用此功能,请向 optimize_for_mobile
添加参数 optimization_blocklist={MobileOptimizerType.VULKAN_AUTOMATIC_GPU_TRANSFER}
。( MobileOptimizerType
可以从 torch.utils.mobile_optimizer
导入)
查看 torch.utils.mobile_optimizer API 文档以获取更多信息。
使用 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 设备上。
.cpu()
在 Vulkan 张量上调用的函数将将其数据复制到 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='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 构建 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
添加到测试应用程序的 assets 中:
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 后端运行(例如检查是否所有模型操作符都受支持)。