本页面介绍了 llama.cpp 中 Metal 后端的实现,它使用 Metal 框架在 Apple 设备上启用 GPU 加速。Metal 后端将 GGML 操作转换为在 Apple GPU 上运行的 Metal 着色器内核,与仅 CPU 执行相比,显著提升了性能。
Metal 后端是 llama.cpp 中后端系统的一部分,该系统允许在不同硬件上执行张量操作。它专门针对支持 Metal 的 Apple 设备,包括配备 Apple Silicon 或 AMD GPU 的 Mac、iPhone 和 iPad。
来源: ggml/src/ggml-metal/ggml-metal.m1-68 README.md232-244
Metal 后端由几个关键组件组成,这些组件协同工作以实现 GGML 操作的 GPU 加速
来源: ggml/src/ggml-metal/ggml-metal.m44-68 ggml/src/ggml-metal/ggml-metal.m124-130 ggml/src/ggml-metal/ggml-metal-impl.h1-67
Metal 后端围绕一个核心上下文结构 ggml_backend_metal_device_context 构建,该结构包含 Metal 设备、库和设备能力。
Metal 后端首次使用时会初始化此上下文。它会检测可用 Metal 设备的能力并初始化相应的功能。
来源: ggml/src/ggml-metal/ggml-metal.m45-68 ggml/src/ggml-metal/ggml-metal.m70-123
Metal 后端实现了广泛的计算内核来处理不同的 GGML 操作。每个内核都由一个 ggml_metal_kernel 结构表示,该结构包含对已编译的 Metal 计算管道的引用。
Metal 后端定义了 100 多种不同的内核类型来处理各种操作和数据类型,例如:
来源: ggml/src/ggml-metal/ggml-metal.m127-291 ggml/src/ggml-metal/ggml-metal.metal1-33
Metal 后端自动检测 Metal 设备的能力,并根据检测到的特性启用优化代码路径:
主要功能包括
来源: ggml/src/ggml-metal/ggml-metal.m76-95 README.md18-19
Metal 后端为 GPU 缓冲区提供高效的内存管理。
Metal 后端提供:
来源: ggml/src/ggml-metal/ggml-metal.m26-33 README.md19
Metal 后端支持多种数据类型:
每种数据类型都有针对性能优化的特定 Metal 内核。
来源: ggml/src/ggml-metal/ggml-metal.metal25-46 ggml/src/ggml-metal/ggml-metal.m87-95
Metal 后端通过 ggml-backend.h 中定义的后端接口与 GGML 集成。它提供了所有必需后端函数的实现:
关键集成点包括
ggml_backend_metal_reg 进行后端注册ggml_backend_metal_alloc_buffer 进行缓冲区分配ggml_backend_metal_graph_compute 执行张量操作ggml_backend_metal_get_device 暴露设备能力来源: ggml/src/ggml-backend.cpp1-50 ggml/include/ggml-backend.h1-58
当 GGML 图在 Metal 后端上执行时,会发生以下过程:
来源: ggml/src/ggml-metal/ggml-metal.m75-103 ggml/src/ggml-backend.cpp30-60
在 llama.cpp 中使用 Metal 后端:
--gpu-layers 命令行选项显式选择 Metal 后端。GGML_METAL_PATH_RESOURCES:指定资源路径GGML_METAL_PATH_LIBRARY:指定 Metal 库路径GGML_METAL_NO_RESIDENCY:禁用驻留集GGML_METAL_NDEBUG:禁用 Metal 后端的调试来源: ggml/src/ggml-metal/ggml-metal.m26-33 README.md231-244
Metal 后端通常比纯 CPU 执行提供显著的性能提升,特别是对于大型模型。一些关键的性能方面包括:
为获得最佳性能
来源: ggml/src/ggml-metal/ggml-metal.m26-33 README.md19
Metal 后端有一些需要注意的限制:
来源: ggml/src/ggml-metal/ggml-metal.m76-95
Metal 后端包含调试功能,以帮助识别问题: