//! # 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};