|
Download README.md from hongcoding/perch-gpu: direct link, hf CLI and curl.
- Browser
- Download file 4.8 kB
-
https://huggingface.co/hongcoding/perch-gpu/resolve/main/README.md
- Command line
-
hf download hf://hongcoding/perch-gpu/README.md
-
curl -L -o README.md https://huggingface.co/hongcoding/perch-gpu/resolve/main/README.md
4.8 kB
| language: | |
| - zh | |
| - en | |
| tags: | |
| - gpu | |
| - ollama | |
| - metal | |
| - local-inference | |
| - llm | |
| - rust | |
| license: mit | |
| pretty_name: perch-gpu — Local GPU Acceleration Toolkit | |
| > ⭐ **这是栖木 Perch 的开源组件之一。** | |
| > 核心应用(macOS 本地优先 AI 工作台 · 0.08s 首字)在这里 → | |
| > [**🪵 栖木 Perch**](https://huggingface.co/datasets/hongcoding/perch) | |
| # 🖥️ perch-gpu | |
| ### 让本机大模型真的用上 GPU——而且用得对。 | |
| > 你装了个 7B 模型,满心期待地点发送。 | |
| > 然后**等了 5 秒**才出第一个字。 | |
| > | |
| > 你查了半天,以为是模型太大、显卡太弱。 | |
| > 其实——**是 Ollama 把它从显存里卸载了**。 | |
| **perch-gpu** 是一个 Rust 工具箱,解决本机大模型 GPU 加速的三个坑。 | |
| 从 [栖木 Perch](https://huggingface.co/datasets/hongcoding/perch) 生产环境提取 · MIT · `cargo test` 全绿 | |
| --- | |
| ## 🕳️ 三个坑(大多数人都踩了) | |
| ### 坑 1 · 强行指定 GPU 层数 | |
| ```json | |
| { "num_gpu": 40 } // ❌ 错 | |
| ``` | |
| 很多人以为这样能"控制 GPU 加速"。实际后果: | |
| **Ollama 触发 runner 重载 → 反而更慢。** | |
| **正确做法**:让 Ollama 自己按模型结构和显存选择后端与层数。 | |
| 你只需要**如实报告**它分配了多少——这就是本库的 `status` 模块。 | |
| ### 坑 2 · 模型被悄悄卸载 | |
| Ollama 默认在空闲后释放显存。下次请求**冷加载 3~5 秒**—— | |
| 比云端还慢,你的"本机秒回"名存实亡。 | |
| **正确做法**:预热一次 + `keep_alive` 保活。 | |
| 本库的 `warmup` 模块,首 token 从 3s 降到 **0.04~0.18s**。 | |
| ### 坑 3 · 本机并发抢显存 | |
| 同时跑两个模型?一块 GPU 会互相拖慢,甚至 OOM。 | |
| **正确做法**:本机并发压到 1(排队比抢显存快),云端可控并发。 | |
| 本库的 `scheduler` 模块。 | |
| --- | |
| ## 🚀 快速开始 | |
| ```toml | |
| [dependencies] | |
| perch-gpu = { git = "https://huggingface.co/hongcoding/perch-gpu" } | |
| ``` | |
| ```rust | |
| use perch_gpu::{status, warmup, scheduler}; | |
| // 1) 预热 + 保活 30 分钟(首 token 从 3s 降到 0.08s) | |
| warmup::warmup_model("qwen3-06b:latest", "30m", None).await?; | |
| // 2) 查真实 GPU 驻留(读 Ollama /api/ps,不是猜) | |
| let st = status::query_status(None).await?; | |
| for m in &st.models { | |
| println!("{} → GPU 驻留 {}%", m.name, m.gpu_residency_percent); | |
| } | |
| // 3) 本机推理排队(并发 1,防止抢显存) | |
| let _permit = scheduler::acquire(false).await?; | |
| // ... 跑推理 ... | |
| ``` | |
| 跑 demo 看效果: | |
| ```bash | |
| cargo run --example gpu_status | |
| ``` | |
| 真实输出: | |
| ``` | |
| 🔍 查询本机 GPU 状态(http://127.0.0.1:11434)… | |
| 📦 qwen3-06b:latest | |
| GPU 驻留: 100%(0.37GB / 0.37GB) | |
| 上下文: 4096 | |
| 过期: 2026-11-05T22:30:00+08:00 | |
| ✅ GPU 加速正在生效(Ollama 已自动选择 Metal/CUDA 后端) | |
| ``` | |
| --- | |
| ## 🧩 三个模块 | |
| | 模块 | 作用 | 关键点 | | |
| |---|---|---| | |
| | **`status`** | 读 Ollama `/api/ps` 真实 VRAM 分配 | 驻留百分比来自真实字节,不是估算 | | |
| | **`warmup`** | 预热 + `keep_alive` 保活 | **绝不传 `num_gpu`**(会触发重载)| | |
| | **`scheduler`** | 本机/云端资源调度 + 元数据缓存 | 只控并发度,不改语义 | | |
| ## 📊 实测效果(栖木 Perch,Apple Silicon + Metal) | |
| | 状态 | 首 token 延迟 | | |
| |---|---| | |
| | 冷加载(模型被卸载) | **3 ~ 5 秒** | | |
| | 热驻留(预热 + 保活) | **0.04 ~ 0.18 秒** | | |
| **快 20~70 倍**,代价只是让 0.6B 模型占着 ~0.4GB 显存。 | |
| --- | |
| ## 🛡️ 设计红线 | |
| | 红线 | 原因 | | |
| |---|---| | |
| | **绝不传 `num_gpu`** | 让 Ollama 自己选,强行指定会重载 | | |
| | **诊断不猜** | 驻留百分比 = 真实 `/api/ps` 字节数 | | |
| | **调度不改语义** | 只控并发,不碰模型/prompt/思考档/回复长度 | | |
| | **预热不出本机** | 预热提示只发 loopback,不进对话历史 | | |
| ## 🔬 验证 | |
| ```bash | |
| cargo test # 7 个单元测试 + 1 个文档测试 | |
| ``` | |
| 覆盖:真实驻留计算 / CPU 回退 / 无模型 / 预热体不含 num_gpu / 并发序列化 / 缓存失效。 | |
| --- | |
| ## 🔗 相关项目 | |
| | 项目 | 说明 | 链接 | | |
| |---|---|---| | |
| | **栖木 Perch**(应用) | macOS 本地优先 AI 工作台 | https://huggingface.co/datasets/hongcoding/perch | | |
| | **perch-ultrafast**(框架) | 混合流 + Ultrafast 推理框架:首字 1s → 80ms | https://huggingface.co/hongcoding/perch-ultrafast | | |
| | **perch-gpu**(本库) | 本机 GPU 加速工具箱 | https://huggingface.co/hongcoding/perch-gpu | | |
| | **HF Collection** | 全部归在一起 | https://huggingface.co/collections/hongcoding/perch-ai-workbench-and-ultrafast-framework | | |
| ## 📜 许可 | |
| MIT —— 随便用,注明出处即可。 | |
| --- | |
| **🖥️ 别让你的 GPU 闲着。也别让 Ollama 偷偷把它卸载。** | |