llama-swap 模型 TTL 自动卸载完全指南:globalTTL、unloadTimeout 与 cmdStop 实战
后端API网关LLM 网关人工智能大模型本地部署【免费下载链接】llama-swapReliable model swapping for any local OpenAI/Anthropic compatible server - llama.cpp, vllm, etc项目地址https://gitcode.com/gh_mirrors/ll/llama-swap点击查看免费下载llama-swap 默认会让一个模型一直驻留在显存中直到其他模型抢占 GPU 资源才会将其换出。本指南讲解如何用 TTLTime To Live机制按空闲时长自动卸载模型、释放 VRAM涵盖globalTTL、models.*.ttl、unloadTimeout与 Docker 场景下的cmdStop四个配置项的完整配合方式并介绍通过 HTTP 接口与 Web UI 手动按需卸载的操作方法。读完你可以根据自身显存规模与模型加载成本为每个模型设计出合理的自动卸载策略。TTL 解决什么问题默认行为下llama-swap 会一直保持模型处于加载状态直到有新的模型请求需要 GPU 资源时路由才会把旧模型换出swap为新模型。这在单模型场景下没有问题但当你同时让多个模型常驻例如配合分组路由、矩阵路由使用时安静下来的模型就会白白占据宝贵的显存。TTL 机制改变了这一默认行为它让模型在持续空闲一段时间后自动卸载主动把显存还给系统。这样既不需要等到下一次换出才回收资源也不会因为长期不活动而浪费显存。其实现位于 internal/process/process_command.go每当进程进入 Ready就绪状态就会重置一次最近使用时间lastUse一个每秒触发一次的 TTL goroutine 持续检查当模型仍处于 Ready 状态、当前无 in-flight 请求p.inflight.Load() ! 0时跳过、且距上次使用超过 TTL 时长就触发一次卸载并记录日志Unloading model, TTL of %ds reached。注意一个关键点TTL 计时衡量的是不活动时长而非存活时长每一次请求到达都会刷新计时窗口因此持续有流量的模型永远不会被自动卸载。两个核心配置ttl 与 globalTTL配置文件顶层设置全局默认值模型级可以覆盖# global default, in seconds. 0 never unload automatically globalTTL: 0 models: qwen-coder: ttl: 300 # unload after 5 minutes idle cmd: llama-server --port ${PORT} -m /models/qwen.ggufmodels.*.ttl取值的含义valuebehaviour-1默认值继承globalTTL0永不自动卸载 0空闲超过该秒数后自动卸载因此globalTTL: 600而模型不写ttl时所有模型都会在空闲 10 分钟后被卸载想让某个模型保持常驻给它单独设ttl: 0即可退出自动卸载。这一继承关系在配置解析阶段被明确实现见 internal/config/load.go模型默认ttl -1常量MODEL_CONFIG_DEFAULT_TTL定义于 internal/config/model_config.go解析时若发现仍为-1就改写为config.GlobalTTLglobalTTL本身默认值为 0见 internal/config/config.go并且校验规则是globalTTL 0设置为负数会直接报错globalTTL must be 0见 internal/config/load.go模型级ttl 0同样会被拒绝model %s: invalid TTL value %d。这些默认值与覆盖规则都有对应测试佐证例如 internal/config/config_test.go 中的TestConfig_GlobalTTL覆盖了globalTTL作为默认值、模型ttl: 0覆盖全局值、显式ttl覆盖全局值、默认 0 以及负数被拒绝五种情形。配置合并多配置文件场景时globalTTL属于全局冲突检测项两份配置给出不同值会触发conflict at globalTTL错误见 internal/config/merge_test.go。另外globalTTL支持宏展开例如globalTTL: ${GLOBAL_TTL}这类用法由宏机制处理见 internal/config/macros_refactor_test.go。unloadTimeout控制卸载的等待时长而不是卸载时机ttl决定什么时候开始卸载unloadTimeout决定一旦开始卸载最多等待进程多久退出。两者是正交的两件事不要混为一谈。unloadTimeout: 10 # global default, seconds models: docker-llama: unloadTimeout: 30 # docker stop is slow它作用于每一次卸载——包括 TTL 到期自动卸载、手动按需卸载以及路由换出swap时的停旧进程操作。模型级unloadTimeout为 0 时使用全局值。配置层面的继承规则见 internal/config/load.go 与 internal/config/load.go全局unloadTimeout默认值为常量DEFAULT_UNLOAD_TIMEOUT 10秒定义于 internal/config/config.go全局值同样要求 0负数报错unloadTimeout must be 0模型级unloadTimeout 0会被改写为全局默认值因此你在最终生效配置里总能拿到一个非零的明确超时。从源码看卸载超时的取值链路是路由层通过unloadTimeout(modelID)读取配置见 internal/router/base.go把超时传递给进程层进程层在Stop(timeout)中执行killProcess——先发优雅停止信号并等待gracefulTimeout超时未退出则对整个进程组 SIGKILL 强杀见 internal/process/process_command.go。设得太低的风险llama-swap 会在优雅期结束后强制杀掉进程如果进程正处于关闭中途可能留下容器仍在运行、显存仍被占用的情况。因此凡是关闭缓慢的对象——容器、vLLM、任何通过cmdStop与其他守护进程通信的后端——都应该把unloadTimeout调高。批量卸载时Unload会按模型的unloadTimeout分桶先处理超时最短的一批避免一个长时间挂起的多节点卸载拖住后续快速卸载见 internal/router/base.go 的实现注释。Docker 场景必须配合 cmdStopllama-swap 直接拉起的进程是一个本地子进程在 Docker 部署中cmd里跑的docker run只是本地的 Docker 客户端进程真正运行模型的是容器内的服务进程。如果不加处理卸载时 llama-swap 只会终止本地的docker run客户端容器本身可能继续运行显存依旧被占用。解决办法是在模型上配置cmdStop让卸载动作真正落到容器上models: docker-llama: ttl: 600 cmdStop: docker stop ${MODEL_ID} unloadTimeout: 30一个容器模型的 10 分钟空闲卸载需要同时具备三个设置ttl: 600决定空闲多久触发卸载cmdStop: docker stop ${MODEL_ID}决定如何优雅停止容器unloadTimeout: 30给docker stop留足执行时间。cmdStop的底层执行逻辑见 internal/process/process_command.go进程收到停止信号时如果配置了CmdStop会先执行该命令其中${PID}占位符会被替换为实际进程 PID命令输出会被记录到进程日志有测试TestProcessCommand_CmdStopOutputLogged专门验证这一点见 internal/process/process_command_forking_test.go未配置CmdStop时Unix 平台默认对整个进程组发送 SIGTERMterminateProcessTree确保 shell 包装的 fork 子进程不会成为孤儿cmdStop命令本身同样受unloadTimeout限制在 goroutine 中执行超时后仍会走 SIGKILL 兜底路径保证卸载不会被一个挂起的停止命令无限阻塞。Windows 平台的默认cmdStop则是taskkill /f /t /pid ${PID}见 internal/config/model_config.go。按需手动卸载不需要等待 TTL随时可以主动卸载模型三个入口都指向同一套卸载逻辑$ curl http://localhost:8080/unload # 卸载全部 $ curl -X POST http://localhost:8080/api/models/unload # 卸载全部 $ curl -X POST http://localhost:8080/api/models/unload/qwen-coder # 卸载单个模型其中GET /unload由 internal/server/server.go 注册处理函数handleUnload只停止本地进程远端 peer 模型不受影响见 internal/server/api.goPOST /api/models/unload与POST /api/models/unload/{model...}由 internal/server/server.go 注册见 internal/server/apigroup.go卸载单个模型时会先做别名解析RealModelName模型不存在返回 404model not found模型存在但无本地服务器返回 404no local server found for requested model卸载全部/单个模型最终都调用s.local.Unload(0, ...)——timeout 0表示使用每个模型自身配置的unloadTimeout这正是前面配置项生效的路径。Web UI 的模型列表中每个模型都带有一个卸载按钮点击即调用同一端点前端实现见 ui/src/components/ModelLoadButton.svelte模型看板还提供全部卸载操作见 ui/src/routes/ModelsDash.svelte。如何为你的场景选择合适的值TTL 没有放之四海皆准的数值需要结合显存规模、模型加载成本与流量特征来权衡单 GPU、同一时刻只跑一个模型TTL 意义不大——换出操作本来就会把旧模型踢掉globalTTL: 0即可保持模型常驻直到被换出。多个模型常驻共存配合分组/矩阵路由参见 分组与矩阵路由指南TTL 是你从安静模型手中回收显存的主要手段从300–900 秒这个区间起步比较合理再按实际负载微调。加载缓慢的模型大权重、vLLM 等短 TTL 代价高昂——下一次请求要承受漫长的冷启动。这类模型应给长 TTL甚至直接ttl: 0让路由器只在必要时才换出它们。希望小模型始终热备ttl: 0搭配persistent分组persistent: true的分组成员不会被换出见 internal/router/group.go 与对应的持久分组不驱逐测试 internal/router/group_test.go。相关文档groups-and-matrix 分组与矩阵路由指南——控制哪些模型常驻一起运行kubeswap Kubernetes 部署示例——其中展示了unloadTimeout: 60配合cmdStoppod 终止的容器场景配置配置参考文档中reference/config/globalTTL与reference/config/unloadTimeout条目提供了更完整的参数定义赞分享后端API网关LLM 网关人工智能大模型本地部署【免费下载链接】llama-swapReliable model swapping for any local OpenAI/Anthropic compatible server - llama.cpp, vllm, etc项目地址https://gitcode.com/gh_mirrors/ll/llama-swap点击查看免费下载相关推荐LlamaGPT自定义模型教程加载第三方LLaMA模型完全指南LlamaGPT自定义模型教程加载第三方LLaMA模型完全指南 引言突破模型限制释放本地AI潜能 你是否受限于LlamaGPT默认提供的模型选择是否希望AI 应用大模型本地部署后端前端llama-swap 客户端兼容性与加载反馈详解sendLoadingState 与 includeAliasesInList 实战指南llama swap 客户端兼容性与加载反馈详解sendLoadingState 与 includeAliasesInList 实战指南 本文围绕 llama后端API网关LLM 网关人工智能大模型本地部署llama-swap 实战指南在本机多模型推理服务之间按需热切换llama swap 实战指南在本机多模型推理服务之间按需热切换 llama swap 是一个用 Go 编写的本地模型调度代理它让一台机器上的多个生成式 A后端API网关LLM 网关人工智能大模型本地部署上一篇mons完全指南用这个POSIX Shell脚本一键管理X显示器的终极教程下一篇掌握Blender与CAD协同工作3步实现工业级模型精度控制终极方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Search-R1 检索服务部署实战指南:从 BM25 稀疏检索到 e5 稠密向量与在线搜索引擎的启动与配置

Search-R1 检索服务部署实战指南:从 BM25 稀疏检索到 e5 稠密向量与在线搜索引擎的启动与配置

人工智能大模型强化学习RLHFRAG工具调用 【免费下载链接】Search-R1 Search-R1: An Efficient, Scalable RL Training Framework for Reasoning & Search Engine Calling interleaved LLM based on veRL 项目地址: https://gitcode.com/gh_mirrors/se/Search-R1…

2026/10/12 1:41:55 阅读更多 →
Orange 回归建模实战:Learner、Regressor 与交叉验证评估全解析

Orange 回归建模实战:Learner、Regressor 与交叉验证评估全解析

人工智能机器学习数据分析数据可视化 【免费下载链接】orange3 🍊 :bar_chart: :bulb: Orange: Interactive data analysis 项目地址: https://gitcode.com/gh_mirrors/or/orange3 点击查看 免费下载 本指南以 Orange 数据挖掘库(orange3&am…

2026/10/12 1:40:55 阅读更多 →
JanusGraph 实战:基于 Cassandra CQL 存储后端与 Elasticsearch 索引后端的示例应用

JanusGraph 实战:基于 Cassandra CQL 存储后端与 Elasticsearch 索引后端的示例应用

图数据库分布式数据库后端 【免费下载链接】janusgraph JanusGraph: an open-source, distributed graph database 项目地址: https://gitcode.com/gh_mirrors/ja/janusgraph 点击查看 免费下载 导读 本文以 example-cql 示例为线索,完整讲解如何在 Ja…

2026/10/12 1:40:55 阅读更多 →

最新新闻

【深度学习新浪潮】Meta Muse 智能体:它是什么?有哪些特点?为什么突然火了?

【深度学习新浪潮】Meta Muse 智能体:它是什么?有哪些特点?为什么突然火了?

1. 引言 近期,Meta Muse 智能体在 AI 领域引发广泛关注,开发者、创作者与科技从业者纷纷展开讨论。许多初次接触者不禁疑惑:这是 Meta 推出的又一款大模型?抑或仅是蹭热度的 AI 玩具? 事实并非如此。Meta Muse 是 Meta 在 AI 智能体方向的一次战略性布局,它并非简单的对…

2026/10/12 2:24:22 阅读更多 →
Spring-boot-3 -注解 yaml配置 -日志

Spring-boot-3 -注解 yaml配置 -日志

4、核心技能1. 常用注解SpringBoot 摒弃 XML 配置方式,改为全注解驱动1. 组件注册Configuration 自定义配置类、SpringBootConfiguration 用来标注SpringBoot主启动类的Bean 可以在自定义配置类面创建对象交给ioc容器,组件在容器中的名字为方法名、Scope…

2026/10/12 2:24:22 阅读更多 →
Neuroimage: 动态功能连接方法的重测信度比较

Neuroimage: 动态功能连接方法的重测信度比较

本篇文献发表在Neuroimage杂志。所发布内容旨在与大家分享学术新知,促进交流学习版权归原作者或原出处所有,感谢各位学者的辛勤付出与研究成果。1.引言大脑的功能组织具有丰富的时空结构,可以使用功能连接指标进行探测。功能连接被定义为两个…

2026/10/12 2:24:22 阅读更多 →
page_alloc __rmqueue

page_alloc __rmqueue

__rmqueue() 是伙伴系统分配路径的核心调度器。它在持有 zone->lock 的前提下,按照碎片化风险从低到高的顺序,依次尝试不同的分配策略,直到成功或彻底失败。核心作用与策略链它的本质是一个多级降级策略链:先尝试最“干净”的方…

2026/10/12 2:24:22 阅读更多 →
游戏引擎中物理步进与动画采样的同步机制解析

游戏引擎中物理步进与动画采样的同步机制解析

1. 这不是教科书,是我在三个项目里拆过七次引擎后写下的物理与动画系统手记“游戏引擎架构深度解析(三):物理与动画系统”——看到这个标题,你大概率正卡在某个角色落地时穿模、布料抖动像癫痫发作、或者刚加完一个新关…

2026/10/12 2:24:22 阅读更多 →
产业与汇率全景分析深入分析多表格形成一篇文章

产业与汇率全景分析深入分析多表格形成一篇文章

产业与汇率全景深度分析:汇率是外生变量,产业是底层根基引言汇率从来不是孤立的数字,它是一国产业竞争力、贸易结构、资本流动、宏观政策、全球供需格局共同定价的结果;反过来,汇率波动又会重塑产业成本、订单、利润、…

2026/10/12 2:23:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →