4.7 KiB
LocalPilot
LocalPilot 是一个放在 E 盘的本地模型运行时,目标是把 Ollama 的易用生命周期和更开放的模型适配组合起来:
- GGUF:复用本机 CUDA 版
llama-server.exe,自动分配端口、启停、GPU offload、Flash Attention、continuous batching。 - Ollama 兼容 provider:可以直接调用本机 Ollama 已管理的模型,不复制权重;适合 Ollama blob 与独立 llama.cpp runner 版本不兼容时使用。
- safetensors / Transformers:在 Conda
LLM环境中使用 PyTorch CUDA,支持device_map、FP16/BF16、4-bit bitsandbytes、CPU 动态 INT8。 - ONNX:提供 ONNX Runtime 检查和 Optimum 接入点;没有 Optimum 时会给出清晰提示。
- 本地中转站:FastAPI 同时提供 OpenAI 路由和 Ollama 风格的
/api/chat、/api/generate、/api/tags、/api/show、/api/ps、/api/embed。 - 云端代理:把 OpenAI/DeepSeek/其他 OpenAI-compatible endpoint 配进
cloud_profiles,API key 只从环境变量读取。 - TUI:Textual 实现,支持切模型、加载/卸载、流式对话和动态调整生成参数。
- 生命周期:支持
keep_alive、显存模型 LRU、活动请求计数、模型注册/删除(只改配置,不删除权重文件)。 - 模型定义:支持 Modelfile 的
FROM、PARAMETER、SYSTEM、TEMPLATE、MESSAGE、ADAPTER子集,以及/api/create、/api/copy、本地路径导入和 Hugging Face/api/pull。
启动
当前机器已有 Conda 环境 LLM 和 CUDA 版 llama-server.exe,项目配置已指向它:
Set-Location E:\llm-backend
conda run -n LLM python -m localpilot doctor
conda run -n LLM python -m localpilot models
conda run -n LLM python -m localpilot tui
启动本地 OpenAI 兼容服务:
Set-Location E:\llm-backend
.\scripts\start-server.ps1
服务默认监听 127.0.0.1:8787。客户端示例:
Invoke-RestMethod http://127.0.0.1:8787/v1/chat/completions `
-Method Post -ContentType 'application/json' `
-Body (@{
model='apex-qwen3'
messages=@(@{role='user';content='你好,请用一句话介绍自己'})
stream=$false
max_tokens=128
temperature=0.4
} | ConvertTo-Json -Depth 8)
TUI 命令
/models
/model apex-qwen3
/load apex-qwen3
/unload
/params temperature=0.2 top_p=0.9 top_k=40 max_tokens=512 enable_thinking=false
/clear
与 Ollama 的边界
这不是把 Ollama 的多年工程压缩成几百行代码。当前已经补上了协议、生命周期、配置模型、本地仓库导入和代理这些高价值差距,但以下能力仍明确保留为下一阶段:
/api/pull支持本地路径导入和 Hugging Face snapshot 下载,但不实现 Ollama registry 的分层 blob、digest 校验、push。- GGUF 直连依赖兼容的 llama.cpp runner;Ollama 的内部 blob 不保证能被任意版本的独立 runner 读取。遇到这种情况,用
kind: "ollama"的兼容 provider,或换成标准 GGUF 文件。 - Transformers 的工具调用和 JSON Schema 目前是参数透传/提示约束,不等价于 Ollama runner 对每个模型的原生模板执行。
- 目前有显存槽位和请求排队,但还没有 Ollama 那种完整的跨 GPU 显存规划、连续批处理调度、模型分层缓存和自动下载器。
配置模型
编辑 config/config.json。GGUF 的 path 指向单个 .gguf 文件;safetensors 的 path 指向包含 config.json、tokenizer 和权重的 Transformers 目录。项目默认已登记本机的 E:\ollama\Apex_AI-catmodel,但不会启动时自动加载,首次选择或请求时才加载。
需要节省显存时,可在 Transformers 模型的 options 中设置 "quantization": "4bit" 或 "quantization": "8bit";CPU 场景可设置 "quantization": "dynamic-int8"。量化发生在模型加载阶段,切换量化配置后重新加载模型即可。
云端模型只配置环境变量名,例如:
$env:DEEPSEEK_API_KEY = 'your-key'
然后把 deepseek-cloud 的 enabled 改为 true,并请求 model: "deepseek-cloud"。
设计边界
权重量化通常是加载阶段能力,不能安全地在每个请求中重新量化;LocalPilot 将它放在模型 options 中。Transformers 后端支持 FP16/BF16、bitsandbytes 4/8-bit,以及 CPU 动态 INT8;GGUF 的量化策略由 GGUF 文件和 llama.cpp 决定。对话参数(temperature、top_p、top_k、min_p、repeat_penalty、seed、stop、max_tokens、enable_thinking)支持按请求动态覆盖,OpenAI 请求中的 extra_body 会透传给后端以支持模型特有参数。后续可以继续接入 AWQ/GPTQ、MLC、TensorRT-LLM、更多 ONNX CausalLM 结构和多模型并发调度,而不改 OpenAI API 层。