llama.cpp 多模型

模型与算力

讲清 llama.cpp 同时管理多个模型的办法:分端口起服务、按需加载、显存排队与路由切换,附排查顺序。

本地同时跑两三个模型,常见卡点是显存被吃满、端口互相顶、客户端不知道该连哪个地址。这篇按「服务怎么起、显存怎么排、调用怎么分」三步给出可照抄的清单,并说明单卡和多卡下哪些做法不适用。

本地想同时挂两三个模型,最常见的三个坑:显存被吃满、新服务起不来而旧进程还在、客户端不知道连哪个地址。这三件事其实不是同一个问题,得拆开处理——服务怎么摆、显存怎么排、调用怎么分。

先把预期放正:llama.cpp 的 llama-server 一个进程就加载一份权重,所谓多模型,本质是多个进程各占一个端口,或者同一个进程反复换载。它没有那种「配置里写个列表就自动路由」的机制。下面的清单按「起服务、排显存、分调用」三步走,最后给一个排查顺序,照着对就行。

先想清楚:为什么一个进程管不住多个模型

一个 llama-server 实例在启动时就把权重读进显存,生命周期内不会再换模型。想多模型并行,要么同时开多个实例,要么用完一个停掉再起另一个。换载不是零成本:旧模型的显存不释放,新模型就可能起不来,或者悄悄退到 CPU 上跑,速度掉一个量级你还以为是机器不行。

做法代价适用场景
多实例常驻每个模型都占着显存常用模型,调用频繁
按需起停切换要等加载时间冷门模型,一天调几次
单实例手动换载无额外显存开销只是偶尔对比两个模型
  • 量化档位不同的模型,显存占用差别挺大,混跑前先按站内部署测算核对你手里这几个的余量
  • 模型越多,空闲显存越紧,并发一上来先崩的往往不是最忙的那个
  • 什么情况下不适用:如果你一天就切换一两次模型,手动换载比常驻省资源,没必要养多个进程

服务怎么摆:端口、常驻还是按需

最省心的做法是「一个模型一个端口」,每个 llama-server 用不同的 --port 起,客户端靠 base URL 区分。别指望同一个端口自动认出你要哪个模型,它不会。启动脚本里把端口、权重路径、上下文长度写清楚,跟下面这行差不多就行。

llama-server -m /models/a.gguf --port 8081 -ngl 99 &\nllama-server -m /models/b.gguf --port 8082 -ngl 99 &
  1. 先定常驻名单把调用最频繁的一两个模型设成常驻,其余按需启动;常驻数量以启动后显存还剩一截为准,不留余量后面一定出事
  2. 起服务前先停旧的按需模型用脚本管理,启动前先确认旧进程真的退出了(看进程表,不只看日志),再起新的,避免两份权重同时占卡
  3. 多卡时显式分卡用设备指定参数把模型分到不同卡上;同一张卡塞两个大模型基本直接失败,别在这上面浪费时间

调用侧怎么分:路由表与客户端配置

模型多了以后,麻烦会从服务端转到客户端:每个脚本各填一个地址,换端口就得全改一遍。解决办法是维护一张路由表,把模型名映射到端口和用途,客户端和脚本都按表查,不靠记忆。再往前一步,对外只暴露一个统一入口,用网关或简单反向代理按模型名转发,换模型时只改一处。

模型名端口用途常驻/按需
模型甲8081日常问答常驻
模型乙8082长文摘要常驻
模型丙8083偶尔试新按需
  • 接口层加上超时和重试,模型正在加载时返回排队提示,别让请求干等几分钟最后超时
  • 网关不是必须的:单机、单用户、调几个脚本的场景,一张表加固定端口就够了
  • 判断口径:调用量和延迟要求说不清的时候,先去站内测速页量出基线,再决定要不要上网关

出问题时的排查顺序

多模型跑出问题,别一上来就怀疑模型文件。按下面这个顺序走,多数情况在前两步就能定位。

  1. 先查显存看上一个进程是不是真的退出了,显存有没有被占着;进程还在但日志没报错,是最常见的假象
  2. 再查端口确认端口没冲突,服务确实监听在你以为的地址上,别出现起了 8082 客户端连 8081 的情况
  3. 查路由表客户端发来的模型名是否落在表里,大小写、路径前缀都算,网关规则写错也会表现成连不上
  4. 最后怀疑权重同一模型单独跑得起来、多开跑不起来,八成还是显存或端口;权重格式问题通常单独跑也报错
多模型部署的稳定性,八成取决于起服务前那一眼显存余量,而不是模型本身。
下一步先按站内测算页把你手上几个模型的显存需求对一遍,再决定哪些常驻、哪些按需,比拍脑袋开一堆进程稳得多。

常见问题

llama.cpp 能在一个进程里加载多个模型吗?

常规做法不行,一次加载一份权重。要同时提供多个模型,就按一模型一服务来起,再用网关或客户端配置把它们聚到一个入口上。如果只是偶尔换模型,停掉旧进程再起新的更省显存。

同时跑两个模型会不会把显存撑爆?

会,尤其两个都是大参数量或高精度量化时。先算每个模型的显存占用,留出上下文缓存和并发余量,再决定常驻几个。放不下就改成按需加载,或者把其中一个换到更小的量化档,具体档位到站内部署测算页核对。

客户端怎么知道该连哪个端口?

自己维护一张模型名到端口的对照表,客户端按模型名查表。更省事的办法是在前面放一层统一入口做映射,客户端只认一个地址和模型名,后端换端口对它透明。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。