LocalAI Backend 监控与管理指南:使用 /backend/monitor、/backend/load 与 /backend/shutdown 掌控模型生命周期
【免费下载链接】LocalAILocalAI is the open-source AI engine. Run any model - LLMs, vision, voice, image, video - on any hardware. No GPU required.项目地址: https://gitcode.com/GitHub_Trending/lo/LocalAI
LocalAI 作为开源 AI 引擎,会将每个加载的模型以后端(backend)进程的形式常驻内存。为了帮助运维者实时掌握"哪些模型已就绪、占用多少资源",以及主动管理模型的加载与卸载,LocalAI 提供了一组仅限管理员使用的 HTTP 接口:/backend/monitor上报已加载模型的状态与资源占用,/backend/load将模型(或实时管道pipeline的所有子模型)预加载进内存,/backend/shutdown则负责停止指定模型的 backend 进程。读完本文,你将掌握这三个接口的请求/响应格式、底层状态机与回退采样机制,并能独立编写脚本实现模型的预热、监控与释放。
概览:三个 Admin-only 管理端点
三个端点都由路由文件 core/http/routes/localai.go 统一注册,并且一律套用adminMiddleware做管理员鉴权——也就是说,普通请求方无法通过这些接口窥探或干预后端进程。路由注册同时提供了不带版本前缀与带/v1/前缀两组等价 URL,便于本地端到端测试:
| 方法 | 端点 | 说明 |
|---|---|---|
GET | /backend/monitor、/v1/backend/monitor | 查询指定模型后端的状态与内存占用 |
POST | /backend/load、/v1/backend/load | 将模型预加载进内存(/backend/shutdown的逆操作) |
POST | /backend/shutdown、/v1/backend/shutdown | 停止并释放指定模型的 backend 进程 |
此外,这三个端点会被登记到 Agent 发现端点/.well-known/localai.json的monitoringRoutes映射中(backend_monitor、backend_shutdown、backend_load),方便自动化工具与 Agent 自动发现可用的监控能力(见 core/http/routes/localai.go)。
Monitor API:查询后端状态与资源占用
Monitor 接口的核心任务只有一个:回答"某个模型当前是什么状态、吃掉了多少内存"。
请求格式
- 方法:
GET - 端点:
/backend/monitor、/v1/backend/monitor
待监控的模型通过查询参数传递:
| 参数 | 类型 | 必填 | 位置 | 说明 |
|---|---|---|---|---|
model | string | 是 | query | 要监控的模型名称 |
为向后兼容,当model查询参数缺失时,服务端仍接受携带同名字段的 JSON body(早期客户端曾用GET携带{"model": "..."})。端点实现见 core/http/endpoints/localai/backend_monitor.go:先读QueryParam("model"),为空再尝试c.Bind绑定请求体,两者都为空才返回400("model query parameter is required")。新客户端应统一使用 query 参数。
响应结构
正常情况下返回一个 JSON 对象,字段如下:
| 字段 | 类型 | 说明 |
|---|---|---|
state | int | 后端状态:0=未初始化(uninitialized)、1=忙碌(busy)、2=就绪(ready)、-1=错误(error) |
memory | object | 内存使用信息 |
memory.total | uint64 | 内存总用量(字节) |
memory.breakdown | object | 各组件内存分解(键值对) |
state枚举与memory结构直接来自 gRPC 协议定义 backend/backend.proto 中的StatusResponse(含UNINITIALIZED=0 / BUSY=1 / READY=2 / ERROR=-1)与MemoryUsageData(uint64 total+map<string, uint64> breakdown)。这些状态由具体后端在运行时上报:例如 pkg/grpc/base/singlethread.go 中,单线程后端处理请求时会把自己的状态置为READY,一旦有推理正在执行则切换为BUSY。
gRPC 状态调用失败时的本地回退
如果对后端的 gRPCStatus调用失败,端点不会直接报错,而是回退到本机进程级指标(实现见 core/services/monitoring/backend_monitor.go),此时响应额外携带:
| 字段 | 类型 | 说明 |
|---|---|---|
memory_info | object | 进程内存信息(RSS、VMS) |
memory_percent | float | 内存占用百分比 |
cpu_percent | float | CPU 占用百分比 |
回退路径的细节值得展开:CheckAndSample先调用modelLoader.CheckIsLoaded(modelName)确认模型确实已加载;gRPCStatus调用失败后,SampleLocalBackendProcess会通过GetGRPCPID找到该 backend 的进程 PID,并用 gopsutil 查询其真实进程指标(进程名上会补齐.bin后缀以匹配内部后端命名,见 core/services/monitoring/backend_monitor.go)。若此时返回的是状态为ERROR的StatusResponse,其memory.total会用 VMS(虚拟内存)填充,并把 RSS 记入breakdown的"gopsutil-RSS"键。如果两条路径都失败,才会返回组合错误。
使用示例
curl "http://localhost:8080/backend/monitor?model=my-model"示例响应
{ "state": 2, "memory": { "total": 1073741824, "breakdown": { "weights": 536870912, "kv_cache": 268435456 } } }如上所示,state: 2表示该后端已就绪可服务请求,breakdown中可以看到模型权重、KV cache 等组件的内存分布,这对判断显存/内存瓶颈非常有价值。
Load API:显式预加载,消除冷启动
模型第一次被请求时往往需要现场加载权重,首次请求会付出可观的冷启动(cold-start)延迟。/backend/load允许你在流量到来之前把模型"预热"进内存。
请求格式
- 方法:
POST - 端点:
/backend/load、/v1/backend/load
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 要加载的模型名称 |
行为细节
- 对于普通模型:加载其自身的 backend。
- 对于实时管道(realtime pipeline)模型(即配置中含
pipeline:块的模型):由于管道桩(pipeline stub)本身没有独立 backend,端点为配置的每个子模型——VAD、transcription(转写)、LLM、TTS、sound_detection(声音检测)、voice_recognition(声纹识别)——并发执行加载,而不是只加载一个空壳。
该调用会阻塞直到加载完成,并返回实际驻留内存的模型名列表,因此部分失败也能被清晰看到。
上述语义的实现位于 core/backend/preload.go:PreloadModelByName解析配置后,通过pipelineStages将每个非空管道阶段解析为具体模型配置(跟随一次别名跳转解析,与实时管道自身使用的解析一致,见 core/backend/preload.go);普通模型直接PreloadModel并返回{cfg.Name},管道模型则交给PreloadStages。PreloadStages用sync.WaitGroup让所有阶段并行加载并整体等待,保证"整个管道以最慢阶段的耗时预热,而非各阶段耗时之和";某个阶段失败不会取消其它阶段,最终通过errors.Join一次性列出所有失败者(见 core/backend/preload.go)。此外源码注释明确:compaction 的summary_model会被刻意保持冷态,因为它只在响应路径之外被调用,可以保持惰性加载。
HTTP 层(core/http/endpoints/localai/backend_load.go)会在模型名为空时返回400,加载失败时返回500,响应体中的loaded仍会如实列出已经成功加载的子模型。
使用示例
curl -X POST http://localhost:8080/backend/load \ -H "Content-Type: application/json" \ -d '{"model": "my-model"}'示例响应
成功时:
{ "loaded": ["my-model"], "message": "model loaded" }管道模型成功时loaded会包含全部子模型,例如["my-vad", "my-asr", "my-tts"]。失败时返回500,loaded列出已加载的部分,message点名失败原因。由于加载逻辑对 VAD/ASR/TTS/LLM 等各阶段并发启动,这一接口尤其适合"在空闲时段预热一条完整的实时语音链路"的运维场景。
Shutdown API:按需释放后端进程
与/backend/load相对,/backend/shutdown用于在模型闲置、需要释放显存/内存时停止其 backend 进程。
请求格式
- 方法:
POST - 端点:
/backend/shutdown、/v1/backend/shutdown
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 要关闭的模型名称 |
使用示例
curl -X POST http://localhost:8080/backend/shutdown \ -H "Content-Type: application/json" \ -d '{"model": "my-model"}'响应
成功时返回200 OK与关闭确认消息({"message": "model stopped"})。
值得注意的错误语义:当被关闭的模型既不在本实例、也不在任何 worker 节点上加载时,端点返回404而非500。源码注释解释了原因——"模型未加载"是客户端侧条件而非服务端故障,不应表现为服务器错误;在分布式模式下该分支过去会误伤那些运行在 worker 上的模型,而现在 loader 会先查询节点注册表(node registry),因此能走到该分支就意味着模型在整个集群中确实都不存在(见 core/http/endpoints/localai/backend_monitor.go)。ShutdownModel内部直接委托给modelLoader.ShutdownModel(见 core/services/monitoring/backend_monitor.go)。
错误响应一览
| 状态码 | 说明 |
|---|---|
400 | 模型名缺失或非法(monitor 的 model 参数为空、load/shutdown 请求体缺少model) |
404 | shutdown 目标模型未在本实例或任何 worker 节点加载 |
500 | 后端错误、模型未加载,或 load 部分/全部失败 |
组合成一个完整的生命周期管理流程
综合三个接口,你可以编排出一条"预热 → 监控 → 释放"的运维闭环:
- 服务启动后预热:调用
POST /backend/load预加载高频模型或整条实时管道,把冷启动成本从首次用户请求中剥离,用响应中的loaded数组核对预期驻留集。 - 运行期巡检:周期调用
GET /backend/monitor?model=...,依据state(就绪/忙碌/错误)判断健康度,依据memory.total与memory.breakdown观察内存分布;gRPC 状态不可达时自动回退到进程级cpu_percent/memory_percent/memory_info,仍可拿到采样数据。 - 空闲期释放:对低峰期不再需要的模型调用
POST /backend/shutdown,把显存/内存让给其它负载,待流量回升再走第 1 步预热。
需要补充的是,这三个端点都属于"本地控制面"操作:monitor/shutdown 的实现在分布式场景下由模型加载器配合节点注册表保证语义正确(模型可能在集群其它节点上)。若你同时使用分布式部署,建议结合节点路由与集群监控能力观察整体视图,而这三个管理端点则适合在每个节点或入口上按需调用。
延伸阅读
- 后端管理路由与注册方式:查看三个端点的注册、
adminMiddleware以及.well-known/localai.json的 Agent 发现映射。 - Monitor/Shutdown 端点实现:GET 参数回退解析与 shutdown 的 404 语义。
- Load 端点实现:
400/500与部分成功的响应封装。 - 后端监控服务:gRPC 状态查询 → 进程级 gopsutil 回退采样的完整链路。
- 模型预加载逻辑:管道子模型并发加载、失败聚合与
summary_model保持冷态的设计。 - gRPC 协议定义:
StatusResponse.state枚举与MemoryUsageData的原始定义。
【免费下载链接】LocalAILocalAI is the open-source AI engine. Run any model - LLMs, vision, voice, image, video - on any hardware. No GPU required.项目地址: https://gitcode.com/GitHub_Trending/lo/LocalAI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考