# LlamaTuner **Repository Path**: shellgithub/llama-tuner ## Basic Information - **Project Name**: LlamaTuner - **Description**: LlamaTuner — llama.cpp 自动调优启动器 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2026-11-01 - **Last Updated**: 2026-11-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LlamaTuner llama.cpp 图形化自动调优启动器(Windows)—— 面向本地大模型的「一键部署 + 自动调优 + 中文 Web 界面」工具。 ![主界面](screenshots/main.png) ## v1.2.47 更新摘要 这一版继续把「说出口的话」和引擎真正看到的账对齐:启动前核内存、核显存的两句现在互相知道 对方的上限,只给两条一起照做能起来的数;KV 的两档按引擎实际占的算;`-ngl 0` 在卡上那块 随上下文长的计算缓冲也进了账,崩溃归因不再把它念成「上下文太大」;上游引擎下 Bonsai 2 不再从下载清单里消失,而是灰显并说明需要切到 PrismML。 - **「降到 N 层以内」先问内存那一侧**:从卡上挪下来的层换到系统内存里站着。1440 格网格里 300 条降层数建议有 **95 条照做后内存接不住**(65 条连页文件都提交不下来、30 条掉页文件、 30 条和 `[内存]` 那句互相打脸)。现在按同一本 `memory_split_mb` 再二分出 `host_floor`, 写出「还能提交多少、物理可用多少」,有下限时说「两头都放得下的只有 N~M」;内存铁定 接不住时不给建议,改说「两头夹住」。重跑:235 条全部诚实 + 65 条夹住,不诚实 0。 - **启动前那两句按 K/V 两档分开算**:引擎分开收 `-ctk` / `-ctv`。两档不同时,FA 开会把 两档一起退回 f16(`-ctk q8_0 -ctv f16` 旧账少 33%),FA 关取均值(少 34%)。400 格网格: 62 格结论不同,其中 17 格旧账完全不报、真账会报警。本机活例:gama-4b `-ctk q8_0 -ctv f16 --flash-attn on -ngl 34 -c 131072` 旧账闭嘴,真账 5203 MB 会 `cudaMalloc failed`。 - **崩溃归因的两个数改成本次现查**:可用显存以前读启动快照(本机 5966 → 真实 1549 MB), 建议从 171776 变成 44544(差 3.9 倍);现在与 `[显存]` 共用启动那一刻的采样。KV 改 q8_0 的实省也按本次配置现算(16k:gama-4b 150 MB、Bonsai-2-4B/9B/NeoHorse 176 MB、27B 352 MB), 真的省 ≥1 MB 才追加,并点明要两档一起改、FA 开着。 - **两条启动前核对给出能一起照做的 N**:显存侧以前不知道内存侧在判红,1152 格里 19 条 上下文建议有 **16 条照做仍崩**;现在显存侧按同一判据复算 `host_keep`,内存更紧就改说内存 那个数并注明来源,内存救不回来就改说「两头夹住」。修后照做仍崩 0,1536 配置自洽网格 0 问题;`[显存]` 与崩溃归因共用同一次 NVML 采样。 - **计算缓冲崩了不再冤枉上下文窗口**:计算缓冲随 `-b`/`-ub` 涨、跟上下文无关。真机配对 (`-c 16384`、`-ngl 99`):`-ub 2048` + 嵌入崩在 2.2GB 计算缓冲,不勾嵌入或 `-ub 1024` 都正常。现在认 `compute pp buffers` 等指纹,给「取消嵌入(这一档多占约 1.1GB)」 「`-ub` 2048→1024」,不再给「上下文改到 N」和无效的 KV 建议。 - **`-ngl 0` 的卡上计算缓冲也记账**:实测约 `n_embd × 2` 字节/token(gama-4b 16k 191 MB → 128k 731 MB;请求 262144 被截到 131072,那块仍按请求的上下文开,1371 MB)。 `preflight_vram` 不再闭嘴,按同一本预算二分上下文并封顶训练上下文;崩溃归因按 `ngl` 分流,`-ub > 512` 时补一句「降到 512 还能再省约 0.3 GB」。 - **上游引擎下 Bonsai 2 灰显而不是消失**:「下载模型」最后一栏是「Bonsai 2 · 需 PrismML」, 9 行灰显不可选、行尾写「需 PrismML 引擎,当前不可用」,标题写「共 N 个推荐模型(M 个需 PrismML)」;点「开始下载」不起下载,而是说明 `PTQ1_0` / `PQ2_0` 在上游会报 `unknown type`、要先切 PrismML。PrismML 下的两栏行为不变。 ## v1.2.46 更新摘要 这一版管的是「程序说出口的话,和它此刻真正看到的数一致」:点【启动服务】之前把内存、显存两本账按 **最终下发的参数 + 此刻的余量**再核一遍,服务崩掉时那行提示按失败那一行自己的指纹分侧归因, 手动【检查更新】的结论也落进静默检查读的那份缓存。三处**都只说话,不拦启动、不改一个参数**。 - **内存侧的分配失败不再冒充显存不足**:`allocating X MiB` 那句只在 CUDA 后端存在,于是真机那次 `-ngl 0 -c 4000000`(引擎明说申请的是 **76.3 GB 的 CPU 缓冲**、当时显存还剩 5.8 GB)被念成 「显存不足…关掉正在用 GPU 的其他程序」,还附一句反向建议「减少卸载层数」。现在归因只认失败那一行 自己的指纹(`CPU buffer` / `ggml_backend_cpu_*` / `分页文件太小` = 内存侧),内存那一支说清申请量、 此刻物理与可提交余量、留在内存的是前几块,以及一个能照做的建议上下文;权重映射不进内存那一支不再 让用户「重新下载这个 GGUF」(白下 6 GB 得到同一个错)。显存那一侧的两句逐字未动。 - **启动前按「此刻可用内存」核一遍最终参数**:那本账以前只在调优链路里说,而且量的是整机容量 —— 手改过上下文/层数、从参数快照或 `config.json` 带回旧参数都不经过调优。现在点【启动服务】前用最终 下发的 `-c/-ngl/KV/-ub` 现查 `ullAvailPhys` + `ullAvailPageFile`:超过**可提交**就说这笔分配会直接 失败(加载阶段一两秒退出),只超过**此刻物理可用**就说「起得来,但差额约 X MB 要从页文件走,生成会 慢一个数量级」,放得下则一个字都不说。8100 格全网格:本轮说话 2527 处,其中 **1004 处是旧口径按整机 算「放得下」而完全没提醒的洞**,误报 0、漏报 0。 - **启动前按「此刻空闲显存」再核一遍**:显存预算里的空闲值以前只在程序启动 / 重扫设备 / 点调优那三处刷, 中间没有定时器。本机活例:卡上另有一个服务在跑,空闲从 5966 掉到 1549 MB,上次会话的 `-ngl 33 -c 8192` 按这本账要 2422 MB —— 点下按钮只有 `cudaMalloc failed`。现在用驱动自带的 `nvml.dll` 现查**这块卡**此刻的 空闲(进程内 0.03 ms,`nvidia-smi` 每趟 75 ms 不能挂在启动按钮上),按调优承诺的同一本账分四档说话, 核显与无卡闭嘴(已并进内存那本)。960 格全网格:显存侧不成立 413 格,**这句话从 0 涨到 413 格, 误报 0、漏报 0**,建议值 413 格全部自洽(那一格装得下、再上一格装不下)。 - **手动【检查更新】的结论也落盘**:启动后那趟静默检查在 24 小时内**根本不联网**,只读 `llama_update_check.json`,而这条缓存以前只有静默检查一个写者。于是「点【检查更新】看到 b11908 → 重启程序」会把刚看到的版本抹掉(旧缓存写着「已是最新」时更糟,重启后一句提示都不给)。现在两条路共用 同一个写入口,重启后 0.038 秒、0 次联网拿到你刚看到的那一条(真联网复核:手动检查 3.67 秒后缓存落 `b11908 / CUDA 12.4`);顺带定死两个口径 —— 认不出带 b 号的 tag 就不写盘(以前会落一条空结论把之后 24 小时每次启动都堵成「无从判断」)、联网失败既不重写也不删除。 - **回归这一侧的两处谎补齐**(开发相关):回退副本套件第一次用一条命令串起来跑,**23 份里 18 份不通过** (10 份因逐字文本漂移直接崩、8 份判定口径错),逐份修好、判定实现收敛成一份,并加了总入口 `scratch/rev_sweep.py` 与自检;临时目录净增 `leak > 0` 从此直接判红 —— 顺带查出回归自己在往系统盘堆 340 个 / 9.0 GB 的合成 GGUF 把 C 盘写满,之后的测试全在半路假崩。全量回归现在是一条命令 31 步。 ## v1.2.45 更新摘要 这一版把调优的账收齐:KV 用 f16 还是 q8_0 补齐到所有架构、部分卸载的 KV 按真实层位收、 上下文不再越过模型训练长度、日志与实际下发对齐,并新起**系统内存**那一本。 - **f16 压上下文的比较推广到全部架构,并加一条绝对下限**:那条比例原先只做在滑窗模型分支里, 稠密模型(llama/qwen3…)在均衡/质量档是无条件 f16 —— 而稠密模型 f16 多出来的只有 KV 精度, 同预算最多白丢 36.8% 上下文。再加一条「本档 f16 连速度档目标都够不着就换 q8_0」,堵住 「选更高的档位反而拿到更短对话」。全网格 11340 组:**档位倒挂 18 处 → 1 处**(只剩 qwen35, 那边固定 f16 是崩溃规避);5940 组新旧对照变化 33 处(0.6%),**上下文只多不少** (+768 / 中位 +3328 / +9728),超预算 0 处;24GB 及以上的卡基本不动。 - **滑窗层位补齐**:部分卸载只收后缀那几块,要知道全局层**在哪几位**;gemma2/gemma3 的 GGUF 里 根本没有 `sliding_window_pattern`,以前按层数平均摊会少算整整一层 KV,写出的 `-ngl` 一启动就 OOM。现在按引擎自己的默认规律补出位置(文件写了的仍以文件为准,个数对不上就不认)。 700 组对照:旧写法按真实位置超预算 21 处 → 新 0 处。 - **上下文不超过模型训练上下文**:下限取 `min(2048, 训练上下文)` 并对齐 256;1024 的模型不再被 顶到 2048,实测调优的降配重试也按同一上限(旧码三次都发 2048,1024 模型直接失败)。 - **全量卸载的「半档」门限改按层数**:留 CPU 的块数上限从固定 2 块改成层数的 1/16(最少 2 块)。 27B@8GB 从 65/2304 变成 61/8192(上下文 3.5 倍)。 - **gemma2 也走滑窗的 KV 规则**:解析层一直有它的滑窗元数据,f16/q8 选择却只点名 gemma3/gemma4。 2B@4GB 速度档装得下就用 f16(不再白丢同上下文 3~4%),9B@10GB 均衡/质量改 q8_0 8192(+28%)。 - **「补第 0 块」的日志与实际下发一致**:以前会先写「显存不足以全量卸载,-ngl 48」再把 `-ngl` 改成 49。合成网格 466,560 个配置里旧规则**日志与实际不符 68 处 → 新规则 0 处**;差 1 MB 的 边界仍如实保持部分卸载,不虚报。 - **调优顺便核一遍系统内存**:以前只算显存,敢给出「`-ngl 1` / `-c 8192`」这种要在系统内存里放 44 GB 的参数而一个字都不提。全网格 102060 格里 7489 格(7.34%)要求的内存比整机物理内存还多, 现在这些格子各得一句能照做的账(换更小的量化 / 降到多少上下文 / 这一档等于没得用),核显与无卡 另起口径。**下发参数一个都不动**(变化 0 处)——超内存的多半是权重本身就超,压上下文救不回来。 ## v1.2.44 更新摘要 这一版集中在调优算法的显存账:部分卸载怎么分、滑窗模型用哪种 KV、全量卸载值不值得。 - **部分卸载按引擎真实放置分账**:`-ngl k` 卸的是「后 k−1 块 + 输出层」,第 0 块只有全量才上卡; KV 只落在被卸载的块上,并按每层实际类型(全局/滑窗/无 KV)收,混合注意力的循环状态也跟着层走。 分配顺序改为「先保住本档目标上下文,再把剩余显存换成层数」。27B 6GB:速度档 32 层/3328 → 30 层/8192,均衡 28/16384,质量 24/32768。 - **滑窗模型(gemma3/gemma4)KV 优先 f16**:同上下文实测快 3~4%;速度/省显存档只要 f16 装得下 本档目标就用 f16,均衡/质量档还要求 f16 能保住目标的 3/4,否则改 q8_0。4GB gama-4b 的 均衡/质量从 2560 回到 8448。 - **全量卸载的上下文下限**:全量只给得出本档目标一半以下、且部分卸载只需留 ≤2 块在 CPU 时, 改走部分卸载。6GB 卡上的 E4B 从 43/3328 变成 41/8192(TG 52.96→40.66,换 2.46 倍上下文); 丢 1/4 的取舍和要留 6 块以上的情形仍优先全量;4K/6K 训练上下文按同一「一半」标准,不误判。 - **调优/实测按选中的计算设备记账**:切引擎后重算硬件快照,调优与基准使用同一份设备事实; 实测缓存指纹按读写同一形状存,缓存真正能命中;「记住的计算设备」重启后回填下拉。 ## v1.2.43 更新摘要 这一版全在引擎这条链上:装哪个包、装坏了怎么办、以及**在运行中换引擎**。 - **未知 CUDA 版本不再被自动选中**:上游将来出现 13.5 / 14.0 这类本程序还不认识的包时,自动档直接跳过、 退回已知能跑的 12.x;用户点名 CUDA 时如实提示「没有可用的包」,不静默换后端。选错包的后果从来不是 报错,而是引擎起来后闪退。 - **解压先落暂存目录**:包损坏 / 解到一半失败不再留下「有目录、没 exe」的半成品版本(版本下拉看得见 却一启动就崩)。校验通过后还会删掉**这一包里没带**的 `ggml-cuda.dll` / `ggml-vulkan.dll`,CPU 包盖在 CUDA 目录上不再被继续认成 CUDA;cudart 补齐包不清,冷启动单独下引擎搬运进 `bin\` 前同一道清理。 - **后台「已是最新」缓存要同时对上 build 与推理后端**:把后端从「自动」切成 CUDA/Vulkan 后,旧口径的 结论不再继续沿用。 - **运行中换引擎会把硬件快照重算一遍**:后端按新目录的 dll 重认、自动档按新引擎的设备清单重点名独显, 并补上 N 卡那句「别把 Vulkan 派到核显」。以前换完引擎快照还停在旧引擎(`backend=cuda` 配 Vulkan 目录), 代价本机实测看得见:实测校准把「钉在核显」判成 GPU 未使用,把一套 CPU 参数(线程 6→11、batch 2048→1024) 按独显指纹写进缓存,下次自动调优直接命中它。 - **在途的「重扫设备」不再盖掉新引擎的清单**:探测跑在后台(0.2~1 秒,超时最长等 25 秒),切版本卡在 中间时旧引擎那份 `[CUDA0]` 清单会连同重挑的设备一起落地,而两趟探测里先回来的未必是后探的那次。 现在回调会核对探测用的是哪个 exe,对不上就作废并在日志里说明。 - **引擎包下载会对「连接就没建立起来」那一类重试**:模型有多个源、不通就换;引擎包的镜像在取列表时就 钉死了,本机下 b11850 撞过一次 `WinError 10060`——以前整条链停在瞬时超时上,要人重新点一次才从断点续传。 模型下载的重试口径不变(不在同一个地址上干等三轮超时)。 ## v1.2.42 更新摘要 - **思考预算进界面**(新):推理模型「想多久」终于能在界面里调。展开【更多参数】→「思考」, 六档:自动(跟随模板)/ 开(不限)/ 快(512 token)/ 中(2048)/ 深(8192)/ 关。 落成引擎的 `-rea` + `--reasoning-budget`,引擎不支持时自动隐藏整行;选择进配置、`start-*.bat`、会话记忆。 本机实测(NeoHorse-1-4B,2K 上下文):关思考 1.11s / 43 token,512 预算 1.87s / 85 token, 不限 2.98s / 143 token —— **慢卡先降预算,别直接关**。 - **gemma4 的显存账按真实结构算**(新):读 `sliding_window_pattern`,只让全局层随上下文增长, 滑窗层按 `min(窗口, ctx)` 单独扣固定缓存;权重按 GGUF 张量表算,由引擎留在内存的 `per_layer_token_embd` 不计入显存。Gemma 4 E4B 在 6GB 卡上从 `ngl 37 / ctx 2816 / TG 29.4` 变成 **`ngl 43 / ctx 32768 / TG 52.3`**。 - **gemma4 的 KV 优先 f16**:本机实测 f16 比 q8_0 还快 4%,四个档位都先试 f16,装不下才退回 q8_0。 - **内置下载清单新增三条实测跑得好的模型**:Gemma 4 E4B(Q4_K_M,4.98GB,32K 约 52 t/s)、 gama-4b(Q4_K_M,61~64 t/s)、NeoHorse-1-4B(Q5_K_M,工具调用强化);与远程清单按「仓库 + 文件名」 合并,远程缓存未过期也能看到新条目。 - **「更多参数」扩成三行**(采样 / KV、投机、思考):收起 77px、展开 162px,参数卡不再为次要项长期留白。 ## 这是什么 LlamaTuner 是一个单文件 EXE 工具,帮你把 llama.cpp 本地大模型跑起来,并自动算好最优参数: - **硬件自动探测**:CPU / 内存 / NVIDIA GPU 显存 / 驱动版本 - **GGUF 元数据解析**:层数、KV 头、训练上下文等 - **自动调优**:按速度 / 均衡 / 质量 / 显存四档策略,自动生成 llama-server 参数(v1.2.44:部分卸载按引擎真实放置分账 KV、滑窗模型优先 f16 KV、全量卸载只给零头上下文时改走部分卸载;v1.2.45:f16/q8_0 的比较补齐到所有架构并加「不低于速度档」的下限、滑窗层位按真实位置收 KV、上下文不超过训练长度、另核一遍系统内存并在超内存时给出一句能照做的账;v1.2.46:点【启动服务】前再按「最终下发的参数 + 此刻的可用内存 / 空闲显存」各核一遍,缺口说成一句能照做的账——只说话,不拦启动、不改参数;v1.2.47:两条核对互相收口(只给两条一起照做的数)、KV 按 `-ctk`/`-ctv` 分开算、`-ngl 0` 的卡上计算缓冲也记账——照旧只说话,不拦启动、不改参数) - **实测校准**:真实加载模型跑基准(PP/TG/显存占用),按实测数据校准参数,失败时三级降级重试。点「① 自动调优」必定重新跑基准,只有启动时的自动调优才复用上次实测结果(v1.2.23 明确) - **思考预算**(v1.2.42):【更多参数 → 思考】六档——自动(跟随模板)/ 开(不限)/ 快 512 / 中 2048 / 深 8192 / 关,落成引擎的 `-rea` + `--reasoning-budget`。慢卡先降预算再考虑关;引擎不认这两个开关时整行隐藏,配置、`start-*.bat`、会话记忆都会带上这个选择 - **滑窗模型的显存按真实结构算**(v1.2.42):gemma4 读 `sliding_window_pattern`,只有全局层随上下文增长,滑窗层按 `min(窗口, ctx)` 单独扣固定缓存;权重按 GGUF 张量表算,引擎留在内存的 `per_layer_token_embd` 不占显存。Gemma 4 E4B 在 6GB 卡上因此能给出 `ngl 43 / 32K 上下文`,实测 TG 52.3 t/s(旧算法只敢给 `ngl 37 / 2816`,TG 29.4)。gemma4 的 KV 也改成「f16 装得下就用 f16」——实测比 q8_0 快 4% - **会话记忆**:记住上次使用的模型 / 档位 / 调优模式 / 端口,调优好的参数也会被保存,下次启动直接沿用而不重新调优(换模型、换档位、升级 llama.cpp 或硬件变化时自动失效,不会硬套不匹配的旧参数) - **GPU 共用检测**:启动时列出除本程序外仍在用 GPU 的进程,硬件卡片内一行橙色弱提示(不弹窗)告诉你是谁在抢显卡、当前显存已用多少——共用 GPU 会把生成速度从 40t/s 级拖到 10t/s 级,而参数看起来完全正常 - **冷启动引导**:空目录双击即可自动补齐运行时 + 中文界面 + 推荐模型 - **模型下载**:推荐清单一键下载,也支持「自定义下载」——任意 HuggingFace 仓库的 GGUF(含 Unsloth 微调上传的模型及清单未收录的量化版本),多源轮询(ModelScope 排首位,国内直连实测可用)+ 断点续传;某个源连不通或仓库不在它上面(10060 超时、TLS 握手被断)会自动换下一个,且坏源会被作废、不会一次失败就永久钉死(v1.2.27)。内置清单已收录本机实测跑得最好的三条 4B 级模型——Gemma 4 E4B、gama-4b、NeoHorse-1-4B,并与远程清单按「仓库 + 文件名」合并,远程缓存还在有效期时也能看到新条目(v1.2.42) - **在线更新**:从 GitHub 镜像下载 llama.cpp 新版本,按驱动版本智能选包(含无 GPU 兜底 CPU 包);启动 60 秒后静默检查一次,发现新版仅在版本行弱提示、不弹窗。未知 CUDA 版本不自动选、解压先进暂存目录再校验、换后端时清掉旧后端 dll、缓存要同时对上 build 与后端(v1.2.43);手动【检查更新】的结论与启动那趟静默检查写同一份缓存,重启后不再退回旧结论,认不出 b 号 tag 不写空结论、联网失败不删旧结论(v1.2.46) - **运行中换引擎会把硬件快照重算**(v1.2.43):【llama 版本】切到另一套引擎(CUDA ↔ Vulkan)后,后端按新目录的 dll 重认、自动档按新引擎的设备清单重点名独显、N 卡机器补说「别把 Vulkan 派到核显」,日志写 `[引擎] 后端 CUDA → Vulkan`;在途的「重扫设备」结果若来自另一套引擎则作废,不会把旧清单盖回来。细节见 `docs/LlamaTuner_运行时换引擎的后端识别_20261024.md` - **Bonsai 2 / PrismML 引擎**(v1.2.36):版本行新增「Bonsai 2 引擎…」,自动查询 PrismML 的 Releases 并按本机平台下载 CUDA / Vulkan / CPU 包(CUDA 主包会一并装同版本 cudart),网络查不到时可手动导入 zip;装好后在版本下拉里与官方引擎并列切换。模型下拉新增 Bonsai 2 分栏(2B / 4B / 9B / 27B),「普通模型」栏照旧。PrismML 不参与 ggml-org 的 build 号比较,启动静默检查和「检查更新」会跳过并说明原因;点「下载并更新」前会确认「装完切回官方引擎,Bonsai 2 将无法加载」。官方引擎加载 Bonsai 报 `unknown type` / `unknown architecture` 时,提示改点「Bonsai 2 引擎…」。上游引擎下这 9 条仍列在「下载模型」最后一栏「Bonsai 2 · 需 PrismML」(v1.2.47:灰显、不可下载,点下载会说明需先切引擎) - **程序自升级**:LlamaTuner.exe 自身从 Gitee 检查新版,下载 → sha256 校验 → 隐藏脚本替换并校验:等旧进程退出后覆盖 exe(最长约 1 分钟),逐字节校验通过才写一枚「已应用」戳、拉起新版并自毁临时目录,下次启动时日志安静回执「已从 vX 更新到 vY,替换成功」;万一安全软件把自动重开那一跳拦了,请手动双击**安装目录**里的 exe(v1.2.15+,v1.2.18 修复重启竞态,v1.2.19/1.2.20 弹窗全部统一为自定义风格,v1.2.20 加固下载完整性与更新来源校验,v1.2.22 重做替换脚本:逐字节校验、外部命令走 System32 绝对路径、升级结果只作弱提示,v1.2.24 重启判活改为认启动脚印并补启 3 次,v1.2.25 实测脚本抢先拉起的新版单文件 exe 起不到界面、一度取消自动重启,v1.2.26 修掉「安装路径含 `%` 时脚本静默不替换」并把凭据挪出会被自毁的临时目录、成功与失败不再同报,v1.2.32 按真实时序复现查明当年是「脚本自己 taskkill 把刚起来的实例当僵尸杀了」并恢复自动重开——脚本只 start、绝不判活绝不杀) - **中英热切换 Web 界面**:内嵌亮色聊天页,流式输出、思考折叠、Markdown;中英文在同一页里,**运行中随时切换、即时生效,不用重启服务**(v1.2.27)。流式渲染改成按帧合并的增量追加,不再每个分片重建整个气泡 —— 实测一条回答的整块重写从 212 次降到 1 次。内嵌页面每次启动按内容指纹自动刷新,升级后不会再拿到旧页面 - **VC++ 运行库检测**:启动前检测缺失并引导安装 - **系统托盘**:最小化到托盘,支持热键唤回(v1.2.24 起唤回会显式还原窗口) - **任务栏按钮**:无边框主窗口与全部弹窗统一由 `ensure_taskbar_style()` 收口样式——清掉 Tk 挂的 `WS_EX_TOOLWINDOW`、挂上 `WS_EX_APPWINDOW`、补回 `WS_MINIMIZEBOX`,按钮不再时有时无、点击也能正常最小化/还原(v1.2.24;最大化仍走程序自身的工作区铺满逻辑)。v1.2.37 起弹窗改为主窗口的拥有窗口(原生 owner + `WS_POPUP`),不再每个弹窗多占一个任务栏按钮,主窗口最小化/还原时同进同退 - **OpenAI 兼容 API**:一键复制 API 地址,供其他软件调用。「API 说明」弹窗写明 Base URL、`model` 字段怎么填、可用端点(含查本次上下文预算的 `GET /props`)、messages 的角色顺序要求,以及超限回执的形状(v1.2.28) - **两类 400 分开收口**(v1.2.28):① Gemma-3 那一族的自带模板写了「角色必须严格交替」的硬校验,第三方客户端连着发同角色就被拒,而报错文案是误导性的 `Unable to generate parser for this template` —— 新增「宽容模板」开关,去掉那段校验后按 `--chat-template-file` 注入(引擎不支持就不注入;默认关,正常交替请求的渲染结果与原模板逐字节一致)。② 一发请求超出 `-c` 预算时,自带网页不再把 400 甩成报错气泡:发送前按 `n_ctx` 省掉最旧的几条(气泡注明省了几条),撞墙就用回执里的真数校准估算系数、多丢一条重发;单条本身就超长时只撞一次并给出出路(分段发 / 调大上下文后重启) - **推理后端与计算设备可选**(v1.2.29):新增「推理后端」下拉(自动 / CUDA / Vulkan / 纯 CPU)和「计算设备」下拉(自动优先独显 / 交给引擎自己挑 / 指定某块卡,真的下发 `--device`)。AMD/Intel 卡从此不再只有 CPU 一条路;Vulkan 引擎装进 `versions\-vulkan\` 独立目录,与同 tag 的 CUDA/CPU 目录隔开(三家的 `ggml-*.dll` 同名不同物,挤一个 `bin\` 里加载到哪块全看搜索顺序)。点名某档时选不出来就报错,**绝不静默换成别的后端**。N 卡上落到 Vulkan 会按本机实测提醒一句(提醒的具体数字与更正见下一条)。 - **Vulkan 上真的调得出好参数**(v1.2.30):以前实测校准在没有 `nvidia-smi` 的机器上读不到显存,就顺手把 GPU 判成「没用上」,线程数与批量一起退回 CPU 档 —— 这正是「Vulkan 装好了却调不出好参数」的根因。现在把两件事分开:读不到占用只标「未确认」并**跳过显存校准**,GPU 档参数照用,日志明写「未读到显存,本次未做显存校准」。顺带修掉一条通用于两个后端的老错:满卸载要写 `-ngl 层数+1`(输出层也要上 GPU),本机实测生成速度 +24%(CUDA 38.9→48.3、Vulkan 34.4→42.9 t/s),代价约 82 MB 显存。`--device` 也不再携带当前引擎认不出的过期设备 id(真机撞见过:服务打印一整屏 usage 直接退出,界面只表现为「点启动没反应」)。 - **更正 v1.2.29 那句提醒**(v1.2.30):当时写的「N 卡上 Vulkan 2.92 t/s 比纯 CPU 8.06 还慢,建议改用纯 CPU」是错的——两个数字来自不同配置,不该并排比。同一台机器(Optimus 笔记本,NeoHorse-1-4B Q5_K_M,`-c 8192` 满卸载)重测:CUDA 48.9 > Vulkan 钉独显 43.2(提示处理还更快:PP 388 vs 260)> 纯 CPU 4.5 > **Vulkan 被派到核显 2.8**。真正要避开的是核显,不是 Vulkan;程序现在按这组数字提醒,且「计算设备」自动档就是为挑独显而做的,仍然只提醒不拦阻、不替用户改选。 - **向量嵌入按需开**(v1.2.29):`/v1/embeddings` 默认关闭(开着要多占 0.2~1.1GB 显存),勾上才注入 `--embeddings --pooling mean`;引擎不认这两个开关时就不注入,不会因为一个它不认识参数把服务弄崩。 - **显存预算算全了**(v1.2.29):权重和 KV 之外那块常驻开销(计算缓冲 / CUDA graph / 上下文结构体)实测随「物理批量 `-ub`」涨(256/512/1024/2048 → 143/179/257/401 MiB,与「批量 `-b`」无关),调优先从预算里扣掉再算 `-c`;嵌入的显存也按 `-ub` 那一档预留。端到端复核下来公式与真机净占用差在 ±32 MiB 以内。另有启动前的参数自检与顺手生成的 `start-<模型名>.bat`(对含 `%`、`&`、中文的路径做了 cmd 解析层转义)。 - **界面重新排版**(v1.2.31):「调优参数」卡只常驻真正要调的 7 项(GPU 层数 / 上下文 / 线程 / 批量线程 / 批量 / 物理批量 / 端口),高度 183px → **77px**;温度 / top-p / top-k / min-p / KV-K / KV-V 收进标题右边的【更多参数(采样与 KV)▾】,用 `grid_remove()` 折叠——控件和它绑的变量都还活着,所以自动调优回填、手工改值落盘、会话记忆恢复全部照旧。推理后端 / 计算设备 / llama 版本搬进「硬件检测 / 目录」并合成两行(那是「这台机器 + 这套引擎」的属性,和参数微调无关);底部「模型 / 调优策略」卡六项并成四行(267px → 167px);10 个主操作按钮收进【复制 / API ▾】下拉并按「主流程 / 看结果 / 环境」分三段(原来那排要 1216px,窗口只有 982px,最右边的按钮被裁到看不见)。五张卡合计 699px(可用 719px),底部「运行日志」第一次完整回到屏内(219px,约 12 行)。 - **修掉一处静默丢内容**(v1.2.31):硬件信息行是 `height=1` 又开了 `wrap="word"` 的只读文本,加上「引擎后端」那段实测 991px,超出卡片可用宽度后折到第二行、第二行又被高度吃掉——等于屏幕上凭空少一截信息。现在后端归属改由版本行右边那句提示与日志里的 `[引擎]` 说明,信息行回到 875px。 - **首次运行可以只下引擎**(v1.2.31):弹窗多一个【单独选组件】出口,勾上缺的任意一项再开始。只勾「llama.cpp 引擎运行时」就只按「推理后端」和显卡驱动选 CUDA/Vulkan/CPU 包下载,不会顺手写界面、也不会弹模型清单催你下载;【📦 一键补齐】走同一个勾选框,日志里的步骤编号按勾了几项来写(1/1、1/2…)。 - **换台机器列不出计算设备时会说明原因**(v1.2.31):`--list-devices` 的解析不再只认 `Vulkan*` / `CUDA*` 前缀,`DP4`、纯顺序号这类写法都能认;一个都列不出时,硬件那一行旁边直接写清原因(缺 DLL / 驱动过旧 / 该后端不可用 / 这版引擎的输出认不出),不再只给一个空白下拉框。设备标签改成「Vulkan0 · 显卡名 · 空闲 N/M MiB」,一眼能看出选的是哪块卡、还剩多少显存。 - **更新完自动重开**(v1.2.32):替换脚本在逐字节校验通过、落「已应用」戳之后把新版 `start` 起来。v1.2.25 曾把这一跳砍掉,理由是「脚本拉起的进程三次都没进自解压」;这次按真实时序(老进程握着 exe → copy 重试到放行 → `fc /b` → 落戳 → start → 删临时目录)用**生成器真产出的脚本**复现,三轮都在 3~5 秒内新起实例并开出窗口——当年对不上账的原因是**单文件包一个实例是两个进程**(引导器 + 跑 Tk 的子进程),窗口只挂在子进程上,而旧脚本按自己 Popen 的那个 pid 判活,看不见窗口就补启、收尾 `taskkill`,把刚起来的实例当僵尸杀了。所以新脚本守两条红线:**只 start,绝不判活、绝不 taskkill**;start 必须排在 `fc /b` 之后(拉起只 copy 了一半的 12MB 文件就是当年那句「Failed to load Python DLL」)。顺带排除一条看起来更靠谱的路:交给 Explorer 外壳拉起(`explorer.exe "路径"`)实测 60 秒一个新进程都没有。装了安全软件的机器仍不保证这一跳,所以确认框和日志都留了「没自动重开就手动双击安装目录里的 exe」。**这一跳由旧版程序生成脚本,因此只对「从 1.2.32 及以后往上升」生效**。 - **程序产生的文件收进一个文件夹**(v1.2.33):以前配置、启动 bat、实测结果、会话记忆、界面、探测缓存、图标、日志摊在目录根上,跑几次就多出一堆文件;现在全收进 `lt_data\`,第一次启动自动搬家(整目录搬、搬过不再动),老位置空着时仍回老位置读,所以升级后配置不会凭空消失。`bin\` `models\` `versions\` 是 llama.cpp 自己的布局,**一概不碰**(外部 bat 和 `llama-server` 都按相对路径找它们)。顺带修掉一个真会丢配置的坑:`shutil.move` 在 Windows 上 rename 撞名抛异常后会改用 copy 把目标盖掉,现在同名一律不覆盖、原样留在老位置并在日志里说清楚;搬过去的 `start-*.bat` 里那句 `cd /d "%~dp0"` 会改成指向引擎目录,搬完照样能双击。读路径不再顺手建目录(没写过东西的用户不会多出空壳),升级凭据(`update_applied.txt` / `update_error.log`)新旧两个位置都认。回归 55 项盯着搬家、幂等、回退、同名不覆盖与 bat 的 cwd。 - **非 N 卡机器认得出显卡**(v1.2.34):「本机有没有 GPU」以前只有两条证据,且都不靠谱——`nvidia-smi`(非 N 卡本来就没有)和**当前这套引擎**的 `--list-devices`(装着 CPU 包时同样空)。于是 AMD/Intel 机器首装时一路被推纯 CPU 包,而它唯一能上 GPU 的构建永远等不到被选中。现在补第三条**不依赖引擎**的证据(`Get-CimInstance Win32_VideoController`)用来回答「有没有卡、谁家的、该装 CUDA 还是 Vulkan」,而**预算、`-ngl`、实测校准仍然只认量到显存的那条**(OS 只给名字,`AdapterRAM` 32 位截断还把共享内存算进去,不能拿来算预算)。同时修掉独显名里的 `(TM)`/`(R)` 打断匹配:认不出独显就会退回「总量最小」那条规则被核显抢走,假机器实测 `Vulkan0`/8072 MiB/预算 6458 → `Vulkan1`/12228 MiB/预算 **9782**。基本显示驱动、远程桌面、虚机适配器、`ROOT\` 这类虚拟设备先过滤掉再谈「有卡」,所以虚机不会因此被误判成有 GPU。OS 枚举加进程内缓存(每点一次调优都会重跑检测,那趟 powershell 实测 0.5~1.5 秒),**只缓存「问成功过」**——查询抖动不会把整段会话锁成「没 GPU」,「重扫设备」时清掉。`Radeon RX Vega 8/11` 这类 APU 核显不当独显(Vega 56/64 两张真独显仍认得出)。文案跟着改准:不再印「驱动None ccNone」,有卡却用不上时点名那块独显并说该装哪套构建,核显机器说明共享内存与带宽的代价(预算数字未动)。 - **硬件信息行放不下时按像素自裁**(v1.2.34):那一行是 `height=1` 的只读文本,**超出宽度的部分不是折行而是看不见**,被切掉的正好是行尾的显存/驱动/cc。以前只能靠「猜一个更短的字符串」,换台名字更长的机器或把窗口拖窄就又被切了——同一句在 96dpi 进程里 736 px、在 125% 缩放的 exe 里 902 px,而行宽固定 869 px。现在运行时用控件自己的字体和真实宽度量,按 **cc → 驱动号 → CPU 名 → 卡名** 的顺序依次让路,核/线程、内存、显存三个数字留到最后,窗口拖窄会重裁,实在放不下才截尾并留省略号(截尾是看得见的截尾)。回归 88 项:八台假机器 A–H 的检测与选包,加上 125% 缩放与拖窄窗口的版面。 - **引擎行与 API 兼容行收口**(v1.2.37):`Bonsai 2 引擎…` 挪到「下载并更新」之后,切到 PrismML 时上游的「检查更新 / 下载并更新」整组自动隐藏,切回官方引擎恢复原位;GPU 共用提醒压成一行,换行宽度跟随卡片实际可用宽,不再固定 760px 提前折行。API 兼容行的两个开关文案压短,向量嵌入说明从开关行移出、单独占行并按宽度折行——改前勾选嵌入后整行要 2511 px、可用只有 956 px,右侧开关和说明会被卡片边缘直接裁掉;PrismML 的版本目录名(`prism---<平台>`)不再重复接 `[build …]`;最小窗口宽度 920→1010,右侧「端口」、English、收进托盘等控件不再被静默裁切。细节见 `docs/LlamaTuner_界面收口_20261020.md`。 - **启动不再重复付探测的钱**(v1.2.38):引擎 `--help`(182.7 ms → 0.3~0.5 ms)、聊天模板解析(143.7 ms → 0.2~0.4 ms)、`--list-devices` 设备清单(`detect_hardware` 584~667 ms → 111~121 ms)、CPU 与显示适配器(PowerShell CIM 3.3~3.9 秒 → 0.7~0.8 ms;非 N 卡机器每次启动那 2~3 秒 → 0 ms)全部落盘复用,`scan_models` 从「每发现一个模型重刷一次下拉」改成一次扫描只刷一轮(100 个模型 65.4 ms → 0.8 ms)。缓存写在 `lt_data/build_cache/`,按 exe/模型的(路径, mtime, 大小)失效,探测失败不写缓存,所以换引擎版本、换模型文件都会自动重探。细节见 `docs/LlamaTuner_启动缓存与设备探测_20261020.md`。 - **摘掉四处「点一下冻住几秒」**(v1.2.38):这几处都是子进程或 HTTP 站在按钮回调(主线程)上,窗口标题会挂「未响应」。① 「重扫设备」4213 / 3386 ms → **40 / 35 ms**;② 「下载模型」主线程最大冻结 3020 / 3000 ms → **601 / 271 ms**(弹窗出现时刻没变,该等的网络照等,只是不再占用界面),另加 15 分钟失败冷却,断网 / 镜像被墙的机器不再每点一次重付一遍;③ 「API 说明」在服务不回话时 2649 ms、服务已经不在了时 2105 ms → **71 / 43 ms**(那个 `n_ctx` 真数改由后台就绪线程问一次并存下来,主线程只读缓存——本机实测连一个没人听的本机端口也要约 2.05 秒才报 `ConnectionRefused`,「当场问一次」在崩溃之后恰好是最贵的时刻);④ 启动期 8 次整树 `update_idletasks`(合计 604 ms、单次最大 341.4 ms)→ **0 次**,`set_status` 每次 16~125 ms → ~0.3 ms。 - **两条行为修正**(v1.2.38):① 点「刷新」不再**静默启动一整轮基准实测**——`scan_models` 在模型没换时也会调 `on_model_change()`,最终落到含义是真跑基准的那条链(起服务、把模型加载进显存、测 PP/TG,几十秒到几分钟);现在只有模型确实换了才走。② 模型路径无效时不再显示「正在解析模型元数据...」——那行被排版合并粘成了 `return self.set_status(...)`,Python 读作 `return <表达式>`:静默返回、状态还在谎报。 - **Bonsai 2 清单补齐 2B / 4B(v1.2.39)**:PrismML 引擎的「下载模型 → Bonsai 2」栏从 9B / 27B 四条扩到 **2B / 4B / 9B / 27B 九条**,按体积升序——2B `PTQ1_0`/`PQ2_0`(约 0.4/0.5GB)、4B `PTQ1_0`/`PQ2_0`/`PQ2_0-MTP`(约 0.9/1.1/1.2GB)、9B `PTQ1_0`/`PQ2_0`(约 1.9/2.3GB)、27B `PTQ1_0`/`PQ2_0`(约 5.7/7.2GB)。4B MTP 包选中后投机类型设 `draft-mtp`(n-max 2);本机实测聊天 93→100 t/s(+7%)、复述 93→103(+11%)、代码 93→87(-6%),显存多占约 330MB,代码类任务建议关投机。顺手修掉一个真问题:Bonsai 2 的 `nextn_predict_layers` 在 GGUF 里排在 `tokenizer.*` 之后(实测偏移约 11MB),界面只读头部元数据、读到 tokenizer 就停,导致 MTP 包会被判成「没有 MTP」;现在按文件名里的 `-MTP-` 兜底识别(引擎自己读全量元数据,不受影响)。细节见 `docs/LlamaTuner_Prism模型扩充与MTP实测_20261021.md`。 - **运行期四笔账收掉**(v1.2.39):① 服务日志不再一行一个 Tk 事件——12000 行突发 5045.7 ms → 1278.9 ms,事件 12001 → 190,零星行仍当场发;② 「自动调优」后台复测硬件不再隔几十毫秒问第二遍空闲显存,N 卡 `work()` 中位 126.1 → 63.3 ms,非 N 卡或检测失败仍补问;③ 服务就绪轮询 2.0 → 0.25 秒,热启动白等 1.5~1.8 秒 → 0.1~0.2 秒,实测校准的「加载 x.xs」同步变准(一次校准少等约 5 秒);④ 新引擎的 `--parallel` 默认 auto(实际开 4 槽),程序固定 `--parallel 1`:上下文不减、PP/TG 不降,4B `-c 8192` 省 322 MiB、27B `-c 2048` 省 244 MiB,老引擎不认就不注入。细节见 `docs/LlamaTuner_启动缓存与设备探测_20261020.md` 第六~九轮。 - **qwen35 量化 KV 崩溃修复**(v1.2.40):PrismML 引擎上 qwen35 系模型(Bonsai 2 2B / 4B / 4B MTP / 9B / 27B、NeoHorse)用 q8_0 KV 时,服务能就绪、`/health` 与 `/props` 都正常,**第一次生成才 `CUDA error: unspecified launch failure`**(界面只看到 `WinError 10061`)。现在自动调优四个档位统一固定 f16/f16;旧版本存下的 q8_0 会话快照、手改的配置和界面里手填的 q8_0,在恢复参数与启动前都会自动改成 f16/f16 并说明原因(非 qwen35 不动)。实测校准失败时的错误信息改为带引擎日志末尾,直接显示 CUDA 报错,不再只剩 `WinError 10061`。本机实测:9B PQ2_0 f16 TG 45.25 t/s;4B PTQ1_0 f16 加载 2.31 s、PP 274.3 / TG 98.93 t/s、显存 1383 MiB。细节见 `docs/LlamaTuner_Prism模型扩充与MTP实测_20261021.md` 第六节。 ## 快速开始 1. 下载 `LlamaTuner.exe`(见 Gitee Release) 2. 解压到任意目录,双击运行——`bin/`、`models/`、`versions/` 是 llama.cpp 的目录,程序自己产生的文件从 v1.2.33 起都写在 `lt_data/` 这一个文件夹里(老版本摊在根目录的会第一次启动自动收进来) 3. 首次运行会自动检测环境,弹窗引导「一键补齐」: - 检测 VC++ 运行库(缺失则引导安装) - 下载 llama.cpp 运行时 - 写出中文 Web 界面 - 选择并下载推荐模型 4. 完成后点「启动」,浏览器打开 `http://127.0.0.1:8766` 即可对话(8765 常被其它调试服务占用,默认端口是 8766) > 推理模型等得久:展开【更多参数 → 思考】选「快(512 token)」或「关」;改完重启服务生效。 硬件要求:Windows 10 及以上,6GB 以上内存;GPU 推理支持 NVIDIA(CUDA 包)与 AMD / Intel 独显(Vulkan 包,v1.2.29 起),无 GPU 或驱动过旧时自动兜底 CPU 包。 ## 目录结构 ``` . ├── src/ # 源码 │ ├── llama_tuner.py # 主程序(约 11000 行) │ ├── webui_assets.py # 内嵌 WebUI(base64,由 make_webui_assets.py 生成,勿手改) │ ├── make_webui_assets.py # webui_src/ → webui_assets.py(改完页面必须跑,--check 可校验有没有忘) │ ├── webui_src/ # 内嵌聊天页的源文件(中英双语在同一份 index.html 里) │ ├── LlamaTuner.spec # PyInstaller 打包配置 │ ├── mkicon.py # 图标生成脚本 │ ├── llamatuner.ico # 应用图标 │ └── qrcode.png # 作者公众号二维码(关于对话框) ├── screenshots/ # 界面截图(README 用) ├── webui/ # 中文聊天界面(也内嵌于 EXE) │ ├── index.html │ └── sw.js ├── configs/ # 推荐模型清单(远程 gist 也可动态加载) │ └── models_recommended.json └── docs/ # 开发文档(按时间线) └── LlamaTuner*.md ``` 运行时落盘位置(v1.2.33 起):程序自己产生的文件都在安装目录的 `lt_data/` 一个文件夹里——`lt_data/configs/`(配置、实测结果、会话记忆、模型清单缓存)、`lt_data/webui/`、`lt_data/build_cache/`、`lt_data/start-<模型名>.bat`、图标与日志;老版本摊在根目录的会在第一次启动自动收进来,老位置空着时仍回老位置读。`bin/`、`models/`、`versions/` 是 llama.cpp 自己的目录,程序不往里收东西也不搬动。仓库根的 `configs/`、`webui/` 是随源码发布的清单种子与页面副本,不是运行时的写入位置。 ## 推荐模型清单 内置 / 远程(gist)清单,含 Qwen2.5 / Qwen3.5 / Qwen3 / NeoHorse / MiniCPM3 / gama / Gemma 4 / Phi-4-mini / Llama-3.2 等,均为 GGUF 量化版,按体积与显存适配 6GB 及以下显存。 本机(GTX 1660 Ti 6GB)实测跑得最好的三条 4B 级模型已进内置清单:**Gemma 4 E4B**(Q4_K_M,4.98GB, 32K 上下文约 52 t/s,中文与推理质量好)、**gama-4b**(Q4_K_M,61~64 t/s,短上下文最快)、 **NeoHorse-1-4B**(Q5_K_M,工具调用强化)。选型原则:优先 Unsloth 量化;磁盘有限时一次只下一个, 测完记录再换下一个。 **自定义下载**:清单之外的模型(如 Unsloth 微调上传的 GGUF、仓库里其他量化版本),点「下载模型 → 自定义下载…」,粘贴 HF 文件链接即可下载(自动识别仓库与文件名,国内自动走镜像加速),无需更新清单。仅支持 GGUF 格式。 > 注意:Unsloth Python 库下载的 bnb-4bit safetensors / LoRA 权重不是 GGUF,llama.cpp 无法直接加载,需在外部转换(合并 LoRA → 反量化 → llama-convert-hf-to-gguf → llama-quantize)后再导入。 ## 关键参数说明 | 策略 | 上下文目标 | 适用场景 | | --- | --- | --- | | 速度 | 8192 | 追求最快响应 | | 均衡 | 16384 | 日常使用(默认) | | 质量 | 32768 | 长文 / 复杂任务 | | 显存 | 8192 | 显存紧张时 | 四档策略上下文目标:速度 8192 / 均衡 16384 / 质量 32768 / 显存 8192。 启动参数示例: ``` llama-server -m 模型.gguf --ctx 16384 --n-gpu-layers 33 --threads 8 \ --jinja --cache-reuse 256 --flash-attn on ``` ## 从源码构建 ```bash # 依赖:Python 3.11+ + PyInstaller pip install pyinstaller cd src pyinstaller --clean --noconfirm LlamaTuner.spec # 产物在 dist/LlamaTuner.exe ``` ## 作者与开源 - **作者**:李叔AI - **开源地址**: - **公众号**:扫码关注「李叔AI」 ![公众号二维码](screenshots/qrcode.png) ## 文档 开发过程文档见 `docs/` 目录,按时间线记录了完整演进: - 界面 / 图标 / 托盘 / 版本切换 - 双模式调优(理论估算 / 实测基准) - WebUI 中文界面 / 亮色改造 - 冷启动引导 / 远程模型清单 / 下载模型入口 / 自定义仓库下载 - GitHub 镜像 / 无 GPU 匹配 CPU 包 / 速度暴跌修复 - 断点续传 / VC++ 运行库检测 / API 调用入口 - 作者标注与公众号二维码(关于对话框) - 升级链路完善(llama.cpp 自动检测 / GitHub 清单截断修复 / 自升级重启修复,2026-10-08) - 会话记忆与 GPU 共用检测(调优模式与参数跨启动沿用 / 抢显卡程序提示,2026-10-08) - 自升级替换脚本重做(校验后再重启 / Temp 残留回收 / 升级结果可见,2026-10-08) - 自动调优按钮失效修复(手动点击一律重新实测 / 实测缓存只在启动时复用 / 缓存指纹含引擎版本,2026-10-08) - 自升级重启判活修复(不再被「举着解包错误弹窗的僵尸进程」骗成成功 / 启动脚印作证 / 自动补启 3 次,2026-10-09) - 任务栏按钮样式修正(按钮时有时无 / 点击不响应最小化还原 / 托盘唤回停在最小化态,2026-10-09) - 自升级取消自动重启(真机端到端实测:替换 100% 成功,但脚本抢先拉起的新版单文件 exe 三次都没进到自解压 / 改为只替换+校验+落戳、用户手动重开、重开后日志回执,2026-10-09) - 自升级脚本操作数与凭据加固(安装路径含 `%` 会让 copy 静默空转 / 凭据不再落在会被自毁的临时目录 / 两类失败分开说清,2026-10-09) - 界面中英热切换与流式提速(语言不再是启动参数 / 每片重建气泡改成按帧增量追加,整块重写 212→1 次 / 内嵌界面按指纹自动升级,解决「升级后仍跑旧页面且无报错」,2026-10-10) - 400 的两副面孔(模板挑消息顺序 → 宽容模板开关 / 请求装不进上下文 → 网页按 n_ctx 自己裁窗口,附真引擎实测的 `/props`、400 回执形状,2026-10-10) - API 说明逐条回真机重验与按需嵌入(在**生效引擎** b10964 上把每条断言重跑 / `/v1/embeddings` 的 501→400→200 三级梯子 / 超限回执其实嵌在 `error` 里,2026-10-10) - 加上 Vulkan 后端(选包与安装目录隔离 / `--device` 钉独显与核显上报显存比独显大的坑 / N 卡上落到 Vulkan 按实测提醒一次,CUDA 63.85 vs CPU 8.06 vs Vulkan 2.92 t/s,2026-10-11) - Vulkan 上真的调得出好参数(读不到显存只标「未确认」并跳过显存校准,GPU 档参数照用 / 满卸载写 `-ngl 层数+1` 把输出层也上 GPU,本机 +24% / `--device` 不带当前引擎认不出的过期 id,2026-10-11) - 界面两轮重排 + 设备枚举泛化 + 冷启动可只下引擎(参数卡 183→77px 与「更多参数」折叠 / 后端·设备·版本并入硬件卡并合成两行 / 按钮行三段收进下拉,1216px→954px / 修掉 `height=1` 信息行折行被吞 / `--list-devices` 认 `DP4`、顺序号并给列不出设备的原因,2026-10-12) - 更新后自动重开恢复(真实时序复现:真脚本三轮都在 3~5s 开出新实例;对账出 v1.2.24 的「判活 + taskkill」把刚起来的实例当僵尸杀了——单文件包一个实例是引导器 + 子进程两个 pid,窗口只挂在子进程上;新脚本只 start 不判活不杀,且 start 排在 `fc /b` 之后,2026-10-12) - 滑窗模型显存修正与思考预算(gemma4 `sliding_window_pattern` + 张量表让 E4B 在 6GB 卡上 32K / 52.3 t/s、f16 KV 优先;`-rea` 六档界面与真引擎实测;内置清单新增 Gemma 4 E4B / gama-4b / NeoHorse,2026-10-24) ## License Apache-2.0(模型侧)。本项目代码保留作者权利,随附说明。