Files
llm-backend/README.md
T

4.7 KiB
Raw Blame History

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 层。