谁说老显卡只能吃灰呀?我 2013 年的 NVIDIA GTX TITAN(Kepler 架构,6G 显存),2026 年依然可以流畅跑 4B 参数的本地大语言模型, 推理速度 >17 tokens/s。本文记录完整的踩坑过程。
项目 | 配置 |
|---|---|
GPU | NVIDIA GeForce GTX TITAN (GK110, compute 3.5, 6080 MiB) |
驱动 | 470.256.02 (最后一个支持 Kepler 的驱动分支) |
系统 CUDA Runtime | 11.4 |
CPU | Intel Xeon E3-1231 v3 @ 3.40GHz |
内存 | 7.2 GB |
OS | Ubuntu 26.04 LTS |
磁盘可用 | ~81 GB |
GTX TITAN :2013 年旗舰卡,Kepler 架构(GK110),算力 3.5(sm_35)。 NVIDIA 在 CUDA 12.0 起彻底移除了对 Kepler 架构GPU的支持,而本地 LLM 推理框架llama.cpp早就只能用 CUDA 12 +了。
直接上结论:使用三方大神适配的 babal35/llamacpp-kepler,是基于 llama.cpp,给 sm_35/sm_37(Tesla K80/K40/K20 以及 GTX TITAN 系列)打了补丁,让它在 CUDA 11.x 下重新可用。
关键约束:
为了避免污染系统(也不想去折腾 apt 装 gcc-10、去 NVIDIA 官网下 runfile),直接用 conda 建一个独立环境。好处:免 sudo、好删除、好复制。
最初的想法很简单,直接以下的命令:
mamba create -n llama-kepler -c nvidia -c conda-forge \
python=3.11 gcc=10.4.0 gxx=10.4.0 cmake \
cuda-toolkit=11.8.0 -y结果 nvcc --version 显示 11.8,但 conda list 一看——cuda-cudart 居然是 12.4。cuda-toolkit=11.8.0 这个 metapackage 不约束子包版本,conda-forge 的 12.x 包混了进来,环境变成了 nvcc 11.8 + 库12.4 的缝合怪。
于是我把 每一个 cuda-* 子包显式 pin 到 11.8:
mamba create -n llama-kepler -c nvidia -c conda-forge \
python=3.11 gcc=10.4.0 gxx=10.4.0 cmake \
cuda-nvcc=11.8.89 \
cuda-cudart=11.8.89 \
cuda-cudart-dev=11.8.89 \
cuda-cccl=11.8.89 \
cuda-nvrtc=11.8.89 \
cuda-nvrtc-dev=11.8.89 \
cuda-driver-dev=11.8.89 \
cuda-nvtx=11.8.86 \
cuda-nvml-dev=11.8.86 \
-y验证了下,没问题啦:
conda activate llama-kepler
conda list | grep cuda
# 所有 cuda-* 都应该是 11.8.x,channel 是 nvidia
nvcc --version # release 11.8, V11.8.89
gcc --version # 10.4.0cmake编译时遇到了 configure 报错:
CMake Error: Target "ggml-cuda" links to CUDA::cublas but the target was not found.CUDA::cublas 由 cuBLAS 提供,但 nvidia channel 上的包名不是 cuda-cublas,而是 libcublas。而且 11.8 对应的版本号是 11.8.1.74(不是 11.8.89):
mamba install -c nvidia -c conda-forge \
libcublas=11.8.1.74 libcublas-dev=11.8.1.74 -y(这个版本号是用 curl 直接拉 nvidia channel 的 repodata.json 查出来的,conda search 在国内网络下经常超时,无奈呀。。。)
国内直连 GitHub 很慢,而且容易 GnuTLS recv error。于是我用了 gh-proxy.com 镜像 + 浅克隆 + 强制 HTTP/1.1:
git -c http.version=HTTP/1.1 -c http.postBuffer=524288000 \
clone --depth 1 https://gh-proxy.com/https://github.com/babal35/llamacpp-kepler(如果是从 ZIP 下载的,解压后不是 git 仓库,cmake 会警告 "Git repository not found",不影响编译。)
Kepler 架构的GPU配置时必须关掉 CUDA Graphs(GGML_CUDA_GRAPHS=OFF),否则会报错,详细命令如下:
cd llamacpp-kepler
mkdir build && cd build
cmake .. \
-DGGML_CUDA=ON \
-DCMAKE_CUDA_ARCHITECTURES=35 \
-DGGML_CUDA_GRAPHS=OFF \
-DGGML_NATIVE=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DLLAMA_BUILD_TESTS=OFF \
-DCMAKE_EXE_LINKER_FLAGS="-Wl,-rpath-link,$CONDA_PREFIX/lib -Wl,-rpath,$CONDA_PREFIX/lib" \
-DCMAKE_SHARED_LINKER_FLAGS="-Wl,-rpath-link,$CONDA_PREFIX/lib -Wl,-rpath,$CONDA_PREFIX/lib" \
-DCMAKE_BUILD_RPATH="$CONDA_PREFIX/lib" \
-DCMAKE_INSTALL_RPATH="$CONDA_PREFIX/lib"我上面用的 -Wl,-rpath-link 参数看着啰嗦,但缺了它编译会失败,报一堆 undefined reference to cudaMalloc@libcudart.so.11.0 / SSL_CTX_new@OPENSSL_3.0.0 / GOMP_barrier@GOMP_1.0。
主要原因是:conda-forge 的 ld 默认不带 --copy-dt-needed-entries,链接可执行文件时不会自动把共享库的传递依赖(libcudart、libssl、libgomp)拉进来。-rpath-link 告诉 ld 去哪里找这些传递依赖。
(一开始我试过 --copy-dt-needed-entries,结果只是把 error 降级成 warning,链接还是失败。-rpath-link 才是正解。)
make -j$(nproc)我Xeon E3-1231 v3(4 核 8 线程)的CPU,编译花了大概 10 分钟,完成后程序在 build/bin/ 下:llama-cli、llama-server、llama-bench 等等。
验证 了下GPU 能成功识别:
./bin/llama-cli --list-devices
# ggml_cuda_init: found 1 CUDA devices (Total VRAM: 6080 MiB):
# Device 0: NVIDIA GeForce GTX TITAN, compute capability 3.5
# Available devices:
# CUDA0: NVIDIA GeForce GTX TITAN (6080 MiB, 5973 MiB free)由于咱6GB 显存是硬约束,也没法off-load到RAM。而且模型 + KV cache 都得塞进去。所以经验上以下模型较好:
模型 | 量化 | 文件大小 | 适配性 |
|---|---|---|---|
Qwen2.5-1.5B-Instruct | Q8_0 | ~1.6 GB | 富余,上下文可以拉很长 |
Qwen2.5-3B-Instruct | Q4_K_M | ~2 GB | 富余 |
Qwen3.5-4B | Q8_0 | 4.48 GB | 刚好(剩 ~876 MiB 给上下文) |
Qwen2.5-7B-Instruct | Q4_K_M | ~4.4 GB | 紧张,上下文受限 |
但是我还是决定用更新的模型, HauhauCS/Qwen3.5-4B-Uncensored-HauhauCS-Aggressive 的 Q8_0 版本(4.48 GB),Q8版本,保证模型效果。
因为国内 HuggingFace 也不稳,所以用 hf-mirror.com镜像进行:
mkdir -p ~/models && cd ~/models
curl -L --retry 3 --retry-delay 5 \
-o Qwen3.5-4B-Uncensored-Q8_0.gguf \
"https://hf-mirror.com/HauhauCS/Qwen3.5-4B-Uncensored-HauhauCS-Aggressive/resolve/main/Qwen3.5-4B-Uncensored-HauhauCS-Aggressive-Q8_0.gguf?download=true"就是比较简单的命令啦
conda activate llama-kepler
./build/bin/llama-cli \
-m ~/models/Qwen3.5-4B-Uncensored-Q8_0.gguf \
-p "1+1等于几?直接回答数字,不要思考过程。" \
-n 200 \
-ngl 99 \
--temp 0.3 \
--single-turn-ngl 99 表示把全部 99 层都卸载到 GPU。输出:
> 1+1等于几?直接回答数字,不要思考过程。
[Start thinking]
Thinking Process:
1. Analyze the Request: ...
2. Determine the Answer: 1 + 1 = 2.
3. Format the Output: Just "2".
4. Final Check: ...
5. Construct Output: 2
[End thinking]
2
[ Prompt: 31.1 t/s | Generation: 16.7 t/s ]看了下生成速度有 16.7 tokens/s,对一个 2013 年的卡来说相当能打。
显存占用(llama.cpp 自带的 breakdown):
| - CUDA0 (GTX TITAN) | 6080 = 876 free + (4932 = 4264 model + 178 context + 490 compute) + 271 |模型 4264 MiB + 上下文 178 MiB + 计算 490 MiB = 4932 MiB,还剩 876 MiB。不过一运行,GPU温度飙到96度了,也是无语了,问了下AI可能是硅脂干了或者灰太多,看了下灰还好,只能是前者了,不想折腾,就轻度用下吧!老的还是不行呀,特别是电子产品,可能许多洋垃圾也会面临这种情况呀!
如果手头也有吃灰的 Kepler 卡,不妨试试。整个环境装在一个 conda env 里,不要了 mamba env remove -n llama-kepler 一键清干净,系统干干净净。
环境:Ubuntu 26.04 + miniforge3 + conda env llama-kepler(CUDA 11.8.89 + gcc 10.4.0)+ llamacpp-kepler fork(commit b367989)