4.9 KiB
4.9 KiB
基于你的硬件配置(5800X + 16GB RAM + RTX 3070 扩容到 16GB 显存 + CUDA 13.0),下面是完整的针对性编译和运行方案。
第一步:环境准备
在编译前,确认 CUDA 环境变量已正确配置:
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
# 验证
nvcc --version
nvidia-smi
安装编译依赖:
sudo apt update
sudo apt install -y build-essential git cmake gcc g++ libcurl4-openssl-dev
第二步:针对性编译命令
RTX 3070 的 Compute Capability 为 8.6(sm_86),要锁定这个架构以避免编译浪费并获得最优内核 。 raw.githubusercontent
cd ~/llama.cpp
# 清理旧构建
rm -rf build
# 针对 RTX 3070 的极致优化编译
cmake -B build \
-DGGML_CUDA=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CUDA_ARCHITECTURES="86" \
-DGGML_CUDA_F16=ON \
-DGGML_CUDA_FA_ALL_QUANTS=ON \
-DGGML_NATIVE=ON \
-DCMAKE_C_COMPILER=gcc \
-DCMAKE_CXX_COMPILER=g++ \
-DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc
# 并行编译(5800X 16核全开)
cmake --build build --config Release -j$(nproc)
各编译参数说明:
| 参数 | 作用 |
|---|---|
-DCMAKE_CUDA_ARCHITECTURES="86" |
精准锁定 RTX 3070 架构,减少编译体积,避免 nvcc 警告 raw.githubusercontent |
-DGGML_CUDA_F16=ON |
启用半精度 FP16 加速 dequantization + mul mat 核,在 30 系显卡上明显提速 raw.githubusercontent |
-DGGML_CUDA_FA_ALL_QUANTS=ON |
编译所有 KV cache 量化类型的 FlashAttention CUDA 内核,配合 --ctk/--ctv 大幅节省显存扩展上下文 raw.githubusercontent |
-DGGML_NATIVE=ON |
针对本机 CPU(5800X Zen3)生成最优指令集(AVX2/FMA) |
第三步:验证 GPU 编译成功
~/llama.cpp/build/bin/llama-server --list-devices
# 应看到 CUDA0: NVIDIA GeForce RTX 3070
第四步:极致优化运行命令
你的 RTX 3070 已扩容到 16GB 显存,Qwen3-30B-A3B Q4_K_M 约 18GB,可以做到几乎全量 GPU 卸载配合少量 CPU offload 。 reddit
GGML_CUDA_DISABLE_GRAPHS=1 \
~/llama.cpp/build/bin/llama-server \
-m /root/models/Qwen3-30B-A3B-GGUF/Qwen3-30B-A3B-Q4_K_M.gguf \
--host 0.0.0.0 \
--port 8000 \
-ngl 40 \
-c 32768 \
-t 8 \
--flash-attn on \
-b 768 \
-ub 256 \
--mlock \
-ctk q8_0 \
-ctv q8_0 \
--parallel 1 \
--temp 0.6 \
--top-k 20 \
--top-p 0.95 \
--jinja \
-a "Qwen3-30B-A3B"
关键参数变更说明:
| 参数 | 原值 → 新值 | 原因 |
|---|---|---|
-c |
8192 → 32768 | 16GB 显存 + --ctk/ctv q8_0 KV cache 量化后可支持大上下文,Flash Attention 让长上下文 prompt 处理速度翻倍以上 reddit |
--mlock |
无 → 加入 | 将模型锁定在内存,防止系统换页,降低推理延迟 reddit |
--ctk q8_0 --ctv q8_0 |
无 → 加入 | KV cache 量化到 int8,节省约 50% KV 显存,换取更长上下文,对输出质量影响极小 reddit |
-ub 256 |
无 → 加入 | Micro-batch 大小,针对单 GPU 单并发优化 token 生成速度 |
-b 512 |
512 → 保留 | Batch size 对 prompt 处理速度有显著影响,512 适合 16GB 显存 |
第五步:内存/显存不足时的回退策略
如果模型 18GB > 16GB 显存导致 OOM,启用 Unified Memory 让系统 RAM 兜底(Linux 下):
export GGML_CUDA_ENABLE_UNIFIED_MEMORY=1
这允许显存溢出时自动 swap 到 16GB 系统内存,而不是直接崩溃 。同时可以适当降低 -ngl 值(如 -ngl 60)手动将部分层卸载到 CPU,由 5800X 的 8 核 16 线程承接。 raw.githubusercontent