5070ti16g单卡跑qwen 3.8 flash next iq4x gguf Hermes调用 18tokens/s

我的电脑配置:i5 12代处理器,64gddr4 ,5070ti16g,3070 8g,2tnvme 高速硬盘。

模型1qwen3.8 iq4xs:https://huggingface.co/AtomicChat/Qwen3.8-Flash-Next-GGUF/tree/main/Qwen3.8-Flash-Next-AD-3.84bpw-IQ4_XS-M64

模型2qwen3.8 iq4xs:https://huggingface.co/orcarouter/Qwen3.8-Flash-Next-Uncensored-GGUF/tree/main

llama.cpp版本:https://github.com/ggml-org/llama.cpp/releases/tag/b10718

单卡实测输出速度将近19t/s

Hermes调用在我的应用场景工作非常流畅,大部分任务都能输你完成。

注意:预热初始比较慢,预热后,不要经常关闭模型速度非常理想和稳定。

下方是win11下 ,bat脚本分享,可以直接通过txt文档编辑修改为bat脚本
@echo off
setlocal EnableExtensions
chcp 65001 >nul

rem ============================================================
rem Qwen3.8-Flash-Next Uncensored IQ4_XS
rem Windows + RTX 5070 Ti 16GB
rem llama.cpp b10718
rem Single GPU Auto-Fit Performance
rem Context: 131072 / 128K
rem No API Key Authentication
rem ============================================================

set "SCRIPT_DIR=%~dp0"
set "STOP_SCRIPT=%SCRIPT_DIR%stop-llama-server.bat"

set "ROOT=C:\Users\Administrator\llama.cpp"
set "LLAMA_SERVER=%ROOT%\bin\llama-server.exe"

set "MODEL_DIR=D:\ai\Models\llama\OrcaRouter-Qwen3.8-Flash-Next-Uncensored-IQ4_XS"
set "MODEL=%MODEL_DIR%\Qwen3.8-Flash-Next-Uncensored-IQ4_XS-00001-of-00003.gguf"

rem ============================================================
rem Network
rem ============================================================

set "HOST=0.0.0.0"
set "PORT=8081"
set "LAN_IP=127.0.0.1"

rem ============================================================
rem GPU / Performance tuning
rem ============================================================

rem RTX 5070 Ti
set "GPU_DEVICE=CUDA0"

rem Auto-Fit VRAM reserve
set "FIT_TARGET=1536" ##调整为1024速度还能提升,但注意显存容量
rem Context
set "CONTEXT_SIZE=131072"

rem Batch settings
set "BATCH_SIZE=1024"
set "UBATCH_SIZE=256"

rem CPU thread settings
set "CPU_THREADS=8"
set "CPU_BATCH_THREADS=12"

rem ============================================================
rem Detect LAN IPv4
rem ============================================================

for /f "tokens=*" %%i in ('powershell -NoProfile -Command "$a=Get-NetIPAddress -AddressFamily IPv4; ($a.Where({$_.IPAddress -notlike '127.*' -and $_.PrefixOrigin -ne 'WellKnown'})[0].IPAddress)"') do set "LAN_IP=%%i"

if "%LAN_IP%"=="" set "LAN_IP=127.0.0.1"

echo.
echo =================================================================
echo Qwen3.8 Flash Next Uncensored IQ4_XS - RTX 5070 Ti Auto-Fit
echo Context: 128K
echo Authentication: Disabled
echo =================================================================
echo.

rem ============================================================
rem 1/4 Check files
rem ============================================================

echo [1/4] Checking files...
echo.

if not exist "%LLAMA_SERVER%" (
echo ERROR: llama-server.exe not found:
echo %LLAMA_SERVER%
echo.
pause
exit /b 1
)

if not exist "%MODEL%" (
echo ERROR: Model not found:
echo %MODEL%
echo.
pause
exit /b 1
)

echo llama-server : OK
echo Model : OK
echo.

rem ============================================================
rem 2/4 Stop existing llama.cpp processes
rem ============================================================

echo [2/4] Stopping existing llama.cpp processes...
echo.

if exist "%STOP_SCRIPT%" (
call "%STOP_SCRIPT%" /silent
) else (
taskkill /F /IM llama-server.exe >nul 2>nul
taskkill /F /IM llama-cli.exe >nul 2>nul
taskkill /F /IM llama-mtmd-cli.exe >nul 2>nul
)

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "Start-Sleep -Seconds 1"

rem ============================================================
rem 3/4 Show configuration
rem ============================================================

echo.
echo [3/4] Configuration
echo.

echo -----------------------------------------------------------------
echo Network
echo -----------------------------------------------------------------
echo Bind : http://%HOST%:%PORT%
echo Local : http://127.0.0.1:%PORT%
echo LAN : http://%LAN_IP%:%PORT%
echo Auth : Disabled
echo.

echo -----------------------------------------------------------------
echo Model
echo -----------------------------------------------------------------
echo Model : Qwen3.8-Flash-Next Uncensored IQ4_XS
echo Model Size : 90.8 GiB
echo Context : %CONTEXT_SIZE% / 128K
echo Output Max : 4096
echo.

echo -----------------------------------------------------------------
echo GPU
echo -----------------------------------------------------------------
echo GPU : RTX 5070 Ti only
echo Device : %GPU_DEVICE%
echo RTX 3070 : Disabled
echo Split Mode : none
echo.

echo -----------------------------------------------------------------
echo Auto-Fit
echo -----------------------------------------------------------------
echo Auto Fit : ON
echo Fit Target : %FIT_TARGET% MiB
echo.

echo -----------------------------------------------------------------
echo Memory
echo -----------------------------------------------------------------
echo Load Mode : mmap
echo Lazy Mode : ON
echo KV Cache : Q4_0 / Q4_0
echo.

echo -----------------------------------------------------------------
echo Performance
echo -----------------------------------------------------------------
echo Batch : %BATCH_SIZE%
echo UBatch : %UBATCH_SIZE%
echo Threads : %CPU_THREADS%
echo Batch Thr : %CPU_BATCH_THREADS%
echo Flash Attn : ON
echo.

echo -----------------------------------------------------------------
echo Speculative Decoding
echo -----------------------------------------------------------------
echo Spec : OFF
echo.

echo -----------------------------------------------------------------
echo Reasoning
echo -----------------------------------------------------------------
echo Reasoning : auto
echo Budget : 2048
echo Format : deepseek
echo.

rem ============================================================
rem 4/4 Start llama-server
rem ============================================================

echo [4/4] Loading model...
echo.

echo =================================================================
echo Watch startup log for:
echo.
echo CUDA0 model buffer size
echo CPU model buffer size
echo KV buffer size
echo compute buffer size
echo offloaded layers
echo.
echo Server is ready when llama-server starts listening.
echo =================================================================
echo.

cd /d "%ROOT%\bin"

"%LLAMA_SERVER%" ^
-m "%MODEL%" ^
--host "%HOST%" ^
--port %PORT% ^
--alias "qwen3.8-flash-next-uncensored-iq4_xs-5070ti-128k" ^
--jinja ^
--reasoning auto ^
--reasoning-budget 2048 ^
--reasoning-format deepseek ^
-c %CONTEXT_SIZE% ^
-n 4096 ^
-b %BATCH_SIZE% ^
-ub %UBATCH_SIZE% ^
--parallel 1 ^
--device %GPU_DEVICE% ^
--split-mode none ^
--fit on ^
--fit-target %FIT_TARGET% ^
--load-mode mmap ^
--lazy-mode on ^
-ctk q4_0 ^
-ctv q4_0 ^
--flash-attn on ^
--threads %CPU_THREADS% ^
--threads-batch %CPU_BATCH_THREADS% ^
--cache-prompt ^
--log-colors off ^
--temp 1.0 ^
--top-p 0.95 ^
--top-k 20 ^
--min-p 0 ^
--presence-penalty 0.0 ^
--repeat-penalty 1.02

set "ERR=%ERRORLEVEL%"

echo.
echo =================================================================
echo [INFO] llama-server exited with code: %ERR%
echo =================================================================
echo.

pause
exit /b %ERR%

使用前说明:运行脚本前,请先修改这些参数
这份启动脚本是按照我自己的电脑环境编写的。
我的环境是:
Windows
RTX 5070 Ti 16GB
llama.cpp b10718
Qwen3.8-Flash-Next IQ4_XS
Hermes Agent
因此,大家复制脚本以后,不建议直接双击运行。
不同电脑的 llama.cpp 安装位置、GGUF 模型路径、GPU 编号、系统内存和显存情况都可能不同。
第一次使用时,最重要的是先检查下面 4 个参数:
ROOT
MODEL_DIR
MODEL
GPU_DEVICE
其中前 3 个参数几乎每个人都需要根据自己的电脑修改。
────────────────────
一、修改 llama.cpp 安装路径
脚本默认写的是:
set “ROOT=C:\Users\Administrator\llama.cpp”
这个参数代表 llama.cpp 的安装目录。
也就是说,我自己的 llama.cpp 位于:
C:\Users\Administrator\llama.cpp
如果你的 llama.cpp 安装在其他位置,就需要修改。
例如你的 llama.cpp 位于:
D:\llama.cpp
那么修改为:
set “ROOT=D:\llama.cpp”
如果位于:
C:\AI\llama.cpp
那么修改为:
set “ROOT=C:\AI\llama.cpp”
脚本中还有这一行:
set “LLAMA_SERVER=%ROOT%\bin\llama-server.exe”
这一行通常不需要修改。
因为它会自动根据 ROOT 的位置寻找:
bin\llama-server.exe
所以只需要保证 ROOT 填写正确即可。
────────────────────
二、修改 GGUF 模型目录
脚本默认模型目录是:
set “MODEL_DIR=D:\ai\Models\llama\OrcaRouter-Qwen3.8-Flash-Next-Uncensored-IQ4_XS”
这个路径是我自己电脑上的模型保存位置。
大家自己的模型路径一般都会不同,所以这里基本都需要修改。
例如你的模型放在:
E:\AI\Models\Qwen3.8-Flash-Next
那么修改为:
set “MODEL_DIR=E:\AI\Models\Qwen3.8-Flash-Next”
这里填写的是 GGUF 模型所在的文件夹。
────────────────────
三、修改 GGUF 模型文件名
脚本中默认是:
set “MODEL=%MODEL_DIR%\Qwen3.8-Flash-Next-Uncensored-IQ4_XS-00001-of-00003.gguf”
这一行代表真正要加载的 GGUF 模型文件。
不同作者发布的模型、不同量化版本,文件名都会有所不同。
所以大家需要进入自己的模型目录,找到实际下载的 GGUF 文件名。
例如你的模型文件叫:
Qwen3.8-Flash-Next-AD-3.84bpw-IQ4_XS-M64-00001-of-00003.gguf
那么修改为:
set “MODEL=%MODEL_DIR%\Qwen3.8-Flash-Next-AD-3.84bpw-IQ4_XS-M64-00001-of-00003.gguf”
────────────────────
四、多分片 GGUF 怎么填写?
这种大型模型通常会被拆成多个 GGUF 文件。
例如:
Qwen3.8-Flash-Next-IQ4_XS-00001-of-00003.gguf
Qwen3.8-Flash-Next-IQ4_XS-00002-of-00003.gguf
Qwen3.8-Flash-Next-IQ4_XS-00003-of-00003.gguf
这种情况下,脚本里面只需要指定第一片:
00001-of-00003.gguf
例如:
set “MODEL=%MODEL_DIR%\Qwen3.8-Flash-Next-IQ4_XS-00001-of-00003.gguf”
正常情况下,llama.cpp 会自动读取后面的:
00002-of-00003.gguf
00003-of-00003.gguf
不需要把三个文件分别写进脚本。
────────────────────
五、检查 GPU_DEVICE
脚本默认:
set “GPU_DEVICE=CUDA0”
它代表使用 llama.cpp 识别到的 CUDA0 显卡。
如果你的电脑只有一张 NVIDIA 显卡,一般保持 CUDA0 就可以。
但如果你的电脑里面有两张或更多 NVIDIA 显卡,就一定要检查。
例如你的电脑有:
RTX 5070 Ti
RTX 3070
llama.cpp 可能识别为:
CUDA0 = RTX 5070 Ti
CUDA1 = RTX 3070
这种情况下保持:
set “GPU_DEVICE=CUDA0”
就可以。
但是也有可能变成:
CUDA0 = RTX 3070
CUDA1 = RTX 5070 Ti
那么就需要修改为:
set “GPU_DEVICE=CUDA1”
所以多显卡用户不要默认认为 CUDA0 一定就是性能最强的那张显卡。
建议启动 llama.cpp 后查看前面的 CUDA 初始化日志,确认显卡对应编号。
────────────────────
六、为什么脚本使用 –split-mode none?
脚本使用:
–device %GPU_DEVICE%
–split-mode none
目的就是只使用指定的一张显卡。
例如:
set “GPU_DEVICE=CUDA0”
那么模型就只使用 CUDA0。
即使电脑里还有 RTX 3070、RTX 3060 或其他显卡,也不会自动加入模型分卡。
这份配置主要针对:
RTX 5070 Ti 16GB 单卡运行
目标并不是追求把模型分散到更多显卡,而是优先保证单用户 Hermes 使用时的生成速度和稳定性。
────────────────────
七、端口 PORT 是否需要修改?
默认:
set “PORT=8081”
启动以后,本机地址是:
http://127.0.0.1:8081
如果使用 OpenAI Compatible API,一般填写:
http://127.0.0.1:8081/v1
如果 8081 没有被其他程序占用,就不需要修改。
如果提示端口被占用,可以修改成:
set “PORT=8082”
或者:
set “PORT=8000”
需要注意:
修改 llama.cpp 的端口以后,Hermes 里面的 API 地址也要一起修改。
例如端口改成 8082,那么 Hermes 应该连接:
http://127.0.0.1:8082/v1
────────────────────
八、Context 上下文长度怎么选择?
脚本默认:
set “CONTEXT_SIZE=131072”
也就是:
131072 Tokens
约等于 128K Context。
我自己主要使用 Hermes Agent,所以设置成了 128K。
较大的 Context 可以容纳更多:
对话记录
System Prompt
Agent Prompt
Tool 定义
网页内容
代码
Terminal 输出
工具调用记录
但是 Context 越大,对内存和缓存资源的要求也会越高。
所以并不是所有用户都必须使用 128K。
如果系统内存比较紧张,可以先改成 64K:
set “CONTEXT_SIZE=65536”
如果还想进一步降低,可以使用 32K:
set “CONTEXT_SIZE=32768”
如果只是普通聊天、写代码或者测试模型,32K~64K 通常已经够用。
如果主要运行 Hermes Agent,而且内存比较充足,再考虑使用 128K。
────────────────────
九、FIT_TARGET 是什么?
脚本默认:
set “FIT_TARGET=1536”
实际启动时对应:
–fit on
–fit-target 1536
简单理解就是:
让 llama.cpp 自动决定怎样利用显存,同时目标保留大约 1536 MiB 的空闲显存。
1536 MiB 大约就是 1.5GB。
对于 RTX 5070 Ti 16GB,我没有让 llama.cpp 把 16GB 显存全部塞满。
故意留下一部分显存,是为了给下面这些内容留下余量:
KV Cache
CUDA Compute Buffer
Context
CUDA 临时计算
Windows 图形界面
其他程序的显存使用
模型刚加载成功,并不代表后面生成内容时一定不会爆显存。
所以适当保留显存反而会更加稳定。
────────────────────
十、出现 CUDA Out of Memory 怎么办?
如果运行过程中出现:
CUDA out of memory
可以优先提高 FIT_TARGET。
例如:
set “FIT_TARGET=2048”
这样会目标保留大约 2GB 显存。
如果还是不稳定,可以继续提高:
set “FIT_TARGET=2560”
如果模型运行后发现还有很多显存没有使用,也可以尝试降低,例如:
set “FIT_TARGET=1024”
这样 llama.cpp 会更加积极地使用 GPU 显存。
不过不建议为了追求显存占用率,把显存硬塞到接近 100%。
对于本地大模型来说,稳定运行通常比多 Offload 一点点更重要。
────────────────────
十一、CPU_THREADS 是否需要修改?
脚本默认:
set “CPU_THREADS=8”
set “CPU_BATCH_THREADS=12”
这两个参数跟电脑 CPU 有关系。
CPU_THREADS 主要控制普通 CPU 推理线程。
CPU_BATCH_THREADS 更多影响 Prompt Processing 和 Batch 阶段使用的 CPU 线程。
不同 CPU 的最优设置并不一样。
如果不知道应该怎么设置,可以先保持:
set “CPU_THREADS=8”
set “CPU_BATCH_THREADS=12”
然后观察 CPU 占用和实际运行速度。
CPU 核心比较少,可以适当降低。
CPU 核心比较多,也可以自己测试提高。
但是不建议一开始就把所有逻辑线程全部占满。
Windows、Hermes 和其他后台程序同样需要使用 CPU。
────────────────────
十二、BATCH_SIZE 和 UBATCH_SIZE 是否需要修改?
脚本默认:
set “BATCH_SIZE=1024”
set “UBATCH_SIZE=256”
也就是:
Batch Size = 1024
UBatch Size = 256
这两个参数主要影响:
Prompt Processing
Prefill
显存使用
它们并不是简单的“数字越大,Token 生成速度就越快”。
对于 RTX 5070 Ti 16GB,可以先保持:
1024 / 256
如果出现显存不足,可以降低为:
set “BATCH_SIZE=512”
set “UBATCH_SIZE=128”
如果默认设置可以稳定运行,就没有必要继续乱改。
────────────────────
十三、为什么 KV Cache 使用 Q4_0?
脚本中有:
-ctk q4_0
-ctv q4_0
分别代表:
K Cache = Q4_0
V Cache = Q4_0
这么做主要是为了降低长 Context 下 KV Cache 的内存和显存压力。
特别是在使用 128K Context 时,如果 KV Cache 使用更高精度格式,缓存占用会更大。
所以我这里使用 Q4_0,是为了在下面几个方面取得平衡:
Context 长度
内存占用
显存占用
实际使用体验
普通用户建议先保持默认,不需要修改。
────────────────────
十四、–lazy-mode on 建议保留
脚本使用:
–load-mode mmap
–lazy-mode on
对于 Qwen3.8-Flash-Next 这种大型 GGUF,这两个参数比较重要。
简单理解:
不是试图把整个超大模型全部一次性塞入显存,而是结合 mmap 和 Lazy Loading,对部分大型 Tensor 进行更加合理的按需访问。
所以如果使用的就是 Qwen3.8-Flash-Next GGUF,建议先保持:
–load-mode mmap
–lazy-mode on
不要随便删除。
────────────────────
十五、Flash Attention 建议保持开启
脚本使用:
–flash-attn on
对于长上下文模型,Flash Attention 可以降低 Attention 阶段的一部分内存压力,并提高运行效率。
因此在当前支持该功能的 llama.cpp 版本中,建议保持开启。
如果启动时提示:
unknown argument
或者不识别:
–flash-attn
一般说明 llama.cpp 版本可能太旧,需要升级。
────────────────────
十六、为什么使用 –parallel 1?
脚本默认:
–parallel 1
这套配置的主要使用场景是:
一个用户
一个 Hermes Agent
一个本地模型服务
因此没有必要为了并发,把 Server 开成很多个 Slot。
如果只是自己使用:
parallel = 1
就已经足够。
如果以后需要多人同时调用,或者多台设备同时请求模型,再考虑提高 parallel。
但是 Parallel 增加以后,也会增加:
KV Cache 占用
Context 资源
系统内存压力
显存压力
所以不是数值越大越好。
────────────────────
十七、没有 stop-llama-server.bat 怎么办?
脚本前面有:
set “STOP_SCRIPT=%SCRIPT_DIR%stop-llama-server.bat”
有些用户可能会发现自己的目录里面没有这个文件。
这个没有关系。
因为脚本已经做了自动判断。
如果存在 stop-llama-server.bat,就调用这个文件。
如果不存在,就会自动执行 taskkill,关闭已有的 llama.cpp 相关进程。
因此普通用户不需要额外创建 stop-llama-server.bat。
────────────────────
十八、这个公开脚本没有 API Key
博客公开版本已经去掉了:
–api-key
以及:
–api-key-file
所以默认情况下,访问 llama-server 不需要填写 API Key。
Hermes 本机可以直接连接:
http://127.0.0.1:8081/v1
这样配置起来更加简单。
但是这里有一个安全问题必须注意。
────────────────────
十九、HOST=0.0.0.0 的安全问题
脚本默认:
set “HOST=0.0.0.0”
0.0.0.0 的意思不是只允许本机访问。
它代表 llama-server 监听当前电脑的所有网络接口。
例如你的电脑局域网 IP 是:
192.168.1.100
那么同一局域网的其他设备可能可以通过:
http://192.168.1.100:8081
访问你的模型。
如果脚本又没有设置 API Key,那么任何能够访问这个端口的设备,都可能调用模型。
所以:
不要在没有鉴权、防火墙或反向代理保护的情况下,把 8081 端口直接暴露到公网。
────────────────────
二十、如果只让本机 Hermes 使用
如果你只在这一台电脑上运行 Hermes,建议把:
set “HOST=0.0.0.0”
改成:
set “HOST=127.0.0.1”
这样 llama-server 就只接受本机访问。
Hermes 仍然连接:
http://127.0.0.1:8081/v1
即可。
如果你需要手机、笔记本或局域网其他电脑访问模型,再考虑保留:
0.0.0.0
────────────────────
二十一、普通用户最少需要修改哪些地方?
如果你不想研究所有参数,第一次使用时至少确认下面 4 项。
第一项:
set “ROOT=C:\Users\Administrator\llama.cpp”
作用:
填写你自己的 llama.cpp 安装目录。
第二项:
set “MODEL_DIR=D:\ai\Models\llama\OrcaRouter-Qwen3.8-Flash-Next-Uncensored-IQ4_XS”
作用:
填写你自己的 GGUF 模型目录。
第三项:
set “MODEL=%MODEL_DIR%\Qwen3.8-Flash-Next-Uncensored-IQ4_XS-00001-of-00003.gguf”
作用:
填写你实际下载的 GGUF 第一分片文件名。
第四项:
set “GPU_DEVICE=CUDA0”
作用:
指定准备使用的 NVIDIA GPU。
单显卡用户一般保持 CUDA0。
多显卡用户需要确认 5070 Ti 实际对应 CUDA0 还是 CUDA1。
────────────────────
二十二、RTX 5070 Ti 16GB 可以先使用这套参数
如果你的硬件也是 RTX 5070 Ti 16GB,可以先从下面这套配置开始:
set “GPU_DEVICE=CUDA0”
set “FIT_TARGET=1536”
set “CONTEXT_SIZE=131072”
set “BATCH_SIZE=1024”
set “UBATCH_SIZE=256”
set “CPU_THREADS=8”
set “CPU_BATCH_THREADS=12”
如果模型能够稳定运行,就没有必要继续为了参数而参数。
────────────────────
二十三、如果显存不足,建议按照这个顺序修改
第一步:
把 FIT_TARGET 从 1536 提高到 2048。
set “FIT_TARGET=2048”
第二步:
如果还是显存不足,可以尝试:
set “FIT_TARGET=2560”
第三步:
降低 Batch:
set “BATCH_SIZE=512”
set “UBATCH_SIZE=128”
第四步:
如果内存和缓存压力仍然比较大,再降低 Context:
set “CONTEXT_SIZE=65536”
也就是 64K Context。
如果仍然有压力,可以继续降低到:
set “CONTEXT_SIZE=32768”
也就是 32K Context。
────────────────────
二十四、第一次启动应该看什么?
第一次运行脚本时,建议先不要启动 Hermes。
先直接运行 BAT 脚本。
然后观察 llama.cpp 的启动日志。
如果看到下面这些错误,就说明配置还有问题:
Model not found
说明模型路径或者模型文件名不正确。
llama-server.exe not found
说明 ROOT 路径不正确。
CUDA out of memory
说明显存不足,需要提高 FIT_TARGET、降低 Batch 或降低 Context。
unknown argument
通常说明 llama.cpp 版本太旧,不支持当前参数。
failed to load model
说明模型文件、路径、分片或者 llama.cpp 版本存在问题。
如果模型正常加载,启动日志通常还能看到类似:
CUDA GPU
model buffer
KV buffer
compute buffer
offloaded layers
这些信息。
最后 llama-server 开始监听端口以后,说明模型服务器已经基本启动成功。
然后再打开 Hermes。
API 地址填写:
http://127.0.0.1:8081/v1
即可开始测试。
────────────────────
二十五、关于 17~18 tokens/s 的说明
我自己的实际环境是:
Windows
RTX 5070 Ti 16GB
llama.cpp b10718
Qwen3.8-Flash-Next IQ4_XS
128K Context
Q4_0 KV Cache
Flash Attention
Auto-Fit
Lazy Mode
Hermes Agent
在这套环境下,实际聊天生成速度可以达到大约:
17~18 tokens/s
但这个数字只是我自己电脑的实测结果,并不代表所有 RTX 5070 Ti 都一定可以得到完全相同的速度。
实际性能还会受到很多因素影响,例如:
CPU 性能
系统内存容量
内存带宽
SSD 性能
GPU 驱动
CUDA
llama.cpp 版本
GGUF 量化版本
Prompt 长度
Context 长度
后台运行的软件
GPU 当前显存占用
所以大家可以把我的参数当成一个起点,而不是一个绝对标准。

实测环境:Windows + RTX 5070 Ti 16GB + llama.cpp b10718 + Hermes Agent。17~18 tokens/s 为本机实测值,不代表所有硬件都能达到相同速度。
 

为什么 RTX 5070 Ti 16GB 单卡也能跑 Qwen3.8-Flash-Next,并达到约 18 tokens/s?

这套启动参数是我针对 Windows + RTX 5070 Ti 16GB + llama.cpp b10718 + Hermes Agent 调整的一套单卡配置。

实际使用的 GGUF 是 IQ4_XS 量化版本,模型文件本身体积非常大,远远超过 RTX 5070 Ti 的 16GB 显存。

但实际在 Hermes 中对话时,我这套配置可以做到大约:

17~18 tokens/s

需要特别说明:这里的 18 t/s 是我本机实际运行得到的生成速度,并不代表所有电脑都一定能达到相同速度。CPU、内存带宽、SSD、CUDA 驱动、llama.cpp 版本、提示词长度以及后台程序都会影响最终性能。


1. 90GB 左右的模型,为什么 16GB 显卡还能跑?

这也是这个模型最有意思的地方。

Qwen3.8-Flash-Next 并不是传统的 100B+ Dense 稠密模型。

官方公布的语言模型结构是:

  • 总语言模型参数:125B
  • 实际每个 Token 激活参数:约 6B
  • N-gram Embedding:额外约 51B
  • MTP:约 4B
  • MoE Experts:512 个
  • 每次只激活 10 个 Routed Experts + 1 个 Shared Expert

也就是说:

模型虽然非常大,但生成每个 Token 时,并不会把全部 125B 参数都参与计算。

真正参与一次前向推理的参数规模只有大约 6B。

这就是为什么它和传统的 100B、120B Dense 模型完全不是一个概念。

可以简单理解为:

硬盘和内存负责“存下整个知识库”,GPU 只重点计算当前 Token 真正需要用到的那部分专家。

所以这种模型特别适合:

大内存 + 中高端消费级显卡

这种本地部署方式。


2. 51B N-gram 参数为什么没有把速度彻底拖死?

Qwen3.8-Flash-Next 还有一个非常特殊的设计:

51B N-gram Embedding。

这一部分参数占据了非常大的模型文件体积,但它和普通 Transformer 权重不一样。

Qwen 官方明确提到,N-gram Embedding 的特点就是:

参数可以做得很大,但计算量比较低,同时更加适合进行 Offload。

所以看到模型几十 GB、甚至接近 100GB 时,不要直接按照传统 Dense 模型的思路判断性能。

它实际上属于一种:

“存储很大,但每 Token 实际计算量相对小”

的模型架构。

这也是 Qwen3.8-Flash-Next 能在消费级硬件上出现非常有意思性能表现的重要原因。


3. `–lazy-mode on` 是这套配置很重要的一项

启动参数里有:


--load-mode mmap
--lazy-mode on

这是我保留的重要参数。

新版 llama.cpp 专门针对这种拥有巨大 N-gram / 特殊 Embedding Tensor 的模型增加了 Lazy Tensor Read 机制。

后来该参数被正式改名为:


--lazy-mode

它的核心思想就是:

某些超大的 Tensor 不需要启动时全部常驻内存,而是在真正需要时读取对应的数据。

这对 Qwen3.8-Flash-Next 这种拥有超大 N-gram Embedding 的模型特别重要。

所以:


--load-mode mmap
--lazy-mode on

并不是单纯为了“加载快一点”。

真正的目的,是让这种远远大于显存容量的模型能够更合理地利用:

SSD → 系统内存 → GPU

这一整套存储层级。


4. 为什么使用 `–fit on`

配置里还有:


--fit on
--fit-target 1536

这是另外一个非常关键的地方。

我没有手工写:


-ngl 20
-ngl 30
-ngl 40

来硬性规定到底多少层放进显卡。

而是交给新版 llama.cpp 的 Auto-Fit 系统自动计算。

--fit on 会根据当前 GPU 可用显存自动调整没有被手工固定的内存分配参数。

--fit-target 可以理解为:

希望 GPU 最终保留多少 MiB 的空闲显存。

我的设置是:


--fit-target 1536

也就是:

尽量使用 RTX 5070 Ti 的显存,但目标留下大约 1.5GB 安全空间。

这么做主要是为了避免一种常见情况:

模型刚加载进去没问题,但 Hermes 一开始长对话、建立 KV Cache 或 CUDA 创建额外计算 Buffer 后突然:


CUDA out of memory

因此不是把 16GB 显存吃到 16GB 才最快。

对于日常 Hermes Agent 使用,我更倾向于:

稍微牺牲一点理论最大 GPU Offload,换取长期稳定运行。


5. 为什么只使用 RTX 5070 Ti,不使用 RTX 3070?

我的电脑里还有一张 RTX 3070。

但是这个配置明确写了:


--device CUDA0
--split-mode none

目的就是:

只使用 RTX 5070 Ti。

不让 RTX 3070 加入模型分割。

很多人第一反应可能会觉得:

两张显卡加起来不是显存更多吗?

没错。

但:

显存增加 ≠ Token 生成速度一定增加。

双 GPU 推理会增加:

  • GPU 间的数据同步
  • PCIe 数据传输
  • Tensor / Layer 调度
  • 两张不同性能 GPU 的等待
  • 额外的软件调度开销

尤其 RTX 5070 Ti 和 RTX 3070 本身并不是完全相同的 GPU。

对于这种 MoE 模型,如果单张 5070 Ti 已经能够承担主要的高价值计算,让较慢的 3070 加入,并不意味着一定更快。

所以我最终选择:


RTX 5070 Ti:参与
RTX 3070:不参与
Split Mode:none

目标不是追求“塞进更多显存”,而是:

追求单用户 Hermes 对话的实际 Token 生成速度。


6. 为什么 Context 设置成 128K?

配置是:


-c 131072

也就是:

131072 Tokens / 128K Context

实际上 Qwen3.8-Flash-Next 官方原生 Context 已经达到 262144 Tokens,也就是 256K。

但是我没有直接开 256K。

因为对于 16GB 显存机器来说,没有必要为了一个平时几乎用不到的最大上下文,把大量内存预算长期留给 Context Cache。

Hermes Agent 日常使用中:


128K

已经非常大。

代码、网页、工具调用、Terminal 输出、长对话都基本够用。

因此这是一个:

性能 / 内存占用 / Agent 实用性

比较平衡的选择。


7. 为什么 KV Cache 使用 Q4_0?

参数:


-ctk q4_0
-ctv q4_0

分别代表:


K Cache = Q4_0
V Cache = Q4_0

如果开 128K Context,还使用高精度 KV Cache,会消耗更多内存。

所以我直接把 KV Cache 量化成 Q4_0。

这样最大的好处就是:

显著降低长上下文缓存占用。

这会把更多宝贵的显存留给:

  • 模型权重
  • CUDA Compute Buffer
  • Context
  • Hermes 长对话
  • 推理期间临时显存

也让 Auto-Fit 更容易把有价值的模型 Tensor 放入 5070 Ti。


8. 为什么开启 Flash Attention?

--flash-attn on

Flash Attention 对长 Context 尤其重要。

它主要可以降低 Attention 阶段的内存开销和内存访问压力。

而 Qwen3.8-Flash-Next 本身又不是传统的全量 Attention。

它采用:

Gated DeltaNet + Qwen Sparse Attention

QSA 每次只关注有限的 Block,而不是简单地让全部历史 Token 做完整 Attention。

因此长 Context 下效率会比传统 Full Attention 架构更加有优势。


9. 为什么 `–parallel 1`?

我的服务器只服务一个 Hermes。

所以使用:


--parallel 1

这是非常合理的。

如果把:


--parallel 4

打开,虽然可以同时处理更多请求,但 KV Cache、Context 和运行资源都要为并发服务。

对于个人本地 Agent 来说,我要的不是:

4个人同时调用。

我要的是:

我一个人用的时候尽可能快。

所以:


Parallel = 1

更符合 Hermes 本地 Agent 的使用场景。


10. Batch 为什么是 1024 / 256?

这里设置:


-b 1024
-ub 256

也就是:


Batch Size  = 1024
UBatch Size = 256

llama.cpp 中:

Batch Size

主要代表逻辑 Batch 上限。

而:

UBatch Size

是实际物理 Micro Batch 上限。

这两个参数对:

Prompt Processing / Prefill

影响通常比单 Token Decode 更明显。

我的目的不是疯狂把 Batch 堆到最大,而是在 16GB 显存环境里取得一个:

速度较高,同时不容易爆显存

的平衡点。

所以最后使用:


1024 / 256

11. 为什么开启 `–cache-prompt`?

这个参数对于 Hermes 其实非常有价值。


--cache-prompt

llama.cpp 的 Prompt Cache 可以复用上一轮请求已经计算过的共同前缀。

如果新请求与上一请求存在相同前缀,可以复用 KV Cache,而不需要重新计算整个 Prompt。

这和 Hermes Agent 的工作方式非常搭。

因为 Hermes 经常会重复包含:

  • System Prompt
  • Agent Prompt
  • Tool 定义
  • 工具调用规则
  • 部分历史上下文

这些内容很多轮对话都是一样的。

所以 Prompt Cache 不能直接让:


tg = 18 t/s

变成:


tg = 25 t/s

但是它可以显著改善多轮 Agent 对话中的:

首 Token 等待时间和整体响应速度。

所以使用 Hermes 时体感会更明显。


12. Hermes 本身并没有让模型“变成 18 t/s”

这一点也需要说明。

Hermes 在这里实际上是:

Agent / 客户端

而真正运行模型的是:


llama-server.exe

llama.cpp 启动了一个 OpenAI Compatible API Server。

Hermes 再连接:


http://127.0.0.1:8081/v1

调用本地模型。

整个数据流其实就是:


Hermes Agent
      ↓
OpenAI Compatible API
      ↓
llama-server
      ↓
llama.cpp
      ↓
CUDA
      ↓
RTX 5070 Ti
      ↕
系统内存 / mmap / SSD

所以:

18 t/s 主要来自 llama.cpp + Qwen3.8-Flash-Next 架构 + 5070 Ti + 当前 Offload 策略。

Hermes 负责的是 Agent、工具调用和交互。


13. 为什么这么大的模型还能有 18 t/s?

把前面的内容合起来,就很好理解了。

它不是:


90GB 模型
↓
90GB 全部塞进 GPU
↓
GPU 计算

而更接近:


大型 GGUF
   ↓
mmap
   ↓
系统 RAM / SSD
   ↓
Lazy Tensor
   ↓
Auto-Fit
   ↓
把最适合放进显存的部分交给 RTX 5070 Ti
   ↓
MoE 每 Token 只激活部分 Experts
   ↓
约 6B Active Parameters
   ↓
CUDA 计算
   ↓
生成 Token

这才是核心。

Qwen 官方给出的结构本身就是:


125B Parameters
≈ 6B Activated Parameters

再加上大量比较适合 Offload 的 N-gram Embedding。

因此不能用传统思维:

“90GB 模型,16GB 显卡肯定跑不动。”

来判断 Qwen3.8-Flash-Next。


14. 实际性能

在我的:


Windows
RTX 5070 Ti 16GB
llama.cpp b10718
IQ4_XS GGUF
128K Context
Flash Attention
Q4_0 KV Cache
Single GPU
Auto-Fit
Lazy Mode
Hermes Agent

环境下,实际聊天生成速度最高可以维持在大约:


17~18 tokens/s

对于这种体积和参数规模的模型来说,这个速度已经非常实用了。

18 tokens/s 是什么感觉?

基本已经不是传统意义上的:

“大型本地模型慢慢蹦字”

而是正常聊天完全可以接受的速度。

写代码、调用工具、运行 Hermes Agent,都已经进入比较实用的范围。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Scroll to Top