Ubuntu22.04系统环境下8卡5090服务器端编译最新llama-server完整实地部署最新发布的Qwen3.8-Flash-Next全新架构模型

昨天阿里发布了面向下一代Qwen4架构的预览版模型Qwen3.8-Flash-Next,希望社区来检验qwen4新架构的性能,在前面的系列博文我们也都进行了学习记录,感兴趣的话可以自行移步阅读即可:

《On the Design of Qwen3.8-Next Architecture: Evaluation, Efficiency,and Training Stability》

这里我们不再对模型的设计本身进行解读,而是想要从实际落地的角度出发来完整搭建本地环境部署使用。官方仓库地址在这里,如下所示:

在这里插入图片描述

本文是一份可直接复用的部署教程,记录在 NVIDIA RTX 5090 × 8 服务器上,这里我们最终部署使用了4块卡完成了部署,使用 llama.cpp + Qwen4Exp 专用支持分支完成 Qwen3.8-Flash-Next GGUF 模型部署的最终成功方案。

环境基线: Ubuntu/Linux x86_64、RTX 5090 × 8、CUDA 12.8、GCC/G++ 12、llama.cpp PR #27742 对应提交 6c5afc86a、Qwen3.8-Flash-Next UD-Q4_K_XL 四分片 GGUF。


1. 部署目标与最终架构

本次部署的关键并不是普通的“下载模型 + 编译 llama.cpp”,而是:

Qwen3.8-Flash-Next
        │
        ▼
GGUF / UD-Q4_K_XL
        │
        ▼
模型元数据 architecture = qwen4exp
        │
        ▼
llama.cpp Qwen4Exp 支持分支
PR #27742
commit 6c5afc86a
        │
        ▼
CUDA 12.8 + RTX 5090
        │
        ▼
GPU 3 / 4 / 5 / 6
        │
        ▼
llama-server

本次最重要的结论:

Qwen3.8-Flash-Next 所使用的 GGUF 架构标识为 qwen4exp

因此不能只使用普通 llama.cpp master 分支;必须使用包含 Qwen4Exp 实现的对应代码版本,并且必须重新完整编译。


2. 硬件与软件环境

2.1 GPU

服务器共 8 张:

GPU0  NVIDIA GeForce RTX 5090  32 GB
GPU1  NVIDIA GeForce RTX 5090  32 GB
GPU2  NVIDIA GeForce RTX 5090  32 GB
GPU3  NVIDIA GeForce RTX 5090  32 GB
GPU4  NVIDIA GeForce RTX 5090  32 GB
GPU5  NVIDIA GeForce RTX 5090  32 GB
GPU6  NVIDIA GeForce RTX 5090  32 GB
GPU7  NVIDIA GeForce RTX 5090  32 GB

GPU Compute Capability:

12.0

驱动:

570.195.03

2.2 CUDA

最终使用:

CUDA_HOME=/usr/local/cuda-12.8
nvcc 12.8.93

验证:

which nvcc
nvcc --version

2.3 编译器

使用:

g++-12
GNU 12.3.0

3. GPU 拓扑结论

服务器 GPU 拓扑显示:

GPU0 GPU1 GPU2 GPU3

位于 NUMA Node 0。

GPU4 GPU5 GPU6 GPU7

位于 NUMA Node 1。

同时:

GPU3 <-> GPU4

跨 NUMA 节点。

没有 NVLink。

nvidia-smi topo -p2p r/w 显示 CNS,因此不能把该机器理解成具备 NVLink / 原生高速 GPU P2P 的服务器。

本次实际部署选择:

GPU3,4,5,6

对应逻辑设备:

CUDA_VISIBLE_DEVICES=3,4,5,6

逻辑 GPU 0 -> 物理 GPU 3
逻辑 GPU 1 -> 物理 GPU 4
逻辑 GPU 2 -> 物理 GPU 5
逻辑 GPU 3 -> 物理 GPU 6

注意:

设置 CUDA_VISIBLE_DEVICES 后,llama.cpp 内部看到的是重新编号后的 0、1、2、3,而不是物理编号 3、4、5、6。


4. 模型文件

模型目录:

/home/Qwen/Qwen3.8-Flash-Next-GGUF/Qwen3.8-Flash-Next-GGUF-Q4/UD-Q4_K_XL

四个分片:

Qwen3.8-Flash-Next-UD-Q4_K_XL-00001-of-00004.gguf
Qwen3.8-Flash-Next-UD-Q4_K_XL-00002-of-00004.gguf
Qwen3.8-Flash-Next-UD-Q4_K_XL-00003-of-00004.gguf
Qwen3.8-Flash-Next-UD-Q4_K_XL-00004-of-00004.gguf

大小约为:

11 MB
47 GB
46 GB
12 GB

合计约:

105 GB

启动时只需要指定:

00001-of-00004.gguf

llama.cpp 会自动识别并加载后续分片。


5. 不要使用旧 llama.cpp

因为前面部署过很多不同系列的模型,这些模型使用的也是llama-server,所以本身环境中就存在老版本的llama-server。旧目录:

/home/prjs/llama.cpp

之前的普通 master 版本:

d7a207411

虽然已经支持 CUDA,但不支持:

qwen4exp

因此启动模型时出现:

unknown model architecture: 'qwen4exp'

这不是 CUDA 问题,也不是 GPU 显存问题,而是:

运行模型的 llama-server 二进制没有编译进 Qwen4Exp 架构支持。

为了不影响原有的内容,最终采用全新目录:

/home/llama.cpp-qwen38-pr27742

6. 拉取 Qwen4Exp 支持代码

/home 下:

cd /home

git clone https://github.com/ggml-org/llama.cpp.git llama.cpp-qwen38

cd /home/llama.cpp-qwen38

git fetch origin pull/27742/head:qwen4exp

git checkout qwen4exp

最终成功代码状态:

branch:
qwen4exp

commit:
6c5afc86a

message:
qwen4exp: double the Q split granularity for tensor parallelism

验证:

git branch --show-current
git log -1 --oneline
git status --short

应看到:

qwen4exp
6c5afc86a ...

并且:

git status --short

没有输出。


7. 验证源码确实支持 Qwen4Exp

执行:

grep -Rni "qwen4exp" src include ggml | head -100

必须能够看到类似:

src/llama-arch.cpp
src/llama-arch.h
src/models/models.h
src/models/qwen4exp.cpp
src/llama-memory-hybrid-idx.cpp

特别重要:

src/models/qwen4exp.cpp

说明 Qwen4Exp 的实际模型实现已经进入源码。

还可以验证:

grep -Rni "LLM_ARCH_QWEN4EXP" src include ggml | head -100

应该看到:

LLM_ARCH_QWEN4EXP

以及架构注册:

{ LLM_ARCH_QWEN4EXP, "qwen4exp" }

8. CUDA 编译配置

建议使用全新的 build 目录:

cd /home/llama.cpp-qwen38-pr27742

rm -rf build

cmake -B build \
  -DGGML_CUDA=ON \
  -DCMAKE_CUDA_COMPILER=/usr/local/cuda-12.8/bin/nvcc \
  -DCMAKE_CXX_COMPILER=/usr/bin/g++-12

确认:

grep -E 'CMAKE_CUDA_COMPILER|CUDAToolkit|CMAKE_CXX_COMPILER|GGML_CUDA' build/CMakeCache.txt

重点应为:

CMAKE_CUDA_COMPILER=/usr/local/cuda-12.8/bin/nvcc
CMAKE_CXX_COMPILER=/usr/bin/g++-12
GGML_CUDA:BOOL=ON

9. 完整编译

执行:

cmake --build build --config Release -j$(nproc)

完成后:

./build/bin/llama-server --version

最终成功版本:

version: 0.3.0-dev (build 10669, commit 6c5afc86a)
built with GNU 12.3.0 for Linux x86_64

10. 验证 CUDA 后端

检查:

ls -lh build/bin/libggml-cuda.so*

应存在:

libggml-cuda.so
libggml-cuda.so.0
libggml-cuda.so.0.22.0

同时:

ldd build/bin/llama-server | grep -E 'cuda|cublas|ggml'

应能看到:

libggml-cuda.so
libcudart
libcublas
libcuda
libcublasLt

这说明 CUDA 后端已经真正编译并链接。


11. 最关键的模型加载验证

正式启动 server 前,先使用 llama-cli 做最小化验证。

cd /home/llama.cpp-qwen38-pr27742

export CUDA_VISIBLE_DEVICES=3,4,5,6

export CUDA_HOME=/usr/local/cuda-12.8
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

./build/bin/llama-cli \
  --model /home/Qwen/Qwen3.8-Flash-Next-GGUF/Qwen3.8-Flash-Next-GGUF-Q4/UD-Q4_K_XL/Qwen3.8-Flash-Next-UD-Q4_K_XL-00001-of-00004.gguf \
  --n-gpu-layers 1 \
  --ctx-size 1024 \
  --prompt "你好,请简单介绍一下自己。" \
  --n-predict 20

成功标志:

build : b10669-6c5afc86a
model : ...00001-of-00004.gguf
ftype : Q4_K - Medium

并且出现正常交互:

> 你好,请简单介绍一下自己。

模型开始生成:

[Start thinking]
...

在这里插入图片描述

这已经证明:

  1. GGUF 可以被识别;
  2. qwen4exp 架构已经被 llama.cpp 识别;
  3. 模型可以正常初始化;
  4. tokenizer / graph / 权重读取链路正常;
  5. llama.cpp 二进制与该模型兼容。

12. 正式四卡部署

最终使用:

物理 GPU 3,4,5,6

启动前:

export CUDA_VISIBLE_DEVICES=3,4,5,6

CUDA:

export CUDA_HOME=/usr/local/cuda-12.8
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

P2P:

export GGML_CUDA_P2P=1

由于本机拓扑没有 NVLink,并且 nvidia-smi topo -p2p r/w 显示 CNS,不要额外强制设置:

GGML_CUDA_ALLREDUCE=nccl

最终保持:

unset GGML_CUDA_ALLREDUCE

13. 最终启动命令

cd /home/Qwen/Qwen3.8-Flash-Next-GGUF/Qwen3.8-Flash-Next-GGUF-Q4/UD-Q4_K_XL

export CUDA_VISIBLE_DEVICES=3,4,5,6

export CUDA_HOME=/usr/local/cuda-12.8
export PATH=/home/llama.cpp-qwen38-pr27742/build/bin:$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=/home/llama.cpp-qwen38-pr27742/build/bin:$CUDA_HOME/lib64:$LD_LIBRARY_PATH

export GGML_CUDA_P2P=1
unset GGML_CUDA_ALLREDUCE

/home/llama.cpp-qwen38-pr27742/build/bin/llama-server \
  --model /home/Qwen/Qwen3.8-Flash-Next-GGUF/Qwen3.8-Flash-Next-GGUF-Q4/UD-Q4_K_XL/Qwen3.8-Flash-Next-UD-Q4_K_XL-00001-of-00004.gguf \
  --host 0.0.0.0 \
  --port 39999 \
  --n-gpu-layers 999 \
  --split-mode layer \
  --tensor-split 1,1,1,1 \
  --main-gpu 0 \
  --ctx-size 32768 \
  --batch-size 1024 \
  --ubatch-size 512 \
  --flash-attn auto \
  --cache-type-k q4_0 \
  --cache-type-v q4_0 \
  --parallel 1 \
  --threads 32 \
  --temp 1.0 \
  --top-p 0.95 \
  --top-k 64 \
  --load-mode mmap

14. 参数说明

GPU

--n-gpu-layers 999

尽可能将模型层全部放到 GPU。

--split-mode layer

采用 layer split 多卡分层方式。

--tensor-split 1,1,1,1

四张 GPU 均匀分配。

因为四张卡都是:

RTX 5090 32 GB

所以初始采用等比例分配是合理的。

--main-gpu 0

这里的 0 是:

CUDA_VISIBLE_DEVICES=3,4,5,6

重新编号后的逻辑 GPU 0,也就是物理 GPU 3。


上下文

--ctx-size 32768

初始部署采用 32K context。


Batch

--batch-size 1024
--ubatch-size 512

作为初始稳定配置。


Flash Attention

--flash-attn auto

让 llama.cpp 根据当前后端自动选择。


KV Cache

--cache-type-k q4_0
--cache-type-v q4_0

降低 KV cache 显存压力。


并发

--parallel 1

首先以单并发稳定运行。

正式服务稳定后再根据实际吞吐需求调整。


15. 服务验证

启动成功后,另开终端:

curl http://127.0.0.1:39999/health

正常情况下应返回:

{"status":"ok"}

然后:

curl http://127.0.0.1:39999/v1/models

验证 OpenAI-compatible API。

测试聊天:

curl http://127.0.0.1:39999/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen3.8-Flash-Next",
    "messages": [
      {
        "role": "user",
        "content": "你好,请介绍一下你自己。"
      }
    ],
    "temperature": 1.0,
    "top_p": 0.95
  }'

16. 部署成功判定标准

不要仅仅以:

llama-server --version

作为成功标准。

完整成功应满足:

① CUDA 12.8 正常
        ↓
② GGML_CUDA=ON
        ↓
③ libggml-cuda.so 存在
        ↓
④ llama-server 链接 CUDA
        ↓
⑤ llama.cpp 代码包含 Qwen4Exp
        ↓
⑥ llama-server commit = 6c5afc86a
        ↓
⑦ GGUF architecture=qwen4exp 能够识别
        ↓
⑧ llama-cli 成功加载模型
        ↓
⑨ llama-cli 能正常生成文本
        ↓
⑩ llama-server 四卡启动
        ↓
⑪ /health 正常
        ↓
⑫ API 请求正常返回

其中最容易误判的是第 ④ 和第 ⑤:

CUDA 编译成功 ≠ Qwen4Exp 支持。


17. 最终环境检查脚本

可以保存为:

check_env.sh

内容:

#!/bin/bash

echo "========================================"
echo "CUDA"
echo "========================================"
which nvcc
nvcc --version

echo
echo "========================================"
echo "GPU"
echo "========================================"
nvidia-smi --query-gpu=index,name,memory.total,compute_cap,driver_version --format=csv

echo
echo "========================================"
echo "LLAMA VERSION"
echo "========================================"
./build/bin/llama-server --version

echo
echo "========================================"
echo "GIT"
echo "========================================"
git branch --show-current
git log -1 --oneline
git status --short

echo
echo "========================================"
echo "QWEN4EXP SOURCE"
echo "========================================"
grep -Rni "LLM_ARCH_QWEN4EXP" src include ggml | head -20

echo
echo "========================================"
echo "CUDA LIB"
echo "========================================"
ls -lh build/bin/libggml-cuda.so*

echo
echo "========================================"
echo "LINKED LIB"
echo "========================================"
ldd build/bin/llama-server | grep -E 'cuda|cublas|ggml'

最终服务成功部署启动输出如下:
在这里插入图片描述

总结

在实地部署的过程中,因为全新架构的适配问题,出现了很多踩坑报错,不过最终还是成功编译新版的llama-server,并完成了模型的部署验证工作。本次成功部署的核心不是“把 llama.cpp 编译出来”,而是完成了:

正确的 Qwen4Exp 架构支持代码 + CUDA 12.8 + RTX 5090 + GGUF 分片模型 + 正确的多卡启动参数

其中最关键的版本锚点是:

llama.cpp
PR #27742
commit 6c5afc86a

而最终已经验证:

Qwen3.8-Flash-Next
        ↓
qwen4exp
        ↓
llama.cpp b10669
        ↓
llama-cli 成功加载
        ↓
模型正常生成

因此,后续再部署同类模型时,首先应该检查 GGUF 的 architecture 元数据,再决定 llama.cpp 代码版本,而不是先盲目升级 CUDA、驱动或调整 GPU 参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Together_CZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值