perch-gpu / src /lib.rs
hongcoding's picture
feat: 开源本机 GPU 加速工具箱(诊断/热驻留/资源调度)
e85df1f verified
Raw History Blame Contribute Delete
2.23 kB
//! # perch-gpu
//!
//! **本机 GPU 加速工具箱**——让本地大模型真的用上 GPU,而且用得对。
//!
//! 从 [栖木 Perch](https://huggingface.co/datasets/hongcoding/perch) 提取的 Rust 模块。
//!
//! ## 解决什么问题
//!
//! 很多人以为"GPU 加速"就是传个 `num_gpu: 40`。**这是错的**:
//!
//! - 强行指定 GPU 层数 → Ollama 触发 runner 重载 → 反而更慢
//! - 模型闲置后被卸载 → 下次请求冷加载 3~5 秒 → 比云端还慢
//! - 本机并发跑多个模型 → 抢显存 → 互相拖慢甚至 OOM
//!
//! 本模块做三件对的事:
//!
//! 1. **如实诊断**:读 Ollama `/api/ps` 的真实 VRAM 分配,算出驻留百分比
//! 2. **热驻留**:预热一次 + `keep_alive` 保活,让模型常驻显存(首 token 0.04~0.18s)
//! 3. **资源调度**:本机并发压到 1、云端可控并发,请求排队而不是互相踩踏
//!
//! ## 快速开始
//!
//! ```rust,no_run
//! # async fn demo() -> Result<(), String> {
//! use perch_gpu::{status, warmup, scheduler};
//!
//! // 1) 预热 + 保活 30 分钟(首 token 从 3s 降到 0.08s)
//! warmup::warmup_model("qwen3-06b:latest", "30m", None).await?;
//!
//! // 2) 查真实 GPU 驻留
//! let st = status::query_status(None).await?;
//! for m in &st.models {
//! println!("{} → GPU 驻留 {}%({}/{} 字节)",
//! m.name, m.gpu_residency_percent, m.gpu_memory_bytes, m.model_bytes);
//! }
//!
//! // 3) 本机推理排队(并发 1)
//! let _permit = scheduler::acquire(false).await?;
//! // ... 在这里跑本机推理 ...
//! # Ok(())
//! # }
//! ```
//!
//! ## 设计红线
//!
//! - **绝不传 `num_gpu`**:让 Ollama 自己选后端与层数
//! - **诊断不猜**:驻留百分比来自 `/api/ps` 真实字节数,不是估算
//! - **调度不改语义**:只控制并发度,不碰模型/prompt/思考档/回复长度
pub mod scheduler;
pub mod status;
pub mod warmup;
pub use scheduler::{acquire, cached_health, cached_models, invalidate, revision};
pub use status::{
from_ps_json, query_status, residency_percent, GpuAccelerationStatus, GpuModelStatus,
DEFAULT_OLLAMA_BASE_URL,
};
pub use warmup::{warmup_body, warmup_model};