菜单

构建系统

相关源文件

本文档解释了 llama.cpp 中使用的构建系统,涵盖了可用的构建方法、配置选项以及如何为不同平台以及各种优化选项编译项目。构建系统主要基于 CMake,并支持 Nix 和直接 Makefile 构建。

概述

llama.cpp 存储库使用灵活的构建系统,支持

  1. CMake(主要构建系统)
  2. Nix(用于可复现的构建)
  3. 直接 Makefile 构建(基本需求的简单选项)

构建系统允许配置大量选项,包括硬件加速后端(CUDA、Metal、Vulkan 等)、特定于架构的优化(AVX、AVX2、NEON 等)以及各种构建目标(库、CLI 应用程序、服务器、示例、测试)。

来源:.github/workflows/build.yml1-1062 flake.nix1-186 ggml/CMakeLists.txt1-362 tests/CMakeLists.txt51-81

CMake 构建系统

CMake 是 llama.cpp 的主要构建系统。它提供了一种在不同平台上一致编译项目的方法,同时支持各种后端和优化选项。

项目结构

CMake 项目通过特定的后端管理函数进行分层组织

来源:ggml/CMakeLists.txt236 ggml/src/CMakeLists.txt287-322 ggml/src/ggml-cpu/CMakeLists.txt1-8 common/CMakeLists.txt49-53 tests/CMakeLists.txt51-81

基本用法

使用 CMake 构建 llama.cpp

核心配置选项

构建系统通过 -D 标志公开了许多可配置选项

选项描述默认
BUILD_SHARED_LIBS构建共享库ON(MinGW 和 WebAssembly 除外)
GGML_BACKEND_DL将后端构建为动态库OFF
GGML_STATIC静态链接库OFF
GGML_NATIVE优化当前 CPUON(除非交叉编译)
GGML_LTO启用链接时优化OFF
GGML_CCACHE可用时使用 ccacheON
GGML_ALL_WARNINGS启用所有编译器警告ON
GGML_FATAL_WARNINGS启用 -Werror 标志OFF

来源:ggml/CMakeLists.txt42-89

后端选项

GGML 张量库使用通过 ggml_add_backend() 进行动态后端注册的系统

选项描述默认注册
GGML_CPU启用 CPU 后端ONggml_add_backend(CPU)
GGML_CUDA启用 CUDA 后端OFFggml_add_backend(CUDA)
GGML_METAL启用 Metal 后端ON(macOS)ggml_add_backend(METAL)
GGML_VULKAN启用 Vulkan 后端OFFggml_add_backend(Vulkan)
GGML_SYCL启用 SYCL 后端OFFggml_add_backend(SYCL)
GGML_OPENCL启用 OpenCL 后端OFFggml_add_backend(OpenCL)
GGML_BLAS使用 BLASOFF(macOS 为 ON)ggml_add_backend(BLAS)
GGML_KOMPUTE使用 Kompute 后端OFFggml_add_backend(Kompute)
GGML_RPC使用 RPC 后端OFFggml_add_backend(RPC)
GGML_HIP为 AMD GPU 使用 HIPOFFggml_add_backend(HIP)
GGML_CANN为华为 Ascend 使用 CANNOFFggml_add_backend(CANN)
GGML_MUSA为 Moore Threads 使用 MUSAOFFggml_add_backend(MUSA)

来源:ggml/CMakeLists.txt155-204 ggml/src/CMakeLists.txt312-322

特定于架构的优化

构建系统可以自动检测并启用特定于架构的优化

来源:ggml/src/ggml-cpu/CMakeLists.txt90-368

构建目标

构建系统产生的主要目标包括

目标描述
libllama核心库
llama-cli命令行界面
llama-server用于服务模型的 HTTP 服务器
llama-quantize模型量化工具
llama-embedding嵌入生成工具
测试各种测试可执行文件
示例各种示例应用程序

来源:.github/workflows/build.yml65-69 examples/server/CMakeLists.txt1-51

Nix 构建系统

该项目还包括一个 Nix 构建系统,支持跨环境的可复现构建。该系统定义在 flake.nix 文件以及 .devops/nix/ 目录下的各种文件中。

Nix Flake 结构

来源:flake.nix1-186 .devops/nix/scope.nix1-42 .devops/nix/package.nix1-247 .devops/nix/docker.nix1-38 .devops/nix/sif.nix1-28 .devops/nix/jetson-support.nix1-40

Nix 构建选项

Nix 构建选项在 package.nix 中定义,并包含与 CMake 系统类似的选项

选项描述默认
useBlas使用 BLAS取决于平台
useCuda使用 CUDA取决于 config.cudaSupport
useMetalKit使用 MetalKitApple ARM 上为 True
useMpi使用 MPI
useRocm使用 ROCm取决于 config.rocmSupport
useVulkan使用 Vulkan
enableCurl启用 Curl 支持True
enableStatic构建静态库取决于平台

来源:.devops/nix/package.nix21-43

Nix 输出

Nix Flake 产生多个输出

输出描述
默认默认 CPU 后端构建
vulkan构建 Vulkan 支持
windowsWindows 交叉编译构建
python-scriptsPython 脚本包
cuda构建 CUDA 支持
mpi-cpu构建 MPI 支持
rocm构建 ROCm 支持

来源: flake.nix157-172

持续集成

该项目使用 GitHub Actions,其中包含特定于作业的 CMake 配置和 ctest 执行。

CI 工作流程结构

来源: .github/workflows/build.yml1-25 .github/workflows/build.yml47-96 .github/workflows/build.yml157-209

CI 构建矩阵详细信息

CI 工作流程使用特定的 CMake 命令模式来处理不同的配置

macOS 构建

Ubuntu 后端构建

Windows 构建

每个作业都运行 ctest,带有标签: ctest -L 'main|curl' --verbose --timeout 900

来源: .github/workflows/build.yml47-56 .github/workflows/build.yml135-138 .github/workflows/build.yml832-840 .github/workflows/build.yml421-426 .github/workflows/build.yml665-666 .github/workflows/build.yml142-144

自定义构建

通用构建配方

以下是一些常见的构建场景

基本 CPU 构建

CUDA 构建

Metal 构建 (macOS)

AVX2 优化构建 (Intel/AMD)

特定架构的 CPU 构建

构建系统支持使用 ggml_add_cpu_backend_variant() 构建优化的变体

函数 ggml_add_cpu_backend_variant_impl() 用于创建专用后端库

变体名称特性目标函数调用
x64基础 x64ggml_add_cpu_backend_variant(x64)
sse42SSE42ggml_add_cpu_backend_variant(sse42, SSE42)
sandybridgeSSE42, AVXggml_add_cpu_backend_variant(sandybridge, SSE42, AVX)
haswellSSE42, AVX, F16C, AVX2, BMI2, FMAggml_add_cpu_backend_variant(haswell, SSE42, AVX, F16C, AVX2, BMI2, FMA)
skylakexSSE42, AVX, F16C, AVX2, BMI2, FMA, AVX512ggml_add_cpu_backend_variant(skylakex, SSE42, AVX, F16C, AVX2, BMI2, FMA, AVX512)
icelakeskylakex + AVX512_VBMI, AVX512_VNNIggml_add_cpu_backend_variant(icelake, ..., AVX512_VBMI, AVX512_VNNI)
alderlakeSSE42, AVX, F16C, AVX2, BMI2, FMA, AVX_VNNIggml_add_cpu_backend_variant(alderlake, ..., AVX_VNNI)
sapphirerapidsicelake + AVX512_BF16, AMX_TILE, AMX_INT8ggml_add_cpu_backend_variant(sapphirerapids, ..., AMX_TILE, AMX_INT8)

来源: ggml/src/CMakeLists.txt289-310 ggml/src/ggml-cpu/CMakeLists.txt1-8

交叉编译

构建系统支持交叉编译到不同的平台

从 Linux 交叉编译到 Windows

从 macOS 交叉编译到 iOS

来源: .github/workflows/build.yml607-707 .github/workflows/build.yml752-800

构建系统文件

构建系统配置分布在几个关键文件中

  1. 根 CMakeLists.txt - 主项目配置
  2. ggml/CMakeLists.txt - GGML 张量库配置
  3. ggml/src/CMakeLists.txt - GGML 源文件构建配置
  4. ggml/src/ggml-cpu/CMakeLists.txt - CPU 后端配置
  5. common/CMakeLists.txt - 通用库配置
  6. tests/CMakeLists.txt - 测试配置
  7. examples/server/CMakeLists.txt - 服务器配置
  8. flake.nix - Nix 构建系统入口点
  9. .github/workflows/build.yml - CI 构建工作流程

来源: ggml/CMakeLists.txt1-362 ggml/src/CMakeLists.txt1-343 ggml/src/ggml-cpu/CMakeLists.txt1-483 common/CMakeLists.txt1-145 tests/CMakeLists.txt1-161 examples/server/CMakeLists.txt1-51 flake.nix1-186 .github/workflows/build.yml1-1062

故障排除

常见问题

  1. 缺失的依赖项:确保您拥有所选后端所需的依赖项

    • CUDA:CUDA 工具包,cuBLAS
    • Metal:Xcode 开发者工具,Metal 头文件
    • Vulkan:Vulkan SDK,Vulkan 头文件
    • BLAS:OpenBLAS 或 Apple Accelerate
  2. CMake 配置问题:如果 CMake 找不到依赖项,您可能需要使用 CMake 变量手动指定其路径,例如

  3. 优化编译错误:如果使用特定架构优化进行构建导致编译错误,请尝试禁用它们

  4. 链接错误:使用多个后端进行构建时,请确保所有必需的库都可用。对于静态构建,请添加 -DLLAMA_STATIC=ON 以避免动态链接问题。

来源: .github/workflows/build.yml183-218 ggml/src/CMakeLists.txt69-88

特定平台说明

Windows

在 Windows 上,构建系统同时支持 MSVC 和 MinGW 编译器

macOS

在运行 Apple Silicon 的 macOS 上,Metal 默认启用

Linux (带 CUDA)

在带 CUDA 的 Linux 上,请指定架构能力

来源: .github/workflows/build.yml752-982 .github/workflows/build.yml183-218 .github/workflows/build.yml984-1017