Hypura:在32GB Mac上运行1T参数大模型,内存不足用NVMe凑

6 阅读1分钟

什么是Hypura

Hypura是专为苹果硅芯片设计的存储层级感知LLM推理调度器。它可以根据访问模式、带宽成本和硬件能力,将模型张量分布在GPU、内存和NVMe三级存储上,让超过物理内存的模型也能正常运行,不会导致系统崩溃。

在32GB Mac Mini上可以运行31GB的Mixtral 8x7B,速度2.2 token/s;运行40GB的Llama 70B,速度0.3 token/s。而原生的llama.cpp在这两个场景下都会直接OOM崩溃。

解决的问题

消费级苹果硬件(MacBook Pro、Mac Studio)虽然有快速的统一内存和NVMe存储,但容量有限。32GB的M1 Max无法原生加载40GB的模型,操作系统会陷入交换颠簸,直到OOM杀手终止进程。

Hypura通过理解模型架构来解决这个问题:

  1. 归一化层和嵌入层:体积很小但每个token都要访问,直接固定在GPU中
  2. MoE专家路由:利用稀疏性,每个token仅激活8个专家中的2个。路由拦截会识别选中的专家,仅从NVMe加载需要的专家分片,减少75%的I/O。神经元缓存跟踪已加载的专家切片,利用时间局部性实现99.5%的命中率。共激活跟踪还能预测下一个要激活的专家,实现 speculative预取
  3. 密集FFN权重:占模型大小的~60%,通过动态大小的池缓冲区从NVMe流式加载,而注意力层和归一化层始终驻留在GPU中。预取超前深度会根据可用内存自动调整

核心设计

Hypura会读取GGUF模型文件,分析你的硬件配置(GPU工作集、内存、NVMe带宽),然后求解一个放置优化问题,将每个张量分配到合适的存储层级:

  • GPU(Metal):存放注意力层、归一化层、嵌入层。访问速度最快,但受限于推荐的最大工作集大小
  • 内存(RAM):存放无法放入GPU工作集的溢出层,通过mmap访问
  • NVMe:剩余的层通过直接I/O按需加载,在前向传播前预取

根据模型大小、架构和可用内存,Hypura会自动选择最佳推理模式:

  1. 全驻留模式:模型可以完全放入GPU+内存,没有NVMe I/O,达到全速Metal性能
  2. 专家流式模式:针对MoE模型(如Mixtral),仅非专家张量(~1GB)留在GPU,专家张量按需从NVMe通过池缓冲区流式加载,神经元缓存(99.5%命中率)在预热后消除大部分I/O
  3. 密集FFN流式模式:针对无法放入GPU的密集模型(如Llama 70B),注意力层和归一化层(~8GB)留在GPU,FFN张量(~32GB)通过动态大小的池缓冲区从NVMe流式加载,支持可扩展的预取超前

性能表现

测试环境:M1 Max,32GB统一内存,~5.1 GB/s NVMe顺序读取速度

模型大小GPU占用NVMe占用模式Hypura速度llama.cpp速度说明
Qwen 2.5 14B Q4_K_M8.4 GB8.4 GB全驻留21 tok/s~21 tok/s完全放入GPU,无 overhead
Mixtral 8x7B Q5_K_M30.9 GB1.1 GB29.8 GB专家流式2.2 tok/sOOM99.5%缓存命中率
Llama 3.3 70B Q4_K_M39.6 GB7.8 GB31.8 GB密集FFN流式0.3 tok/sOOM动态24槽池,7层预取

核心结论:对于能放入内存的模型,Hypura零开销;对于放不下的模型,Hypura让"无法运行"变成"可以运行"。

使用方法

安装

git clone --recurse-submodules https://github.com/hypura/hypura.git
cd hypura
cargo build --release

二进制文件位于 target/release/hypura,Homebrew安装方式即将推出。

基础命令

# 硬件分析(仅运行一次,结果缓存)
hypura profile

# 运行推理
hypura run ./model.gguf --prompt "Hello, world"

# 交互式聊天
hypura run ./model.gguf --interactive

# 基准测试
hypura bench ./model.gguf

# 查看模型放置计划
hypura inspect ./model.gguf

Ollama兼容API

Hypura提供兼容Ollama的HTTP API,可以作为任何Ollama工具的替代:

hypura serve ./model.gguf
# 服务地址:http://127.0.0.1:8080
# 兼容API:/api/generate, /api/chat, /api/tags

在OpenClaw中使用Hypura:

openclaw config set models.providers.ollama.baseUrl "http://127.0.0.1:8080"

常见问题

Q:会损伤SSD吗? A:不会。Hypura在推理过程中仅从SSD读取数据,读取操作不会磨损闪存单元。仅有的写入操作是基准测试结果JSON、共激活统计数据(都只有KB级别),正常推理不会产生任何SSD写入。

项目说明

作者表示这个项目大部分代码是由LLM根据他的指导生成的,探索了利用NVMe存储支持大模型推理的可能性。