引言
我曾在一台Debian10的旧机器上,编译安装了python3.10,然后再试图安装llama-cpp-python组件时,由于系统自带GCC版本过低,导致编译出错。系统apt源头没有更新的GCC版本提供,如果重新编译安装新版本GCC编译器,比较耗时繁琐,且担心可能引发系统稳定性问题。本文将介绍一种简单的处理方式。
错误复现
当直接使用pip安装llama-cpp-python时,需要编译wheels,提示error
pip3.10 install llama-cpp-python
具体原因,是一些函数/定义没有找到实现,这些应该是在gcc编译的头文件中实现的,但由于GCC版本太旧,所以没有这些实现 In file included from /tmp/pip-install-tr_p9wfs/llama-cpp-python_3e0a81d9074142cf9759cecc2d8049fd/vendor/llama.cpp/ggml/src/ggml-cpu/ggml-cpu-quants.c:7: /tmp/pip-install-tr_p9wfs/llama-cpp-python_3e0a81d9074142cf9759cecc2d8049fd/vendor/llama.cpp/ggml/src/ggml-cpu/ggml-cpu-quants.c: In function ‘ggml_vec_dot_q3_K_q8_K’: /tmp/pip-install-tr_p9wfs/llama-cpp-python_3e0a81d9074142cf9759cecc2d8049fd/vendor/llama.cpp/ggml/src/ggml-cpu/ggml-cpu-impl.h:315:27: error: implicit declaration of function ‘vld1q_s8_x4’; did you mean ‘vld1q_s8_x2’? [-Werror=implicit-function-declaration]#define ggml_vld1q_s8_x4 vld1q_s8_x4 ^~~~~~~~~~~ /tmp/pip-install-tr_p9wfs/llama-cpp-python_3e0a81d9074142cf9759cecc2d8049fd/vendor/llama.cpp/ggml/src/ggml-cpu/ggml-cpu-quants.c:5731:48: note: in expansion of macro ‘ggml_vld1q_s8_x4’ const ggml_int8x16x4_t q8bytes_1 = ggml_vld1q_s8_x4(q8); q8 += 64; ^~~~~~~~~~~~~~~~
原因探索
这个issue给出了一些提示,需要升级GCC至少到8.5版本
https://github.com/ggml-org/llama.cpp/issues/3880
查询我当前系统的GCC版本,确实比较低为8.3.0版本
GCC版本历史,及发布时间线,可以从如下网址获取。
https://gcc.gnu.org/releases.html
需要注意,并不是GCC9一定比GCC8版本要新。
解决方法
1.下载预编译的gcc bin文件
https://sourceforge.net/projects/gcc-precompiled/files/
下载gcc-aarch64-linux-8.5.0.tar.gz
2.建立目录并解压
mkdir gcc-aarch64-linux-8.5.0tar -zvxf gcc-aarch64-linux-8.5.0.tar.gz -C gcc-aarch64-linux-8.5.0/
注意:不要直接解压到当前目录,否则散落一地
3.检验版本
4.指定编译器路径
export CC=/home/linaro/gcc-aarch64-linux-8.5.0/bin/gccexport CXX=/home/linaro/gcc-aarch64-linux-8.5.0/bin/g++
5.下达安装指令
pip3.10 install llama-cpp-python
成功安装
小结
本文介绍了一种指定GCC版本编译器,编译安装llama-cpp-python的方法。该方法同样适用于其它需要指定GCC版本进行编译的组件,在不更新系统GCC版本的情况下实现编译安装。