Initial commit: LocalPilot:本地模型运行时,复用 llama-server 并提供 Ollama 兼容 provider
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
# 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`,项目配置已指向它:
|
||||
|
||||
```powershell
|
||||
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 兼容服务:
|
||||
|
||||
```powershell
|
||||
Set-Location E:\llm-backend
|
||||
.\scripts\start-server.ps1
|
||||
```
|
||||
|
||||
服务默认监听 `127.0.0.1:8787`。客户端示例:
|
||||
|
||||
```powershell
|
||||
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 命令
|
||||
|
||||
```text
|
||||
/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"`。量化发生在模型加载阶段,切换量化配置后重新加载模型即可。
|
||||
|
||||
云端模型只配置环境变量名,例如:
|
||||
|
||||
```powershell
|
||||
$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 层。
|
||||
Reference in New Issue
Block a user