llmfit 实操与原理全解:一条命令为你的硬件找到能流畅运行的 LLM 模型
导读
llmfit 是一款以 Rust 编写、可运行在终端中的开源 LLM 选型工具:它自动检测你机器的 CPU、内存与 GPU/显存,从内置的数百个开源模型目录中,按适配度、预估速度、质量、上下文四个维度给每个模型打分排序,最终告诉你哪些模型能在你当前的硬件上真正跑起来、用什么量化档位跑、大约能跑多快。本文以项目官方中文 README 为主线,完整梳理安装、TUI/CLI 使用、评分与速度估算原理,并结合仓库源码与配套文档做纵深剖析。读完你将能:在不同平台上正确安装并运行 llmfit;掌握 TUI 与命令行两条使用路径;理解内存带宽模型、动态量化选择与 MoE 估算等核心原理;并能基于你的实测数据把基准结果贡献回社区。
llmfit 的工作方式与"运行模型实测"的工具不同——它走的是规格驱动 + 社区实测校准的混合路线:在下载上百 GB 模型之前,先用内存带宽模型预估吞吐,同时允许你用 llmfit bench 把真实数据回填进来覆盖估算值。这也是其版本口号 "Hundreds of models & providers. One command to find what runs on your hardware."(数百种模型与提供商,一条命令找出你的硬件能运行哪些模型)的由来。当前工作区仓库中的版本为 1.1.12(见 Cargo.toml 的 workspace.package.version),核心库代码位于 llmfit-core,交互式界面在 llmfit-tui。
功能定位与核心特性
llmfit 是一个"终端工具 + 核心库 + Web 仪表盘"三位一体的项目,仓库采用 Cargo workspace 组织:llmfit-core 承担硬件检测、模型适配评分与运行时提供商集成(对应描述 "Core library for llmfit — hardware detection, model fitting, and provider integration"),llmfit-tui 提供交互式界面与 CLI,另有 llmfit-desktop(Tauri 桌面壳)、llmfit-web(Web 前端)与 llmfit-python(Python 封装)等组成部分。其核心能力包括:
- 硬件自动检测:识别 CPU 核数、系统内存、独立/集成 GPU、显存与统一内存架构,覆盖 NVIDIA CUDA、Apple Silicon、AMD ROCm、Intel OneAPI 等后端;
- 模型兼容性引擎:结合参数量、上下文长度与量化格式(GGUF、AWQ、GPTQ、EXL2)推算内存占用与每秒 token 吞吐;
- 交互式 TUI 与 Web 仪表盘:默认进入零依赖终端界面,另可启动浏览器仪表盘;
- REST API 端点:暴露
/api/v1/system、/api/v1/models等标准 HTTP JSON 端点,便于编排系统、仪表盘与自动化部署流水线集成; - 多平台支持:macOS(Apple Silicon 与 Intel)、Linux(x86_64 与 ARM64)、Windows(x86_64);
- 多 GPU 与 MoE 架构支持、动态量化选择、速度估算,以及 Ollama、llama.cpp、MLX、Docker Model Runner、LM Studio 等本地运行时提供商支持。
安装指南
llmfit 提供了覆盖各主流操作系统与包管理器的多种安装途径,按平台说明如下。仓库内还提供了 install.sh 一键脚本与 Dockerfile 供容器化部署。
Windows
通过 Scoop 安装:
scoop install llmfit
如果尚未安装 Scoop,需先按其官方安装指引完成 Scoop 的安装。另外,README 特别说明 Windows 发布二进制均通过 SignPath.io 做了 Authenticode 数字签名(详见下文"代码签名"一节),可放心下载。
macOS / Linux
Homebrew(推荐)——使用预编译二进制,适用于所有 macOS/Linux 版本:
brew install AlexsJones/llmfit/llmfit
或通过 homebrew-core formula 安装(在无预编译 bottle 的 macOS 版本上会退化为从源码构建):
brew install llmfit
MacPorts:
port install llmfit
一键脚本安装——下载最新发布二进制并安装至 /usr/local/bin(若无 sudo 权限则安装至 ~/.local/bin):
curl -fsSL https://llmfit.axjns.dev/install.sh | sh
如需免 sudo 安装到 ~/.local/bin,附加 --local 参数即可:
curl -fsSL https://llmfit.axjns.dev/install.sh | sh -s -- --local
uv / pip
llmfit 同时发布为 Python 包(封装仓库位于 llmfit-python,含 llmfit Python 模块与入口点),因此可以像安装 Python 工具一样管理:
# 安装或更新
uv tool install -U llmfit
# 免安装直接运行
uvx llmfit
也可以用 pip 或 uv 做常规安装。
Docker / Podman
仓库根目录的 Dockerfile 构建了多架构镜像 ghcr.io/alexsjones/llmfit,同时支持交互式 CLI/TUI 与无头 Web UI/API 两种模式。不带任何参数直接运行会输出 llmfit recommend 命令的 JSON 结果,可配合 jq 进一步查询:
docker run ghcr.io/alexsjones/llmfit
# 用 jq 抽取推荐模型名(Podman 示例)
podman run ghcr.io/alexsjones/llmfit recommend --use-case coding | jq '.models[].name'
需要交互式 TUI 时,传入全局 --tui 参数(注意 -it 以分配交互终端):
docker run --rm -it ghcr.io/alexsjones/llmfit --tui
从源码构建
llmfit 是一个 Rust workspace 工程(见 Cargo.toml,成员为 llmfit-core、llmfit-tui、llmfit-desktop),模型数据库通过 include_str! 在编译期嵌入二进制,因此从源码构建即可得到包含最新内置模型目录的完整工具:
git clone https://github.com/AlexsJones/llmfit.git
cd llmfit
cargo build --release
# 二进制位于 target/release/llmfit
说明:最终用户获取内置模型库更新的方式是升级 llmfit 本体(
brew upgrade llmfit、scoop update llmfit或下载新版发布包);上述刷新数据库的命令面向贡献者,详见 docs/how-it-works.md 与 scripts/scrape_hf_models.py。
使用入门:TUI 与命令行
交互式 TUI(默认模式)
不带任何参数直接运行即可进入交互式界面:
llmfit
TUI 顶部显示检测到的硬件配置(CPU、RAM、GPU 型号、显存、加速后端),下方是所有模型的可滚动表格,默认按综合得分排序。每一行展示模型得分、预估 tok/s、针对你硬件挑选出的最优量化档位、运行模式、内存占用与用例类别。README 明确提示:关于导航、规划、模拟、下载、社区排行榜与基准测试的操作细节,请参阅 docs/tui.md。
常用按键(摘自 docs/tui.md,全文收录完整键位表):
| 按键 | 功能 |
|---|---|
↑/↓ 或 j/k |
在模型列表中移动 |
/ |
按名称/提供商/参数量/用例进行模糊搜索 |
f |
循环适配度过滤(All/Runnable/Perfect/Good/Marginal) |
s |
循环切换排序列(Score/Params/Mem%/Ctx/Date/Use Case) |
p |
对选中模型打开 Plan 模式(硬件需求规划) |
S |
打开硬件模拟弹窗(临时覆盖 RAM/VRAM/CPU 核数) |
A |
打开高级配置弹窗(调节效率因子、各运行模式速度系数) |
b |
打开社区排行榜(真实测量数据) |
I |
打开推理基准视图(对你的本地提供商做实测) |
D |
打开下载管理器(下载历史、删除、目录配置) |
d |
下载选中模型(存在多个提供商时弹出选择) |
t |
循环切换 10 套内置配色主题(自动保存至 ~/.config/llmfit/theme) |
c/x/m |
进入对比视图 / 清除对比标记 / 标记模型进行比较 |
Enter |
展开选中模型的详情视图 |
q |
退出 |
值得一提的进阶功能(详见 docs/tui.md):
- Plan 模式(
p):把常规适配分析倒转过来——不再问"什么模型适合我的硬件",而是问"要跑这个模型+量化+目标 TPS,需要什么硬件"。可编辑 Context、Quant、Target TPS 三个字段,实时给出最低/推荐 VRAM/RAM/CPU 核数、可行运行路径(GPU、CPU 卸载、纯 CPU)与升级差距(upgrade deltas); - 硬件模拟(
S):覆盖 RAM/VRAM/CPU 参数后,所有模型的得分、适配等级与速度估算都会按模拟配置即时重算,可用于"换机器前先验证"的场景;模拟生效期间状态栏会出现SIM徽标,按Ctrl-R恢复真实硬件; - 高级配置(
A):直接调节速度估算背后的效率因子与各运行模式系数(详见下文"速度估算"),修改立即生效并重算整张模型表。
命令行模式(脚本与 Agent)
适用于脚本、Agent 与经典终端输出场景的常用命令:
llmfit fit # 按适配度排序的所有模型表格
llmfit recommend --json # 以 JSON 输出推荐模型(供 Agent/脚本消费)
llmfit info "<model>" # 单个模型:适配分析、估算依据、验证命令
llmfit bench # 针对当前运行的提供商实测真实 tok/s 与 TTFT
llmfit doctor # 硬件检测报告(用于提交 Issue 诊断)
llmfit serve # 启动 API 与 Web 用户界面
其中 llmfit bench 对应核心库 llmfit-core/src/bench.rs,而 "估算依据"(estimate basis)的透出机制对应 llmfit-core/src/fit.rs 中的 EstimateBasis——它记录估算使用的方法(GPU 带宽 roofline / 后端常数 / CPU 常数)、假设的 GPU 带宽与上下文长度、效率因子等输入,让任何一条速度数字都能被追溯到"它假设了什么"。完整的命令参考请阅读 docs/cli.md。
社区基准与共享
llmfit 内置了社区贡献的硬件检测与性能基准。将自己机器的实测结果分享回社区只需一条命令:
llmfit bench --share
这是 README 主打的新特性:"下载模型、运行服务并在你的硬件上实测 tok/s——然后直接从 TUI 以 PR 形式把结果贡献回项目"。无需 gh CLI、无需第三方账号;每次运行先保存在本地,你自己的实测数据会替换适配表中的估算值,而每条被合并的提交会随下一个版本发布——因此相同硬件的其他用户不必自己跑基准,就能获得实测 ✓ 数据。分步指南(含截图)参见 docs/benchmarking.md,社区评测数据的校验脚本见 scripts/validate_community_benchmarks.py。
工作原理:从硬件检测到四维评分
llmfit 的处理流水线可以概括为四步:检测硬件 → 匹配模型目录 → 动态选择量化 → 多维评分排序。README 的概要说明在 docs/how-it-works.md 中有完整推导,下面按环节拆解。
第一步:硬件检测
llmfit 通过系统 API 与厂商工具组合读取硬件信息,各平台探测路径如下(依 docs/how-it-works.md 整理):
- NVIDIA:通过
nvidia-smi探测,支持多 GPU,汇总所有检测到 GPU 的显存;若上报失败则回退为按 GPU 型号名估算显存; - AMD:通过
rocm-smi检测; - Intel Arc:独显经 sysfs 读取显存,核显经
lspci检测; - Apple Silicon:经
system_profiler读取统一内存,VRAM 视为系统内存;macOS 下还会用 objc2-metal 直接查询MTLDevice.recommendedMaxWorkingSetSize,以获得 GPU 实际可用的有效工作集上限(见 llmfit-core/Cargo.toml 中 target 依赖注释的说明); - Ascend:通过
npu-smi检测; - 后端识别:自动判定 CUDA / Metal / ROCm / SYCL / CPU ARM / CPU x86 / Ascend,作为速度估算的前提。
在代码层面,这些硬件探测与系统规格的建模集中在 llmfit-core/src/hardware.rs 与 llmfit-core/src/hwprofile.rs,并通过 llmfit-core/src/lib.rs 以 SystemSpecs、GpuBackend 等类型对外导出。
第二步:模型数据库
模型目录(数百个模型、覆盖 Meta Llama、Mistral、Qwen、Google Gemma、Microsoft Phi、DeepSeek、IBM Granite、xAI Grok、Zhipu GLM、Moonshot Kimi、Baidu ERNIE 等)由 scripts/scrape_hf_models.py 从 HuggingFace REST API 抓取生成(纯标准库、无 pip 依赖),结果写入 llmfit-core/data/hf_models.json 并在编译期嵌入。抓取器会自动通过模型 config 中的 num_local_experts、num_experts_per_tok 等字段识别 MoE 架构。自动化刷新可通过 make update-models 或 scripts/update_models.sh 完成。模型清单的完整列表见 MODELS.md。
内存需求按量化层级(Q8_0 至 Q2_K)从参数量推算:GPU 推理时显存是首要约束,纯 CPU 执行时系统内存作为回退。MoE 架构会被自动识别——每次 token 只激活部分专家,因此有效显存需求远低于总参数量所示。以 Mixtral 8x7B 为例:总参数量 46.7B,但每 token 只激活约 12.9B,配合专家卸载(expert offloading)可将显存需求从 23.9 GB 压到约 6.6 GB。
第三步:动态量化选择
llmfit 并不假设固定量化档位,而是"从最好质量的档位开始试、直到装得下为止":沿着 Q8_0(质量最高)→ Q2_K(压缩最狠)的层级向下走,在可用内存内挑选质量最高的档位;若完整上下文下什么都装不下,就退而在半上下文长度下再试一次。
第四步:四维评分与加权合成
每个模型在质量、速度、适配、上下文四个维度上各得 0–100 分,语义如下(见 docs/how-it-works.md):
| 维度 | 度量内容 |
|---|---|
| Quality(质量) | 参数量、模型家族口碑、量化惩罚、任务对齐度 |
| Speed(速度) | 基于后端、参数量与量化档位的每秒 token 估算 |
| Fit(适配) | 内存利用效率(甜点区为可用内存的 50–80%) |
| Context(上下文) | 上下文窗口能力与用例目标的匹配度 |
四维得分按用例类别加权合成综合分,权重在 llmfit-core/src/fit.rs 的 ScoringWeights 中定义(General/Coding/Reasoning/Chat/Multimodal/Embedding 六类):
General 质量0.45 速度0.30 适配0.15 上下文0.10
Coding 质量0.50 速度0.20 适配0.15 上下文0.15
Reasoning 质量0.55 速度0.15 适配0.15 上下文0.15
Chat 质量0.40 速度0.35 适配0.15 上下文0.10
Multimodal 质量0.50 速度0.20 适配0.15 上下文0.15
Embedding 质量0.30 速度0.40 适配0.20 上下文0.10
可见 Chat 用例更看重速度(0.35),而 Reasoning 用例把质量权重抬到 0.55。模型按综合分排序,跑不动的模型(Too Tight)始终排在末尾。Quality 维度的"任务对齐"使用按家族整理的基准表 llmfit-core/data/use_case_benchmarks.json(聚合自公开的编程/推理/对话排行榜),因此用 --use-case coding 时,即使参数量更少,一个强的编程模型也会排在更大的通用模型前面;榜单中没有条目的家族则回退到基于名称的启发式规则。
速度估算:内存带宽模型
LLM 的 token 生成是内存带宽受限的:每生成一个 token 都要把完整模型权重从显存中读取一遍。因此当 GPU 型号可被识别时,llmfit 使用其真实内存带宽估算吞吐:
tok/s = (带宽 GB/s ÷ 模型大小 GB) × 效率因子
默认效率因子为 0.55(对应 fit.rs 的 CalcConfig.efficiency 默认值),用于吸收内核启动开销、KV 缓存读取与内存控制器效应;A 弹窗(Advanced Configuration)允许实时调参,这正对应 fit.rs 注释中提到的 issue #449——Qwen3 30B 等模型 tok/s 被高估的问题。
带宽解析遵循单一顺序:显式指定的 gpu_bandwidth_gbps_override → GPU 型号名查表 → 都没有则使用按后端分类的常数。设置 override 即可为查表未收录的显卡得到一条 roofline 估算,或在别人的硬件上复现其数值。带宽查询表覆盖约 80 款 GPU(NVIDIA 消费级+数据中心、AMD RDNA+CDNA、Apple Silicon 家族);最终采用的值会写回 estimate_basis.gpu_bandwidth_gbps 供核验。
对未能识别的 GPU,llmfit 回退到按后端的固定速度常数(docs/how-it-works.md 中给出的默认表):
| 后端 | 速度常数 |
|---|---|
| CUDA | 220 |
| Metal | 160 |
| ROCm | 180 |
| SYCL | 100 |
| CPU (ARM) | 90 |
| CPU (x86) | 70 |
| NPU (Ascend) | 390 |
回退公式为 K ÷ params_b × quant_speed_multiplier。此外还有几层细化:
- MoE 解码:稀疏模型按激活参数量估算。有完整架构元数据时(Tier 1),把随量化缩放的专家 FFN 权重与不随缩放变化的 attention/router/embedding 权重分开计算每 token 流量;否则(Tier 2)用
active_parameters × bytes_per_param再经架构级效率/开销系数修正; - Prefill/TTFT(提示处理):与 decode 相反,prefill 是算力受限的,大约每 token 需
2 × 激活参数量FLOPs。因此只有当 GPU 的 fp16 稠密算力(gpu_compute_tflops_fp16)已知时,llmfit 才报告prefill_tps与ttft_ms,否则二者为null——刻意区别于0.0,避免把"未估算"读成"慢到测不出"。量化被忽略,因为 llama.cpp 与 vLLM 在 matmul 前都会反量化到 fp16; - 运行模式速度系数:纯 GPU 为 1.0、张量并行 0.9、MoE 专家卸载 0.8、CPU 卸载 0.5、纯 CPU 0.3(默认值见 fit.rs);
- 置信度分级:一条测量值与一条公式猜测都叫 "tok/s",因此每个 fit 都附带
estimate_confidence,按优先级取首条命中:measured_local(你在本机llmfit bench实测)>measured_community(他人在相同硬件上实测)>calibrated(公式+本地校准因子)>estimated(纯公式)>unsupported(无估算,需 llmfit 无法建模的运行时)。枚举定义位于 fit.rs。
另外,llmfit 会用你自己的 llmfit bench 结果对估算做本地校准:若存在匹配的本地运行,取实测/估算的中位数作为修正因子并预先应用到 estimated_tps(对应 EstimateBasis.local_calibration)。
适配分析:运行模式与适配等级
每个模型都会评估内存兼容性并给出四种运行模式之一:
- GPU:模型完全放入显存,推理快;
- MoE:混合专家 + 专家卸载,激活专家在显存、非激活专家在内存;
- CPU+GPU:显存不足,权重溢出到系统内存、部分 GPU 卸载;
- CPU:无 GPU,模型整体载入系统内存。
适配等级是单一数值(memory_required / memory_available,即运行模式内存池的填充率)的纯函数,并受执行路径上限约束:
| 内存池填充率 | 等级 |
|---|---|
| ≤ 60% | Perfect |
| ≤ 85% | Good |
| ≤ 98% | Marginal |
| > 98% | Too Tight |
上限规则:GPU 与 TensorParallel 保留比率给出的原始结论;MoE 卸载、CPU+GPU、CPU 最高只到 Good——因为 Perfect 语义是"装得下且有富余且跑在 GPU 上",但一个在内存中装得很从容的模型依然是真实可运行的,不会被打到 Marginal。两个值得注意的细节(docs/how-it-works.md 原话):区间在 98% 而非 100% 处截断,因为填满到最后一格内存后没有任何余量应付分配器 slack 与碎片;recommended_ram_gb 已不再参与等级判定——它是目录级 model_size × 2.0 的粗略启发式,用它做门槛会让判定在两个方向上失真(23GB 模型在 24GB 卡上填到 96% 却因"达到 22GB 建议"误判 Perfect;9GB 模型在 16GB 卡上填 56% 却只判 Good),因此改用填充率直接回答。
运行时提供商
llmfit 支持 Ollama、llama.cpp、MLX、Docker Model Runner、LM Studio 等本地运行时提供商,代码层面抽象为 llmfit-core/src/providers.rs 中的 ModelProvider trait(如 OllamaProvider、LlamaCppProvider、MlxProvider、LmStudioProvider、VllmProvider,由 lib.rs 统一导出),用于识别已安装模型、发起基准测试与下载。各提供商的能力差异与接入细节参见 docs/providers.md。对硬件平台/GPU 支持范围的细致说明见 docs/platform-support.md。
参与贡献与扩展模型目录
项目欢迎各类贡献,尤其是新增模型支持。README 提醒:提交 PR 前请先运行 cargo fmt——CI 检查失败的主因大多是代码格式问题:
cargo fmt
"添加模型"有两条路径——本地免重新构建添加,或加入内置目录后随版本发布——具体步骤见 docs/custom-models.md。除模型外,修正任务对齐基准表(llmfit-core/data/use_case_benchmarks.json)、共享实测基准(llmfit bench --share)也是欢迎的 PR 形式。Web 前端贡献见 llmfit-web/README.md,Python 封装见 llmfit-python/pyproject.toml。
代码签名、隐私与开源许可
代码签名:llmfit 的 Windows 发布二进制通过 SignPath.io 进行 Authenticode 数字签名,免费代码签名证书由 SignPath Foundation 提供。签名在发布流程中自动执行:只对由本仓库 CI 构建的产物提交签名,且签名请求需由项目维护者审批。
隐私:除非用户或安装/操作者明确请求,程序不会向其他网络系统传输任何信息——llmfit 仅在你显式使用相应功能(例如下载模型、查询运行时提供商或访问社区排行榜)时才会连接外部服务。
开源许可:项目以 MIT 协议开源(见仓库 LICENSE)。
同类工具对比的定位参考
README 同时列出了它认为值得关注的替代方案以帮助读者做选择:例如 llm-checker——一个集成了 Ollama 的 Node.js CLI 工具,能够直接拉取模型并做基准测试。其风格更"实操":直接在硬件上通过 Ollama 实际运行模型,而非根据规格做预估;适合已经装有 Ollama、想验证真实运行表现的场景。但需要注意它不支持 MoE 架构——所有模型都被按稠密模型处理,因此像 Mixtral 或 DeepSeek-V3 这类模型的内存预估会反映总参数量,而非较小的激活参数子集。相比之下,llmfit 在规格预估(含 MoE 感知与社区实测校准)与"不下载模型先做决策"的规划场景上有自己的分工定位,两者可以互为补充。
结语
llmfit 的核心理念是把"本地跑 LLM"最贵的试错成本前置消化掉:通过硬件检测 + 动态量化 + 内存带宽模型,在你动手下载任何权重之前就给出可解释、可验证的适配结论;再通过本地实测与社区共享机制,让每一个"tok/s"数字从估算逐步逼近你机器上的真实值。本文所涉的命令均可在安装后直接复现,建议下一步阅读仓库内配套文档继续深入:docs/how-it-works.md(估算公式全推导)、docs/tui.md(TUI 完整键位与视图)、docs/benchmarking.md(基准测试分步实操)、docs/cli.md(CLI 全参数)、docs/custom-models.md(添加自定义模型),以及 docs/openclaw.md(Agent 集成)、docs/development.md(开发指南)。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
