麒麟 V10 x86_64 GCC‑9.4.0 + cmake‑3.28.3 + llama.cpp + Qwen3‑4B
系统说明:麒麟 V10 (Lance) ,自带 gcc 4.8.5 版本过低,无法编译新版 llama.cpp,必须升级到 gcc‑9.4.0 作为编译 & 运行时工具链;本部署为纯 CPU 推理,使用
llama‑server提供 OpenAI 兼容 HTTP 接口,systemd 托管后台服务。 版本:llama.cpp b10729,模型:Qwen3‑4B‑Instruct‑2507‑Q4_K_M.gguf
一、硬件资源参考
表格
| 项目 | 要求 |
|---|---|
| CPU | x86_64,推荐 8 核及以上 |
| 内存 | ≥10GB;内存紧张改用--load‑mode mmap |
| 磁盘 | 模型文件约 2.7GB,预留足够空间 |
二、前置依赖准备
2.1 安装 cmake‑3.28.3(x86_64,麒麟 V10)
cd /data/tangdou/llama
wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-x86_64.tar.gz
tar -zxvf cmake-3.28.3-linux-x86_64.tar.gz -C /usr/local/
# 把新版cmake的bin目录加到PATH最前面,会话临时生效
export PATH=/usr/local/cmake-3.28.3-linux-x86_64/bin:$PATH
# 验证版本,此时必须输出3.28.3
cmake --version系统自带 cmake 版本够用,如版本过低,离线编译 cmake 3.20+。
2.2 升级成 GCC‑9.4.0(最关键步骤)
麒麟 V10 原生 gcc4.8.5 C++ 语法不支持 llama.cpp,编译出来二进制会直接段错误。
- 编译安装路径:
/usr/local/gcc94 - 编译时使用 gcc9.4 编译器;运行时必须加载 gcc9.4 的 lib64 库,否则报
GLIBCXX_3.4.26找不到。
编译完成后两个关键环境变量:
# 编译阶段用
export CC=/usr/local/gcc94/bin/gcc
export CXX=/usr/local/gcc94/bin/g++
# 运行阶段动态库
export LD_LIBRARY_PATH=/usr/local/gcc94/lib64systemd 服务文件中必须配置
LD_LIBRARY_PATH=/usr/local/gcc94/lib64,否则启动直接崩溃。
三、编译 llama.cpp b10729
cd /data/tangdou/llama/llama.cpp-b10729
rm -rf build
mkdir build
cd build
# 强制把新版cmake放PATH头部
export PATH=/usr/local/cmake-3.28.3-linux-x86_64/bin:$PATH
export CC=/usr/local/gcc94/bin/gcc
export CXX=/usr/local/gcc94/bin/g++
cmake \
-DCMAKE_C_COMPILER=${CC} \
-DCMAKE_CXX_COMPILER=${CXX} \
-DCMAKE_CXX_FLAGS="-O3 -mavx2" \
-DCMAKE_EXE_LINKER_FLAGS="-Wl,-rpath=/usr/local/gcc94/lib64" \
-DLLAMA_NATIVE=OFF \
-DLLAMA_AVX2=ON \
..
make -j$(nproc)编译输出产物:build/bin/llama‑server
四、模型准备
把 Qwen3‑4B‑Instruct‑2507‑Q4_K_M.gguf 放置到固定路径,示例: /data/tangdou/llm/Qwen3-4B-Instruct-2507-Q4_K_M.gguf
五、llama‑server 参数说明(b10729,避坑重点)
⚠️网上大量旧文档参数已废弃,不要直接复制。
废弃参数对照表
表格
| 旧错误参数 | b10729 正确参数 | 说明 |
|---|---|---|
--no‑mmap | --load‑mode none | 完整读入内存,不 mmap 映射 |
--mmap | --load‑mode mmap | mmap 按需加载,降低物理内存占用 |
--max‑seq‑len | --ctx‑size | 总上下文池大小,替代旧的‑c |
--max‑batch | --batch‑size / --ubatch‑size | 逻辑批、物理批大小 |
--numa(无参) | 删除;多 NUMA 用--numa distribute | 单节点服务器不要加 |
核心机制重点
--ctx‑size 代表全局上下文池总 token 数,会被--parallel并发槽均分:
--ctx‑size 8192 --parallel 4→ 每个会话可用上下文 = 2048- 长文档问答、RAG 场景:
--parallel 1 --ctx‑size 8192,单会话完整 8k 上下文 - 多短对话场景:接受单会话 2048 上下文,可以调高 parallel
推荐两套启动参数
方案 1:长文本 / RAG 优先(单并发,完整 8192 上下文,推荐业务使用)
export LD_LIBRARY_PATH=/usr/local/gcc94/lib64
./bin/llama-server \
-m /data/tangdou/llm/Qwen3-4B-Instruct-2507-Q4_K_M.gguf \
--ctx-size 8192 \
--host 0.0.0.0 \
--port 8080 \
--threads 8 \
--threads-batch 12 \
--batch-size 2048 \
--ubatch-size 512 \
--parallel 1 \
--cache-type-k q4_0 \
--cache-type-v q4_0 \
--load-mode none \
--metrics方案 2:多短对话优先(4 并发,单会话 2048 上下文)
export LD_LIBRARY_PATH=/usr/local/gcc94/lib64
./bin/llama-server \
-m /data/tangdou/llm/Qwen3-4B-Instruct-2507-Q4_K_M.gguf \
--ctx-size 8192 \
--host 0.0.0.0 \
--port 8080 \
--threads 8 \
--threads-batch 12 \
--batch-size 2048 \
--ubatch-size 512 \
--parallel 4 \
--cache-type-k q4_0 \
--cache-type-v q4_0 \
--load-mode none \
--metrics内存不足场景:把
--load‑mode none替换为--load‑mode mmap。 对外网暴露:增加--api‑key "sk_自定义密钥",消除 CORS 安全告警。
日志关键判断
model loaded+listening on http://0.0.0.0:8080:服务就绪。initializing, n_slots = X, n_ctx_slot = Y:Y 为单会话实际上下文窗口。control‑looking token: 128247 '</s>':Qwen3 GGUF 元数据警告,忽略,不影响推理。
六、systemd 生产托管(麒麟 V10)
文件路径:/etc/systemd/system/llama-qwen3.service
注意:必须带上 gcc9.4 运行时库环境变量,否则启动失败。
[Unit]
Description=Llama.cpp Qwen3‑4B‑Instruct CPU Service
After=network.target
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/data/tangdou/llama/llama.cpp-b10729/build
# 麒麟V10关键:gcc‑9.4.0运行时库路径
Environment="LD_LIBRARY_PATH=/usr/local/gcc94/lib64"
LimitNOFILE=65535
LimitMEMLOCK=infinity
ExecStart=/data/tangdou/llama/llama.cpp-b10729/build/bin/llama-server \
-m /data/tangdou/llm/Qwen3-4B-Instruct-2507-Q4_K_M.gguf \
--ctx-size 8192 \
--host 0.0.0.0 \
--port 8080 \
--threads 8 \
--threads-batch 12 \
--batch-size 2048 \
--ubatch-size 512 \
--parallel 1 \
--cache-type-k q4_0 \
--cache-type-v q4_0 \
--load-mode none \
--metrics
StandardOutput=journal+console
StandardError=journal+console
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target生效命令:
systemctl daemon-reload
systemctl enable llama-qwen3.service
systemctl start llama-qwen3.service
systemctl status llama-qwen3.service七、接口验证 & 运维命令
curl 调用示例(OpenAI 兼容接口)
curl http://127.0.0.1:8080/v1/chat/completions \
-H "Content-Type:application/json" \
-d '{
"model":"qwen3‑4b",
"messages":[{"role":"user","content":"你好"}],
"temperature":0.7,
"max_tokens":256
}'返回 json 中timings字段看性能:
prompt_per_second:输入预填充速度predicted_per_second:生成 token 速度;8 核 CPU 预期 8‑12 t/s。
日常运维
# 实时日志
journalctl -u llama-qwen3.service -f
# 查看端口监听
ss -tlnp | grep 8080
# metrics监控指标
curl http://127.0.0.1:8080/metrics
# 健康探测
curl http://127.0.0.1:8080/health
# 重启服务
systemctl restart llama-qwen3.service
# 查看上下文分配
journalctl -u llama-qwen3.service | grep initializingPython 调用示例
from openai import OpenAI
client = OpenAI(
base_url="http://127.0.0.1:8080/v1",
api_key="dummy"
)
resp = client.chat.completions.create(
model="qwen3‑4b",
messages=[{"role":"user","content":"简单介绍麒麟操作系统"}],
temperature=0.7,
max_tokens=512
)
print(resp.choices[0].message.content)八、麒麟 V10 (Lance) 踩坑汇总
- GLIBCXX 版本缺失:编译和运行都必须使用 gcc‑9.4.0,systemd 中
LD_LIBRARY_PATH不能省略。 - 参数报错:新版本大量参数改名,不要复制网上旧教程,使用
./bin/llama‑server -h查看本机支持参数。 - 上下文不足:
--parallel会均分总 ctx‑size,长文本业务降低 parallel 数值。 - 内存 OOM:改为
--load‑mode mmap按需加载模型,降低物理内存占用。 - 安全风险:内网部署 CORS 警告可忽略;对公网暴露必须配置
--api‑key。 - 防火墙:如需外部访问 8080 端口,需要 firewalld 放行端口。
九、性能调优建议
--threads:设置为物理 CPU 核心数,不要超过物理核。--threads‑batch:一般设置比 threads 大 2‑4,用于预填充阶段。- RAG 长文档场景优先
--parallel 1;并发对话场景接受单会话上下文缩减。 - CPU 推理并发升高,单请求生成 t/s 会下降,属于正常现象。
如果你需要,我可以输出一份 markdown 文档文本,可直接保存用于项目交付。