
llama.cpp CUDA 后端环境搭建在 Fedora Toolbox 容器中安装 CUDA 并构建 GPU 加速推理【免费下载链接】llama.cppLLM inference in C/C项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp本文以 llama.cpp 仓库的 CUDA-FEDORA 指南 为主体完整讲解如何在 Fedora及支持 Toolbox 的其他发行版上通过 Fedora Toolbox 容器安装 NVIDIA CUDA 工具链、处理宿主机驱动透传问题并最终结合仓库源码说明如何用-DGGML_CUDAON编译出启用 CUDA 后端的 llama.cpp。读完后你将掌握Toolbox 环境的创建与 CUDA 仓库配置、libcuda.so.1两种场景下的驱动库安装策略含rpm --justdb技巧、环境变量配置与验证方法以及 CUDA 架构列表CMAKE_CUDA_ARCHITECTURES的底层选择逻辑。一、适用场景与前提条件该指南的目标是在一个Toolbox 容器中安装 NVIDIA CUDA用于编译和运行 llama.cpp 等 CUDA 程序。适用系统包括Fedora WorkstationFedora Atomic Desktops如 Silverblue、Kinoite 等不可变桌面Fedora Spins其他支持 Toolbox 的发行版包括Red Hat Enterprise Linux 8.5、Arch Linux、Ubuntu。构建文档对这条路线的定位是Atomic Desktops 用户的必要方案这些系统没有官方支持的 CUDA 软件包、宿主机不是 NVIDIA 官方受支持平台的必要方案例如使用较新的 Beta 版本发行版、以及希望保持宿主机干净的用户的便捷方案。开始之前的三项前提条件前提说明宿主机已安装 ToolboxFedora Silverblue与Fedora Workstation默认自带其他发行版需自行安装 toolbox 包宿主机已安装 NVIDIA 驱动与显卡运行 CUDA 程序如 llama.cpp需要宿主机能访问 NVIDIA 硬件Fedora 宿主可使用 RPM Fusion 仓库的 NVIDIA 驱动网络连通用于下载软件包指南以 Fedora 41 为基准NVIDIA 为 Fedora 41 提供了对应的 CUDA 仓库。指南同时强调一条重要建议推荐使用 Toolbox 环境防止与系统包管理器产生冲突。二、创建 Fedora Toolbox 环境使用 Fedora Toolbox 的意义在于可以在容器内以 root 权限安装任意软件包而完全不影响宿主机系统。指南还指出即使没有 Toolbox也可以使用 Podman 或 Docker 完成类似的事情。1. 创建 Fedora 41 的 Toolbox 容器toolbox create --image registry.fedoraproject.org/fedora-toolbox:41 --container fedora-toolbox-41-cuda2. 进入 Toolboxtoolbox enter --container fedora-toolbox-41-cuda进入容器后拥有 root 权限可以自由安装软件包。后续所有 CUDA 相关操作都在这个容器内执行。三、安装基础开发工具在容器内同步并安装编译 CUDA 程序所需的基础工具链1. 同步 DNF 包管理器sudo dnf distro-sync2. 可选安装 Vim 作为默认编辑器sudo dnf install vim-default-editor --allowerasing--allowerasing标志允许移除与nano-default-editor冲突的包。3. 安装开发工具组与 CMakesudo dnf install c-development development-tools cmake这会安装编译软件所需的gcc、make及其他开发头文件。llama.cpp 依赖 CMake 构建系统CUDA 后端则由nvcc参与编译这些都属于该工具组的覆盖范围。四、添加 NVIDIA CUDA 仓库将 NVIDIA 的 CUDA 仓库加入 DNF 配置以 Fedora 41 x86_64 为例sudo dnf config-manager addrepo --from-repofilehttps://developer.download.nvidia.com/compute/cuda/repos/fedora41/x86_64/cuda-fedora41.repo添加仓库后再次同步包管理器使新仓库的元数据生效sudo dnf distro-sync五、安装 NVIDIA 驱动库两种分支场景这是整个指南中最关键的一步。Toolbox 容器可能通过宿主机透传机制获得 NVIDIA 驱动库也可能没有——需要先探测ls -la /usr/lib64/libcuda.so.1场景 Alibcuda.so.1不存在ls: cannot access /usr/lib64/libcuda.so.1: No such file or directory说明宿主机没有把 CUDA 驱动透传进容器此时直接在容器内Guest安装驱动库sudo dnf install nvidia-driver-cuda nvidia-driver-libs nvidia-driver-cuda-libs nvidia-persistenced场景 Blibcuda.so.1已存在lrwxrwxrwx. 1 root root 21 Mar 24 11:26 /usr/lib64/libcuda.so.1 - libcuda.so.570.133.07说明宿主机正在向容器提供 CUDA 驱动。此时不能真正安装驱动包会与透传的文件冲突而要用--justdb技巧更新 Guest 的 RPM 数据库让容器以为这些包已安装1. 仅下载不安装这些由宿主机提供的nvidia-驱动包及其依赖sudo dnf download --destdir/tmp/nvidia-driver-libs --resolve --arch x86_64 nvidia-driver-cuda nvidia-driver-libs nvidia-driver-cuda-libs nvidia-persistenced2. 用--justdb更新 RPM 数据库标记这些包为已安装sudo rpm --install --verbose --hash --justdb /tmp/nvidia-driver-libs/*--justdb选项只更新 RPM 数据库不会触碰文件系统上的其他内容——这正是数据库层面打补丁的核心。3. 验证数据库更新是否成功——重新执行安装命令应当提示already installed且不做任何事sudo dnf install nvidia-driver-cuda nvidia-driver-libs nvidia-driver-cuda-libs nvidia-persistenced预期输出形如Updating and loading repositories: Repositories loaded. Package nvidia-driver-cuda-3:570.124.06-1.fc41.x86_64 is already installed. Package nvidia-driver-libs-3:570.124.06-1.fc41.x86_64 is already installed. Package nvidia-driver-cuda-libs-3:570.124.06-1.fc41.x86_64 is already installed. Package nvidia-persistenced-3:570.124.06-1.fc41.x86_64 is already installed. Nothing to do.这一技巧的实际价值在于CUDA 工具链包cuda元包依赖上述驱动包只有让 DNF 认为依赖已满足后续安装才不会试图覆盖宿主机透传的文件。六、安装 CUDA 元包驱动库就位后安装 CUDA 工具链本体sudo dnf install cudacuda是一个元包会连带安装 CUDA Toolkit 及相关软件包nvcc编译器、cuBLAS、CUDA 运行时库等安装位置默认为/usr/local/cuda。七、配置环境变量CUDA 二进制目录默认不在PATH中需要配置1. 创建 Profile 脚本sudo sh -c echo export PATH\$PATH:/usr/local/cuda/bin /etc/profile.d/cuda.sh两点说明写入/etc/profile.d/是因为容器的/etc/目录是该容器独有的不与宿主机或其他容器共享改动不会外溢$PATH前的反斜杠\确保变量被原样写入脚本而不是在echo时就被 shell 展开。2. 使脚本可执行sudo chmod x /etc/profile.d/cuda.sh3. 立即加载到当前会话source /etc/profile.d/cuda.shsource更新当前 shell 的PATH而/etc/profile.d/cuda.sh则保证今后所有登录会话自动获得 CUDA 路径。八、验证安装用 NVIDIA CUDA 编译器nvcc的版本输出确认工具链可用nvcc --version正常输出示例nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2025 NVIDIA Corporation Built on Fri_Feb_21_20:23:50_PST_2025 Cuda compilation tools, release 12.8, V12.8.93 Build cuda_12.8.r12.8/compiler.35583870_0输出中同时包含编译器可访问与具体版本号两个信息。九、用 CUDA 后端构建 llama.cppCUDA 环境就绪后即可按 构建文档编译 llama.cppcmake -B build -DGGML_CUDAON cmake --build build --config Release注意仓库根目录 CMakeLists.txt 中LLAMA_CUDA选项已标记为非推荐写法会打印告警并映射到GGML_CUDALLAMA_CUBLAS则直接报错应统一使用GGML_CUDA。CUDA 后端的核心 CMake 开关定义在 ggml/CMakeLists.txt选项默认值作用GGML_CUDAOFF启用 CUDA 后端GGML_CUDA_FAON编译 FlashAttention CUDA 内核GGML_CUDA_GRAPHS在 llama.cpp 顶层构建中为 ON使用 CUDA Graphs 降低内核启动开销GGML_CUDA_NCCLON使用 NCCL 多卡集合通信GGML_CUDA_FORCE_MMQ/GGML_CUDA_FORCE_CUBLASOFF强制使用 mmq 自定义矩阵乘内核 / cuBLASGGML_CUDA_PEER_MAX_BATCH_SIZE128多卡 peer access 的最大 batch sizeCUDA 架构列表CMAKE_CUDA_ARCHITECTURES的选择逻辑默认情况下llama.cpp 针对构建时连接的硬件编译native build。若要覆盖所有 CUDA GPU按 构建文档 关闭GGML_NATIVEcmake -B build -DGGML_CUDAON -DGGML_NATIVEOFF产物可在所有 CUDA GPU 上运行但可能需要运行时 JIT 编译。从源码结构看非 native 构建的架构列表由 ggml/src/ggml-cuda/CMakeLists.txt 按 CUDA 版本动态拼装CUDA 13 以下追加50-virtualMaxwell、61-virtualPascal、70-virtualV100所有版本追加75-virtual、80-virtual、86-realRTX 3000CUDA ≥ 11.8追加89-realRTX 4000、90-virtualHopperCUDA ≥ 12.8追加120a-realBlackwellCUDA ≥ 12.9追加121a-real。其中-virtual表示只编译为 PTX、首次运行时 JIT-real表示编译为目标架构的设备代码后缀a如120a是架构特定版本因为 Blackwell 的 FP4 张量核心指令不向前兼容。如果nvcc无法检测 GPU出现nvcc warning : Cannot find valid GPU for -archnative可以显式指定架构例如同时覆盖 8.6 与 8.9cmake -B build -DGGML_CUDAON -DCMAKE_CUDA_ARCHITECTURES86;89若系统上安装了多个 CUDA 版本、需指定其中一个例如/opt/cuda-11.7可通过CMAKE_CUDA_COMPILER与 RPATH 覆盖cmake -B build -DGGML_CUDAON -DCMAKE_CUDA_COMPILER/opt/cuda-11.7/bin/nvcc -DCMAKE_INSTALL_RPATH/opt/cuda-11.7/lib64;\$ORIGIN -DCMAKE_BUILD_WITH_INSTALL_RPATHON运行时的相关环境变量在容器内运行 llama.cpp 时构建文档还列出了几个常用运行期开关CUDA_VISIBLE_DEVICES-0隐藏指定计算设备CUDA_SCALE_LAUNCH_QUEUES4x扩大 CUDA 命令缓冲区对多卡流水并行下的 prompt 处理吞吐有帮助GGML_CUDA_CUBLAS_COMPUTE_TYPE覆盖 cuBLAS 默认计算类型auto/f16/bf16/f32等GGML_CUDA_ENABLE_UNIFIED_MEMORY1在 Linux 上启用统一内存VRAM 耗尽时可回退到系统内存而非崩溃GGML_CUDA_P2P在多 GPU 间启用 peer-to-peer 直接传输需驱动支持个别主板/BIOS 组合下可能不稳定。十、故障排查指南给出的三类典型问题与处理办法1. 安装失败仔细阅读错误信息通常指向日志中的冲突文件或缺失依赖手工安装 RPM 遇到文件冲突时可用rpm的--excludepath选项排除冲突文件。2. 宿主机驱动透传异常有时 NVIDIA 驱动的宿主透传存在 bug例如缺少某个共享库重启容器可以解决# 在宿主系统上执行 podman container restart --all3. 环境变量未生效若安装后nvcc找不到先检查PATHecho $PATH确认包含/usr/local/cuda/bin然后重新source /etc/profile.d/cuda.sh或打开新的终端会话。十一、后续维护与注意事项CUDA 更新关注 NVIDIA 官方仓库中对应 Fedora 版本的更新新仓库可用时同步调整dnf的仓库配置。Toolbox 的隔离边界容器内的系统文件与配置和宿主机相互独立但用户主目录默认在宿主与 Toolbox 之间共享——因此指南特别提醒手动安装和修改系统包可能导致容器不稳定步骤仅供参考需按具体系统调整重大系统变更前务必备份重要数据因为 home 目录可写且与宿主共享。构建 llama.cpp 的衔接完成上述环境后只需在容器内克隆 llama.cpp 源码git clone仓库地址执行-DGGML_CUDAON的 CMake 构建并确保 CUDA 相关构建标志与路径如CMAKE_CUDA_ARCHITECTURES、CMAKE_CUDA_COMPILER在构建配置中设置正确即可。十二、小结整套流程可以归纳为一条清晰的主线Toolbox 提供隔离环境 → DNF 安装工具链 → 添加 NVIDIA 官方 Fedora 41 CUDA 仓库 → 探测libcuda.so.1决定真实安装还是--justdb更新数据库 →dnf install cuda安装工具链 →/etc/profile.d配置PATH→nvcc --version验证 →cmake -B build -DGGML_CUDAON编译 llama.cpp。其中最有工程价值的部分是rpm --install --justdb的技巧它让容器包管理器相信宿主机透传的驱动已安装从而在不触碰真实文件的前提下满足 CUDA 工具链的依赖检查这是容器化 GPU 环境中相当有复用价值的模式。【免费下载链接】llama.cppLLM inference in C/C项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考