Files

84 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 层。