Vulkan 后端通过 Vulkan 计算着色器为 GGML 操作提供跨平台 GPU 加速。它支持在支持 Vulkan 的设备上进行硬件加速推理,包括 NVIDIA、AMD、Intel 以及 Windows、Linux、macOS 和 Android 平台上的移动 GPU。
有关 CPU 优化,请参阅 CPU 后端。有关 NVIDIA 特定 GPU 加速,请参阅 CUDA 后端。有关 Apple Silicon GPU 加速,请参阅 Metal 后端。
Vulkan 后端实现了 GGML 后端接口,并提供了一个全面的 GPU 计算管道,支持量化矩阵运算、闪存注意力(flash attention)和协同矩阵扩展(cooperative matrix extensions)。
设备架构检测与优化
来源:ggml/src/ggml-vulkan/ggml-vulkan.cpp193-280
vk_device_struct 作为核心设备抽象,负责管理 Vulkan 设备状态、队列、内存属性和特性检测。
| 组件 | 类型 | 目的 |
|---|---|---|
physical_device | vk::PhysicalDevice | Vulkan 物理设备句柄 |
device | vk::Device | 用于操作的逻辑设备 |
compute_queue | vk_queue | 主要的计算命令队列 |
transfer_queue | vk_queue | 数据传输队列 |
architecture | vk_device_architecture | 检测到的 GPU 架构 |
subgroup_size | uint32_t | GPU 子组/warp 大小 |
coopmat_support | bool | 协同矩阵支持 |
设备结构还包含不同操作类型的着色器指针数组
pipeline_dequant_mul_mat_mat[GGML_TYPE_COUNT] - 量化矩阵乘法着色器pipeline_flash_attn_f32_f16_D64[GGML_TYPE_COUNT][2][2][2] - 用于不同维度和配置的闪存注意力着色器来源:ggml/src/ggml-vulkan/ggml-vulkan.cpp282-503
vk_buffer_struct 管理 GPU 内存分配,具有自动清理和设备内存跟踪功能。
vk_subbuffer 结构提供了对较大缓冲区进行基于偏移量的视图,以实现高效的内存利用。
来源:ggml/src/ggml-vulkan/ggml-vulkan.cpp505-533
Vulkan 后端使用复杂的着色器生成系统,在构建时将 GLSL 计算着色器编译为 SPIR-V 字节码。
生成过程为不同的
来源:ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp294-422
vk_pipeline_struct 封装了完整的计算着色器状态
| 字段 | 类型 | 目的 |
|---|---|---|
shader_module | vk::ShaderModule | SPIR-V 着色器代码 |
dsl | vk::DescriptorSetLayout | 资源绑定布局 |
descriptor_pools | vector<vk::DescriptorPool> | 描述符内存池 |
pipeline | vk::Pipeline | 完整的计算着色器 |
push_constant_size | uint32_t | 推送常量数据的大小 |
wg_denoms | array<uint32_t, 3> | 工作组大小的分母 |
后端维护着专门的着色器集合
来源:ggml/src/ggml-vulkan/ggml-vulkan.cpp117-140 ggml/src/ggml-vulkan/ggml-vulkan.cpp344-456
Vulkan 后端通过专门的计算着色器支持全面的量化格式反量化。
每种量化格式在 types.comp 文件中定义了特定的块结构。例如:
来源:ggml/src/ggml-vulkan/vulkan-shaders/types.comp49-70 ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs_cm2.comp1-640
后端支持协同矩阵运算,以提高现代 GPU 上的性能。
协同矩阵支持子组级别的矩阵运算,并在支持的 GPU 上进行硬件加速,特别有利于:
来源:ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp1-25 ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm2.comp11-14
Vulkan 后端实现了复杂的内存管理系统,包含设备本地和主机可见内存池。
后端为常用操作维护预分配的内存池:
prealloc_x、prealloc_y - 输入矩阵缓冲区prealloc_split_k - Split-K 中间结果buffer_pool[MAX_VK_BUFFERS] - 通用缓冲区池来源:ggml/src/ggml-vulkan/ggml-vulkan.cpp922-923 ggml/src/ggml-vulkan/ggml-vulkan.cpp860-990
ggml_vk_garbage_collector 管理延迟资源清理,以避免异步 GPU 操作中的使用后释放(use-after-free)问题。
资源会被排队等待删除,并在 GPU 操作完成后进行清理,以确保异步执行模型中的内存安全。
来源:ggml/src/ggml-vulkan/ggml-vulkan.cpp827-833
后端检测并优化特定 GPU 架构
| 架构 | 子组大小 (Subgroup Size) | 优化 |
|---|---|---|
AMD_GCN | 64 | Wave64 优化着色器 |
AMD_RDNA1 | 32-64 | 混合波形大小支持 |
AMD_RDNA2 | 32-64 | 协同矩阵支持 |
AMD_RDNA3 | 32-64 | 增强的协同矩阵、整数点积 |
INTEL_XE2 | 16+ | SIMD16 优化 |
特性检测包括:
coopmat_support - 协同矩阵扩展integer_dot_product - 硬件整数点积subgroup_size_control - 可变子组大小float_controls_rte_fp16 - 舍入到偶数的 FP16 操作来源:ggml/src/ggml-vulkan/ggml-vulkan.cpp202-280 ggml/src/ggml-vulkan/ggml-vulkan.cpp314-331
vk_perf_logger 提供详细的计时信息用于操作分析。
性能数据按操作类型收集,并提供平均执行时间以供优化分析。