菜单

Vulkan 后端

相关源文件

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_devicevk::PhysicalDeviceVulkan 物理设备句柄
devicevk::Device用于操作的逻辑设备
compute_queuevk_queue主要的计算命令队列
transfer_queuevk_queue数据传输队列
architecturevk_device_architecture检测到的 GPU 架构
subgroup_sizeuint32_tGPU 子组/warp 大小
coopmat_supportbool协同矩阵支持

设备结构还包含不同操作类型的着色器指针数组

  • 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 字节码。

生成过程为不同的

  • 数据类型:f32、f16、bf16、q4_0、q4_1、q5_0、q5_1、q8_0、q2_k、q3_k、q4_k、q5_k、q6_k
  • 协同矩阵支持:标准、CoopMat1、CoopMat2
  • 累加类型:f16acc、f32acc
  • 对齐:对齐和不对齐内存访问模式

来源:ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp294-422

着色器管理

vk_pipeline_struct 封装了完整的计算着色器状态

字段类型目的
shader_modulevk::ShaderModuleSPIR-V 着色器代码
dslvk::DescriptorSetLayout资源绑定布局
descriptor_poolsvector<vk::DescriptorPool>描述符内存池
pipelinevk::Pipeline完整的计算着色器
push_constant_sizeuint32_t推送常量数据的大小
wg_denomsarray<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 上进行硬件加速,特别有利于:

  • AMD RDNA2/RDNA3 架构
  • Intel Xe2 架构
  • 支持协同矩阵的 NVIDIA 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_xprealloc_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_GCN64Wave64 优化着色器
AMD_RDNA132-64混合波形大小支持
AMD_RDNA232-64协同矩阵支持
AMD_RDNA332-64增强的协同矩阵、整数点积
INTEL_XE216+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 提供详细的计时信息用于操作分析。

性能数据按操作类型收集,并提供平均执行时间以供优化分析。

来源:ggml/src/ggml-vulkan/ggml-vulkan.cpp876-913