你说的那个 llama cpu 这个参数根本就不存在。然后我尝试使用 help variable list 以及 help property list help command list,就是 cmake 使用这些 list 的通通输出都是没有。我要怎么去查找这个 llama 点 cpp 它这个可用的这些参数啊,这个 cmake 去配置的这些 variable 啊之类的。
Hugging Face SSH 配置验证与修正
导出时间:2026/5/27 19:49:47
来源地址:https://www.doubao.com/chat/38415490289930754
消息数量:4
已完成思考
用户现在想知道怎么查找 llama.cpp 的 CMake 可用参数,之前我提到的 LLAMA_CPU 参数不存在,所以需要正确的方法来获取这些信息。首先,CMake 本身有查看缓存变量的命令,另外 llama.cpp 的源码里应该有 CMakeLists.txt,里面定义了这些选项。
首先,最直接的方法是在 llama.cpp 的构建目录下,用 cmake -LAH 命令,这个命令可以列出所有缓存的变量,包括帮助信息。另外,也可以直接查看项目根目录下的 CMakeLists.txt,里面会有 option () 命令定义的编译选项,比如 LLAMA_CUDA、LLAMA_METAL、LLAMA_BLAS 等。
然后,用户之前用 help variable list 等命令没输出,可能是因为没有在正确的目录下运行,或者没有先运行 cmake 配置。所以需要先进入构建目录,运行 cmake .. 配置后,再用 cmake -LAH 来查看。
另外,llama.cpp 的官方文档或者 README 里也会有编译选项的说明,也可以通过搜索项目里的 CMakeLists.txt 文件,找到所有的 option 定义。
现在需要把这些方法整理清楚,告诉用户具体的步骤:
- 进入构建目录,先运行 cmake 配置,然后用 cmake -LAH 查看所有变量和帮助。
- 直接查看 CMakeLists.txt 文件,搜索 option 命令,找到可用的编译选项。
- 查看项目的 README 或官方文档,里面会有详细的编译选项说明。
还要纠正之前的错误,比如 LLAMA_CPU 可能不是正确的选项,正确的选项可能是 LLAMA_CUDA、LLAMA_METAL 等,默认是 CPU 后端,所以如果要禁用其他后端,只需要关闭 CUDA 和 METAL 等选项。
现在组织语言,分步骤说明,让用户能一步步操作,找到正确的 CMake 参数。
你这个问题问到点子上了!在
llama.cpp 里,CMake 选项确实不是靠 LLAMA_CPU 这种方式来 “启用 CPU”,而是通过禁用其他后端(比如 CUDA、Metal)来让它默认使用 CPU。要找到所有可用的编译选项,有几个非常可靠的方法:1. 用 CMake 命令直接列出所有选项(最权威)
这是最准确的方法,因为它直接读取项目的 CMake 配置:
bash
运行
# 1. 进入你的构建目录(如果还没有,先创建并配置)
cd /home/nick/workspace/llama.cpp
mkdir -p build && cd build
# 2. 先运行一次 cmake 配置(这一步会生成缓存)
cmake ..
# 3. 列出所有缓存的变量及其帮助信息
cmake -LAH ..
这个命令会输出所有可用的 CMake 变量,包括:
- 每个变量的当前值
- 变量的类型(BOOL、PATH 等)
- 一段简短的帮助说明
你可以重点关注以
LLAMA_ 开头的变量,比如:plaintext
LLAMA_CUDA:BOOL=OFF
LLAMA_METAL:BOOL=OFF
LLAMA_BLAS:BOOL=OFF
LLAMA_OPENBLAS:BOOL=OFF
LLAMA_CLBLAST:BOOL=OFF
这些就是控制不同后端的开关。
2. 直接查看项目的 CMakeLists.txt(最彻底)
所有编译选项最终都定义在源码的
CMakeLists.txt 文件里,你可以直接搜索:bash
运行
# 在 llama.cpp 根目录下,搜索所有 option 定义
grep -r "option(" ./CMakeLists.txt
你会看到类似这样的输出,这就是所有可用的编译开关:
cmake
option(LLAMA_CUDA "llama: enable CUDA" OFF)
option(LLAMA_METAL "llama: enable Metal" OFF)
option(LLAMA_BLAS "llama: use BLAS" OFF)
option(LLAMA_OPENBLAS "llama: use OpenBLAS" OFF)
option(LLAMA_CLBLAST "llama: use CLBlast" OFF)
option(LLAMA_HIPBLAS "llama: use hipBLAS" OFF)
option(LLAMA_ACCELERATE "llama: enable accelerate framework" OFF)
...
3. 查看官方文档或 README(最省心)
llama.cpp 的官方 README 里有非常详细的编译选项说明,你可以直接在 GitHub 上查看,或者在本地打开:bash
运行
# 在项目根目录下
less README.md
在 README 里搜索 “Building” 或 “Compile options”,就能找到官方推荐的编译参数,比如:
bash
运行
# 仅编译 CPU 版本
cmake .. -DLLAMA_CUDA=OFF -DLLAMA_METAL=OFF
# 编译支持 CUDA 的版本
cmake .. -DLLAMA_CUDA=ON
回到你的问题:如何强制只使用 CPU?
既然没有
LLAMA_CPU 这个选项,你只需要禁用所有其他后端,llama.cpp 就会自动回退到纯 CPU 模式:bash
运行
cmake .. \
-DLLAMA_CUDA=OFF \
-DLLAMA_METAL=OFF \
-DLLAMA_BLAS=OFF \
-DLLAMA_OPENBLAS=OFF \
-DLLAMA_CLBLAST=OFF \
-DLLAMA_HIPBLAS=OFF \
-DLLAMA_ACCELERATE=OFF
这样编译出来的二进制文件,就只会使用 CPU 后端,不会再尝试加载其他动态库了。
要不要我帮你把这些纯 CPU 编译选项整理成一个一键配置脚本,你下次直接运行就能生成纯 CPU 版本?
为什么总是报错,说 fail to find ggl back end in it, 在这个动态库里面。然后 available devices 又不存在, register back end 是 CPU。 是不是我之前有去设置强制它使用 GPU 呢,而不使用 CPU 呢?我不知道这个有没有什么环境变量之类的,我去设置过,会不会呢?我
已完成思考
用户现在遇到的问题是运行 llama-embedding 时,报错 “failed to find ggml_backend_init in /home/nick/workspace/llama.cpp/master_build/bin/libggml-cpu.so”,并且 available devices 为空,虽然注册了 CPU 后端。首先需要分析这个错误的原因,可能的点包括:
- 编译选项问题:编译 llama.cpp 时是否正确启用了 CPU 后端,或者是否有其他后端(如 CUDA、Metal)被优先选择但编译失败?
- 动态库加载问题:libggml-cpu.so 是否存在,或者是否有版本不兼容、符号缺失的情况?
- 环境变量干扰:是否设置了 LLAMA_CUDA、LLAMA_METAL 等环境变量,强制使用 GPU 后端,但当前编译的版本不支持?
- 构建目录或库路径问题:是否在错误的目录下运行,或者 LD_LIBRARY_PATH 没有包含当前目录?
首先,先确认报错的核心:找不到 ggml_backend_init 符号,这说明 libggml-cpu.so 这个库文件里没有这个函数,或者加载时找不到。可能的原因是编译时没有正确生成这个库,或者库的版本不对。
然后,检查 available devices 为空,虽然注册了 CPU 设备,但加载失败,所以可用设备为空。这说明 CPU 后端的初始化失败了。
接下来,考虑用户提到的是否设置过强制使用 GPU 的环境变量。比如 LLAMA_CUDA=1,如果设置了这个,llama.cpp 会尝试加载 CUDA 后端,但如果编译时没有启用 CUDA,或者 CUDA 环境有问题,就会失败,同时可能影响 CPU 后端的加载?或者如果设置了 LLAMA_BACKEND 之类的变量,指定了后端,但那个后端不存在?
然后,解决步骤应该分几步:
-
检查当前是否有相关的环境变量设置:比如用 env | grep LLAMA_,看看有没有 LLAMA_CUDA、LLAMA_METAL、LLAMA_BACKEND 等变量。如果有,先 unset 掉,避免干扰。
-
检查编译选项:重新编译 llama.cpp,确保正确启用 CPU 后端,并且没有错误。比如编译时用的命令是否正确,比如 cmake 是否指定了 - DLLAMA_CPU=ON(默认应该是启用的,但可能被覆盖了),或者是否有其他选项导致 CPU 后端没有被正确编译。
-
检查动态库文件:确认 libggml-cpu.so 存在,并且用 nm 命令查看是否有 ggml_backend_init 这个符号。比如 nm libggml-cpu.so | grep ggml_backend_init,如果没有,说明编译有问题,需要重新编译。
-
运行时的库路径:确保运行时能正确加载 libggml-cpu.so。可以用 ldd ./llama-embedding 查看依赖的库,看看是否能找到 libggml-cpu.so。如果找不到,需要设置 LD_LIBRARY_PATH=.(当前目录),或者把库路径添加到系统路径。
现在,先整理这些思路,然后给出具体的解决步骤:
首先,检查环境变量:
运行
env | grep LLAMA_,看看有没有类似 LLAMA_CUDA、LLAMA_METAL、LLAMA_BACKEND 的变量。如果有,比如:LLAMA_CUDA=1
LLAMA_BACKEND=cuda
这些会强制 llama.cpp 尝试使用 CUDA 后端,但如果编译时没有启用 CUDA,或者 CUDA 不可用,就会失败,同时可能导致 CPU 后端也无法正常加载。这时候需要 unset 这些变量:
unset LLAMA_CUDA
unset LLAMA_METAL
unset LLAMA_BACKEND
然后,重新运行./llama-embedding --list-devices,看看是否能正常加载 CPU 后端。
如果还是不行,检查编译选项。重新编译 llama.cpp,确保启用 CPU 后端:
进入 llama.cpp 的源码目录,比如~/workspace/llama.cpp,然后:
rm -rf master_build # 清理之前的构建目录
mkdir -p master_build && cd master_build
cmake .. -DLLAMA_CPU=ON # 明确启用 CPU 后端,默认应该是 ON,但可以显式指定
make -j$(nproc)
编译完成后,进入 bin 目录,运行 ldd ./llama-embedding,检查依赖的库:
ldd ./llama-embedding
看看 libggml-cpu.so 是否被正确找到,并且没有缺失。如果显示 “not found”,需要设置 LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
然后再运行./llama-embedding --list-devices。
另外,检查 libggml-cpu.so 中的符号:
nm libggml-cpu.so | grep ggml_backend_init
如果没有输出,说明这个库没有正确编译,需要重新检查 cmake 的选项,或者是否有编译错误。
还有一种可能是,编译时选择了其他后端(比如 CUDA),但那个后端的库没有生成,导致整个后端系统初始化失败。这时候需要确保编译时只启用 CPU 后端,或者正确启用其他后端。
总结步骤:
- 清理 LLAMA_相关的环境变量。
- 重新编译 llama.cpp,显式启用 CPU 后端。
- 检查动态库的依赖和符号。
- 确保运行时能正确加载库文件。
你这个报错的核心是:llama.cpp 在运行时找不到
ggml_backend_init 这个符号,导致 CPU 后端初始化失败,这和你是否强制过 GPU 关系不大,更可能是编译配置或动态库加载的问题。我们一步步排查:1. 先排查环境变量干扰
你担心之前设置过强制 GPU 的环境变量,这很可能是原因之一。先检查并清理:
bash
运行
# 查看所有 LLAMA_ 开头的环境变量
env | grep LLAMA_
# 如果有类似下面的变量,先 unset 掉
unset LLAMA_CUDA
unset LLAMA_METAL
unset LLAMA_BACKEND
unset LLAMA_ARG_BACKEND_SAMPLING
这些变量会强制 llama.cpp 尝试加载特定后端(如 CUDA),如果编译时没启用对应后端,就会初始化失败,甚至连 CPU 后端都受影响。
2. 检查动态库是否正常
报错里提到
libggml-cpu.so 里找不到 ggml_backend_init,说明这个库文件可能有问题:bash
运行
# 进入你的 bin 目录
cd /home/nick/workspace/llama.cpp/master_build/bin
# 1. 检查库文件是否存在
ls -l libggml-cpu.so
# 2. 检查库中是否包含 ggml_backend_init 符号
nm libggml-cpu.so | grep ggml_backend_init
# 3. 检查可执行文件依赖的库
ldd ./llama-embedding
- 如果
nm没有输出,说明库文件编译不完整,需要重新编译。 - 如果
ldd显示libggml-cpu.so是not found,需要设置库路径:bash运行export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
3. 重新编译,确保 CPU 后端正确生成
最稳妥的方式是清理并重新编译,显式启用 CPU 后端:
bash
运行
# 回到 llama.cpp 源码根目录
cd /home/nick/workspace/llama.cpp
# 清理之前的构建目录
rm -rf master_build
mkdir -p master_build && cd master_build
# 配置 CMake,显式启用 CPU 后端(默认就是 ON,但显式指定更保险)
cmake .. -DLLAMA_CPU=ON -DLLAMA_CUDA=OFF -DLLAMA_METAL=OFF
# 编译(-j 后面跟 CPU 核心数,比如你的 i9-13900HX 可以用 -j16)
make -j16
编译完成后,再进入
bin 目录测试:bash
运行
cd bin
./llama-embedding --list-devices
如果正常,应该会显示:
plaintext
Available devices:
[ 0 ] CPU
4. 为什么会出现这种情况?
- 之前的编译可能启用了 GPU 后端(如 CUDA),但你的环境不支持,导致整个后端系统初始化失败。
- 动态库路径没有正确设置,导致运行时找不到
libggml-cpu.so。 - 构建目录被污染,残留了旧的库文件,导致符号不匹配。
总结解决步骤
- 清理环境变量:
unset所有LLAMA_开头的强制后端变量。 - 重新编译:用
cmake -DLLAMA_CPU=ON显式启用 CPU 后端,避免 GPU 干扰。 - 检查库依赖:用
ldd和nm确认libggml-cpu.so正常,必要时设置LD_LIBRARY_PATH。
如果重新编译后还是报错,我们可以再深入排查 CMake 的详细日志,看看是不是编译过程中漏掉了什么关键模块。需要我帮你分析一下 CMake 输出的配置日志吗?