我的电脑配置: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 当前显存占用
所以大家可以把我的参数当成一个起点,而不是一个绝对标准。
为什么 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,都已经进入比较实用的范围。





