十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

llama.cpp INI Presets:用 preset.ini 与系统级 config.ini 构建可复用的参数配置

llama.cpp INI Presets:用 preset.ini 与系统级 config.ini 构建可复用的参数配置 llama.cpp INI Presets用 preset.ini 与系统级 config.ini 构建可复用的参数配置【免费下载链接】llama.cppLLM inference in C/C项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp本文基于 docs/preset.md 展开系统讲解 llama.cpp 的 INI Preset 机制如何用preset.ini为模型固化可复用的推理参数、如何通过 Hugging Face 仓库分发命名预设、以及如何在系统级config.ini中为所有工具共享默认选项。读完本文你将掌握预设文件的完整语法、参数覆盖优先级、服务端路由模式router mode下的加载流程并能定位到 common/preset.cpp、common/arg.cpp 中对应的解析与生效逻辑。INI Presets 是什么INI Preset 功能由 PR #17859 引入允许用户把 llama.cpp 的一组 CLI 参数写成标准 INI 配置文件实现可复用、可分享的参数组合。其核心数据结构与接口定义在 common/preset.h 中common_preset单个预设内部是一个std::mapcommon_arg, std::string即CLI 参数 - 字符串值的映射common_presetsstd::mapstd::string, common_preset表示一个 INI 文件中的多个预设按 section 名索引common_preset_context预设的加载与编辑上下文提供load_from_ini、load_from_cache、load_from_models_dir、load_from_args、cascade等入口。从源码结构看预设本质上就是一份待解析的 CLI 参数集合。common_preset::to_args()见 common/preset.cpp#L37-L79可以把它还原成命令行参数列表apply_to_params()见 common/preset.cpp#L142-L168则逐项调用对应参数的 handler把值写入common_params。因此预设中支持的任何键都是该工具本来就认识的命令行参数。preset.ini 的语法与键名规则INI 文件的解析实现位于 common/preset.cpp#L170-L249 的parse_ini_from_file()它使用 llama.cpp 内置的 PEG 语法解析器common/peg-parser.h构建了一份 INI 文法注释以;或#开头到行尾为止行结构[section]表头行、key value键值行、注释行、空行四者之一键名[a-zA-Z_][a-zA-Z0-9_.-]*值可以包含空格。关于键名的对应关系get_map_key_opt()见 common/preset.cpp#L251-L262会为每个参数建立两类索引去除前导-的参数名长参数如n-gpu-layers、短参数如c、ngl和环境变量名如LLAMA_ARG_N_GPU_LAYERS。因此按 服务端文档 的说法以下三种写法都是合法的键; 长参数名 n-gpu-layers 8 ; 短参数名例如上下文长度 c 4096 ; 环境变量名 LLAMA_ARG_CACHE_RAM 0几个需要注意的细节均可在源码中确认version键被跳过load_from_ini()中version是保留键供未来使用见 common/preset.cpp#L305-L308布尔值的否定写法parse_bool_arg()见 common/preset.cpp#L268-L277支持以no-为前缀的否定参数名。例如参数同时注册了--jinja和--no-jinja时写no-jinja true等价于把jinja置为 falsesection 名中的量化 tag 会被规范化canonical_tag()会把形如xxx:q4_K_M的 tag 统一转为大写Q4_K_M见 common/preset.cpp#L20-L35与 GGUF tag 的书写习惯保持一致未知键的两种策略默认情况下预设中出现工具不认识的键会直接报错option xxx not recognized in preset yyy而共享配置场景可以设置ignore_unknown_keys true此时未知键只打印警告ignoring option xxx from yyy: not supported by this program见 common/preset.cpp#L325-L332。在服务端路由模式中使用本地预设文件llama-server的路由模式router mode是预设最主要的消费场景启动时不指定模型主进程作为路由器把请求转发给动态加载的模型实例。路由模式下模型文件有三个来源见 服务端文档缓存中的模型由LLAMA_CACHE环境变量控制自定义模型目录--models-dir参数自定义预设文件--models-preset参数对应环境变量LLAMA_ARG_MODELS_PRESET。指定预设文件的方式llama-server --models-preset ./my-models.iniINI 中每个 section 定义一个预设section 名可以是服务器中已存在的模型名作为该模型的默认配置也可以是自定义名称此时 section 内必须至少给出model或hf指向的模型。官方示例version 1 ; 可选全局设置所有预设共享 ; 若具体预设中定义了同名键将覆盖全局值 [*] c 8192 n-gpu-layers 8 ; 若键对应服务器上已有的模型则作为该模型的默认配置 [ggml-org/MY-MODEL-GGUF:Q8_0] ; 字符串值 chat-template chatml ; 数值 n-gpu-layers 123 ; 标志位部分标志需用 no- 前缀表示否定 jinja true ; 短参数例如上下文长度 c 4096 ; 环境变量名 LLAMA_ARG_CACHE_RAM 0 ; 文件路径相对于服务器 CWD model-draft ./my-models/draft.gguf ; 但推荐使用绝对路径 model-draft /Users/abc/my-models/draft.gguf ; 若键不对应已有模型必须指定至少模型路径或 HF 仓库 [custom_model] model /Users/abc/my-awesome-model-Q4_K_M.gguf预设参数的优先级规则为命令行参数传给llama-server本身优先级最高模型专属 section中的选项如[ggml-org/MY-MODEL...]全局 section[*]中的选项。另外有三个仅预设可用不出现在 CLI的选项定义于common_params_add_preset_options()见 common/arg.cpp#L4742-L4766通过set_preset_only()标记to_args()会跳过它们选项类型说明load-on-startup布尔服务器启动时是否自动加载该模型。仅在启动时生效之后重新加载模型列表时新增模型只列出、不加载stop-timeout整数秒请求卸载后等待优雅退出的最长时间超时强制终止默认 10dedup-cache-models布尔当预设的hf-repo指向已下载的模型时从GET /models中隐藏对应的缓存模型条目预设条目保留。写入[*]可对所有预设生效服务端加载自定义预设的入口在 tools/server/server-models.cpp#L518-L520当--models-preset非空时调用ctx_preset.load_from_ini()读取文件并打印Loaded N custom model presets from ...日志。使用 Hugging Face 预设重要只使用你信任的预设来自不明来源的预设可能不安全可以覆盖任意参数相当于远程代码配置注入面。你可以把预设推送到 Hugging Face Hub 与用户共享步骤在 Hugging Face 上创建一个空的模型仓库在仓库根目录放置一个preset.ini文件。官方给出的preset.ini示例来自 docs/preset.md[*] ctx-size 0 mmap 1 kv-unified 1 parallel 4 spec-default 1 [Qwen3.5-4B] hf unsloth/Qwen3.5-4B-GGUF:Q4_K_M ctx-size 262144 batch-size 2048 ubatch-size 2048 top-p 1.0 top-k 0 min-p 0.01 temp 1.0 [gpt-oss-120b-hf] hf ggml-org/gpt-oss-120b-GGUF ctx-size 262144 batch-size 2048 ubatch-size 2048 top-p 1.0 top-k 0 min-p 0.01 temp 1.0 chat-template-kwargs {reasoning_effort: high}其中[*]是全局 sectionspec-default 1对应 CLI 中的--spec-default开关其默认配置见 common/arg.cpp#L4722-L4737其余 section 每个对应一个模型hf键指向 Hugging Face 仓库可带量化 tag。由于预设的加载方式与--models-preset相同命令行参数仍然可以覆盖预设中的值# 强制 temp 0.1覆盖预设中的值 llama-cli -hf username/my-preset --temp 0.1底层加载流程源码印证当你用-hf指向一个包含preset.ini的仓库时仓库扫描阶段会识别它common/download.cpp#L744-L750 中若仓库根目录存在preset.ini则只下载这一个文件并填入plan.preset不再按常规方式寻找 GGUF 模型文件。随后在 common/arg.cpp#L677-L684// if HF repo is a preset repo, we simply run server in router mode with the preset.ini file params.models_preset_hf params.model.hf_repo; // only for showing a warning params.models_preset hf_cache::finalize_file(plan.preset); params.model common_params_model{}; // make sure to clear model, so server starts in router mode也就是说预设仓库的preset.ini被下载到本地缓存后等价于给用户传了--models-preset 本地文件同时清空模型字段使llama-server以路由模式启动。服务器启动时会打印提示见 tools/server/server.cpp#L525-L526NOTE: using preset.ini from HF repo xxx。相关端到端行为在 tests/test-model-resolution.cpp 中有覆盖例如断言params.models_preset指向缓存中的preset.ini见 tests/test-model-resolution.cpp#L463。命名预设Named Presets如果一个预设文件要为多个 GGUF 模型提供配置推荐做法是创建一个空白 HF 仓库其中只放一个preset.ini各 section 通过hf键引用真实的模型仓库[*] mmap 1 [gpt-oss-20b-hf] hf ggml-org/gpt-oss-20b-GGUF batch-size 2048 ubatch-size 2048 top-p 1.0 top-k 0 min-p 0.01 temp 1.0 chat-template-kwargs {reasoning_effort: high} [gpt-oss-120b-hf] hf ggml-org/gpt-oss-120b-GGUF batch-size 2048 ubatch-size 2048 top-p 1.0 top-k 0 min-p 0.01 temp 1.0 chat-template-kwargs {reasoning_effort: high}然后可以直接用llama-cli或llama-server加载通过仓库:section选择具体预设llama-server -hf user/repo:gpt-oss-120b-hf文档特别提醒请务必为每个子预设填写正确的hf仓库地址。如果 section 名被误当作仓库 tag去解析而找不到匹配的量化文件就会得到报错The specified tag is not a valid quantization scheme.。系统级配置System-level Config系统级配置由 PR #26118 加入目的是让多个工具和示例程序共享同一组选项——与上文不同它不受限于服务端场景。文件位置与加载顺序这些文件在程序启动时若存在则自动加载后加载的文件覆盖先加载的见 common/arg.cpp#L716-L760 的common_params_apply_system_config()系统级/etc/llama.cpp/config.iniWindows 上为%PROGRAMDATA%\llama.cpp\config.ini用户级$XDG_CONFIG_HOME/llama.cpp/config.ini默认即~/.config/llama.cpp/config.iniWindows 上为%APPDATA%\llama.cpp\config.ini。源码中的实现与文档一致非 Windows 平台先探测/etc/llama.cpp/config.ini再尝试fs_get_config_directory() config.ini得到的用户级目录文件存在才加入加载列表加载时打印using config file: path。生效优先级配置文件最先应用其选项随后被环境变量、CLI 参数、模型预设路由模式下依次覆盖。完整的优先级链条是系统级 config.ini用户级 config.ini覆盖 1环境变量如LLAMA_ARG_*命令行参数模型预设 section仅路由模式且 CLI 模型 section [*]。在 common/arg.cpp#L762-L769 中可以看到common_params_parse_ex()的第一步就是调用common_params_apply_system_config()注释明确写着 config file applies first, so env variables and CLI arguments override it。使用限制与注意事项只使用[*]和默认 section写在任何表头之前的键属于默认 section命名 section如[my-model]会被忽略。源码中对应逻辑是load_from_ini()把[*]的内容装入global预设随后apply_system_config()依次应用global和名为default的预设见 common/arg.cpp#L750-L759工具专属选项会被静默容忍同一份配置文件被所有 llama.cpp 程序共享因此这里使用ignore_unknown_keys true。例如你写了port 1234只有llama-server会采用其他工具打印警告后忽略不建议在系统级配置model或hf-repo它们可能引入冲突。典型坑是——配置文件中的hf-repo在命令行传了-m时仍然生效导致实际加载的不是你以为的那个模型。一个用户级config.ini的保守示例只放通用、低冲突的选项; ~/.config/llama.cpp/config.ini [*] mmap 1预设的组合与转换从源码结构看更多能力除文档主线的三个场景外common/preset.h 还暴露了若干组合工具可用于理解或二次开发预设的流转方式cascade(base, added)两套预设按名合并同名预设用后者覆盖前者选项merge()类似 CSS 层叠cascade(base_preset, presets)把某个基础预设作为底叠加到一组命名预设上load_from_cache()为每个已缓存的模型LLAMA_CACHE目录自动生成一个预设hf键指向该模型见 common/preset.cpp#L350-L362——这就是路由模式默认从缓存发现模型的实现load_from_models_dir()扫描本地模型目录生成预设支持单文件、分片-00001-of-、多模态mmproj伴生文件以及mtp-/dspark-/dflash-前缀的投机解码 draft 伴生文件见 common/preset.cpp#L387-L463load_from_args()把一次 CLI 调用直接固化为default预设便于命令行试出来的参数组合转写成 INI。小结与相关资源场景入口关键文件本地预设路由模式llama-server --models-preset ./my-models.initools/server/server-models.cppHF 预设仓库根目录preset.inillama-server -hf user/repo[:section]common/download.cpp、common/arg.cpp系统级配置/etc/llama.cpp/config.ini、~/.config/llama.cpp/config.inicommon/arg.cpp解析与数据结构PEG 文法 INI 解析、common_preset*common/preset.h、common/preset.cpp使用前提INI Presets 是较新的功能PR #17859 / #26118请以当前仓库构建版本的行为为准HF 预设涉及联网下载需确保来源可信version键目前仅为保留字段写不写均可。更多路由模式的模型目录结构与 API 细节可继续参考 tools/server/README.md。【免费下载链接】llama.cppLLM inference in C/C项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表