背景:需要在完全离线的国产 Linux(老版本 glibc)服务器上完成 llama.cpp CUDA 版本编译。
限制条件:1. 无 root 权限 2. 无 yum/apt 3. 无在线下载。
坑1:系统 GCC 版本过低
解决方案:使用 conda-forge 构建 GCC11 环境,通过 conda-pack 打包后在离线服务器使用
conda create -n gcc11 gcc=11 gxx=11
conda-pack 打包后解压使用
注意点:需要显式指定编译器,否则 CMake 可能仍使用系统 gcc
export CC=$CONDA_PREFIX/bin/x86_64-conda-linux-gnu-gcc
export CXX=$CONDA_PREFIX/bin/x86_64-conda-linux-gnu-g++
坑2:libcuda.so.1 找不到
本质:不是驱动损坏或 CUDA 未安装,而是 CUDA 链接阶段缺少 -lcuda 对应的开发库
解决方案:使用 CUDA Toolkit 中的 stub 库进行链接阶段补全
/usr/local/cuda/lib64/stubs/libcuda.so
配置方式:
export LIBRARY_PATH=/usr/local/cuda/lib64/stubs:$LIBRARY_PATH
说明:该方式仅用于编译链接阶段,不参与运行时加载,运行时仍依赖系统 NVIDIA driver
坑3:GLIBC 版本不满足
错误处理建议:不要尝试升级系统 glibc、不要替换 /lib64/libc.so,这类操作风险极高,可能导致系统直接不可用
解决方案:使用 conda 提供的用户态动态链接器绕过系统 glibc
$CONDA_ENV/lib/ld-linux-x86-64.so.2 --library-path $CONDA_ENV/lib ./llama-server
原理说明:不是替换系统 glibc,而是直接使用 conda 的 ELF interpreter 启动程序,使程序运行在 conda 用户态运行时环境中
整体方案如下:
GCC11(Conda toolchain)
CUDA stubs(解决 libcuda 链接问题)
Conda glibc runtime(解决运行时兼容问题)
最终在完全离线国产服务器环境中成功编译并运行 llama.cpp CUDA 版本。
1 个帖子 - 1 位参与者