本地LLM最佳选型工具:基准测试自动匹配
开源工具根据硬件配置自动推荐最优本地LLM,基于实际性能基准排名,省去选型成本。
开源工具根据硬件配置自动推荐最优本地LLM,基于实际性能基准排名,省去选型成本。
找到真正能在你硬件上运行的最佳本地 LLM。
自动检测你的 GPU、CPU 和 RAM,并从 HuggingFace 中筛选出适配你系统的顶级模型并进行排名。
无需设置项目,只需运行一次推荐命令。
uvx whichllm@latest
在购买硬件之前模拟 GPU。
uvx whichllm@latest --gpu "RTX 4090"
如果经常使用,可以安装它。
uv tool install whichllm
uv tool upgrade whichllm # 更新现有安装
brew install andyyyy64/whichllm/whichllm
pip install whichllm
默认情况下,whichllm 的推荐比较激进。它会选出在你的机器上看起来能够运行的最佳模型并进行排名,包括似乎可用的部分 RAM 卸载方案,以及接近 VRAM 容量极限的方案。
如果你想获得更稳妥、更接近 LM Studio 风格的推荐,可以从以下命令开始:
uvx whichllm@latest --gpu-only --speed usable --vram-headroom 1GB
这条命令只保留能够完全装入 GPU VRAM 的模型,过滤掉预估速度较慢的模型,并为运行时开销预留额外的 VRAM。
如果 LM Studio 仍然提示模型略微过大,请增加预留空间:
uvx whichllm@latest --gpu-only --speed usable --vram-headroom 1.5GB
安装后,可直接运行 whichllm。对于一次性运行,请将 whichllm 替换为 uvx whichllm@latest。
# 适合这台机器的最佳模型
whichllm
# 假设你拥有某款特定 GPU
whichllm --gpu "RTX 4090"
# 覆盖检测到的 iGPU/统一内存限制
whichllm --vram 8 --ram-bandwidth 68
# 只显示能够完全装入 GPU VRAM 的模型
whichllm --gpu-only
whichllm --fit gpu
# 模拟多 GPU 工作站
whichllm --gpu "2x RTX 4090"
# 隐藏技术上可以运行但速度太慢的模型
whichllm --speed usable
whichllm --speed fast
# 可直接粘贴到 GitHub / Slack / Discord 的输出
whichllm --markdown
# 比较候选升级方案
whichllm upgrade "RTX 4090" "RTX 5090" "H100"
# 查找运行某个模型所需的 GPU
whichllm plan "llama 3 70b"
# 启动与某个模型的聊天
whichllm run "qwen 2.5 1.5b gguf"
# 输出可复制粘贴的 Python 代码
whichllm snippet "qwen 7b"
# 返回供脚本使用的 JSON
whichllm --top 1 --json
$ whichllm --gpu "RTX 4090"
#1 Qwen/Qwen3.6-27B 27.8B Q5_K_M score 92.8 27 t/s
#2 Qwen/Qwen3-32B 32.0B Q4_K_M score 83.0 31 t/s
#3 Qwen/Qwen3-30B-A3B 30.0B Q5_K_M score 82.7 102 t/s
32B 模型完全可以装入你的显卡,但 whichllm 仍然将 27B 模型排在第 1 位,因为它在真实基准测试中的得分更高,而且属于更新一代。一个只按大小判断“哪些模型能装下”的工具会把更大的那个模型交给你。这种差异正是 whichllm 存在的意义。(请注意第 3 名:这是一个速度达到 102 t/s 的 MoE 模型——速度根据激活参数量排名,质量则根据总参数量排名。)
实际的首选模型(2026 年 5 月快照——你的结果会跟踪 HuggingFace 实时数据,这并不是一份静态列表):
whichllm --gpu "<your card>" 可以让你在购买前模拟这些 GPU 中的任意一款。默认情况下,只要可用,排名就会包含完全使用 GPU、部分卸载和仅使用 CPU 的候选模型。如果只想查看能够完全装入 GPU VRAM 的模型,请使用 --gpu-only 或 --fit full-gpu。默认表格会显示内存占用、预估生成速度、适配类型和发布日期。速度会根据实际可用性着色:低于 4 tok/s 为红色,4~10 为黄色,10~30 为绿色,30 以上为亮绿色。~ / ? 仍用于标记估算结果的置信度。
把模型装入 VRAM 是容易的部分。真正困难的是弄清楚在所有能够装下的模型中,哪一个才是最好的——而这正是 whichllm 致力于准确解决的问题。
基于证据排名,而不是按大小猜测——首选模型根据多项合并后的真实基准测试确定,包括 LiveBench、Artificial Analysis、Aider、多模态/视觉测试、Chatbot Arena ELO 和 Open LLM Leaderboard,绝不会仅仅选择“碰巧能够装下的最大模型”。
感知时效性——过时的排行榜得分会根据每个模型的血缘关系降权,因此 2024 年的模型无法凭借过时得分超过当前一代模型。每次排名下方都会显示基准测试快照日期,因此过时的推荐一目了然,而不会在不知情的情况下被信任。
证据分级并设有防护——每项得分都会标记为 direct / variant / base / interpolated / self-reported,并根据信心度进行折扣。系统会主动拒绝上传者编造的说法,以及跨模型家族的分数继承行为,例如一个小型分支模型借用其大得多的基础模型得分。
感知架构的估算——VRAM = 权重 + GQA KV 缓存 + 激活值 + 额外开销;速度按内存带宽瓶颈估算,同时考虑不同量化方式的效率、不同后端的系数、MoE 激活参数量与总参数量的差异,以及统一内存与独立显卡 PCIe 部分卸载的建模差异。
一条命令,支持脚本调用——whichllm 会直接输出答案;在流水线中加入 --json | jq 即可。没有 TUI,也没有需要记忆的快捷键。
实时数据——直接从 HuggingFace API 获取模型,同时提供经过筛选并冻结的备用数据,以便在离线或受到速率限制时使用。
自动检测硬件——支持 NVIDIA、AMD、Intel、Apple Silicon 以及仅使用 CPU 的系统
智能排名——根据 VRAM 适配情况、速度和基准测试质量为模型评分
一条命令启动聊天——whichllm run 可立即下载并启动聊天会话
代码片段——whichllm snippet 可为任意模型输出可直接运行的 Python 代码
实时数据——直接从 HuggingFace 获取模型,并通过缓存提高性能
感知基准测试——整合真实评测得分,并根据置信度进行衰减
任务配置——可按通用、编程、视觉或数学用例进行筛选
GPU 模拟——可使用任意 GPU 进行测试:whichllm --gpu "RTX 4090"
多 GPU 模拟——重复使用 --gpu、使用逗号分隔,或写成 2x RTX 4090
完全使用 GPU 的筛选器——--gpu-only / --fit full-gpu 可隐藏需要卸载的候选模型
感知速度的筛选——--speed usable|fast 可按阈值隐藏速度较慢的行
Markdown 输出——--markdown / -m 可输出能够直接粘贴的 GFM 表格
运行时内存预算——--vram-headroom 和 --ram-budget 可避免接近容量极限的适配方案
硬件规划——反向查询:whichllm plan "llama 3 70b"
升级规划——比较当前机器与候选 GPU
JSON 输出——便于管道处理:whichllm --json
使用一条命令尝试任意模型。无需手动安装——whichllm 会通过 uv 创建隔离环境、安装依赖项、下载模型并启动交互式聊天。
# 与模型聊天(自动选择最佳 GGUF 变体)
whichllm run "qwen 2.5 1.5b gguf"
# 自动选择最适合当前硬件的模型并开始聊天
whichllm run
# 仅使用 CPU 模式
whichllm run "phi 3 mini gguf" --cpu-only
支持所有模型格式:
GGUF——通过 llama-cpp-python 运行(轻量、快速)
AWQ / GPTQ——通过 transformers + autoawq / auto-gptq 运行
FP16 / BF16——通过 transformers 运行
也可以获取可直接复制粘贴的 Python 代码片段:
whichllm snippet "qwen 7b"
from llama_cpp import Llama
llm = Llama.from_pretrained(
repo_id="Qwen/Qwen2.5-7B-Instruct-GGUF",
filename="qwen2.5-7b-instruct-q4_k_m.gguf",
n_ctx=4096,
n_gpu_layers=-1,
verbose=False,
)
output = llm.create_chat_completion(
messages=[{"role": "user", "content": "Hello!"}],
)
print(output["choices"][0]["message"]["content"])
# 自动检测硬件并显示最佳模型
whichllm
# 模拟 GPU(例如规划购买硬件)
whichllm --gpu "RTX 4090"
whichllm --gpu "RTX 5090"
# 指定变体
whichllm --gpu "RTX 5060 16"
# 覆盖检测到的 iGPU/统一内存限制
whichllm --vram 8 --ram-bandwidth 68
# 模拟多块 GPU
whichllm --gpu "2x RTX 4090"
whichllm --gpu "RTX 4090" --gpu "RTX 3090"
whichllm --gpu "RTX 4090, RTX 3090"
# 只显示能够完全装入 GPU VRAM 的模型
whichllm --gpu-only
whichllm --fit gpu
whichllm --fit full-gpu
# 避免接近容量极限的适配方案和后台 RAM 占用带来的意外
whichllm --vram-headroom 1.5GB
whichllm --ram-budget available
whichllm --ram-budget 8GB
# 仅使用 CPU 模式
whichllm --cpu-only
# 更多结果/筛选条件
whichllm --top 20
whichllm --details # 显示下载元数据,而不是运行时列
whichllm --speed usable # 最低 10 tok/s
whichllm --speed fast # 最低 30 tok/s
whichllm --min-speed 4 # 精确的 tok/s 下限
whichllm --markdown # 可直接粘贴的 GitHub-Flavored Markdown 表格
whichllm --profile coding
whichllm --context-length 64k
whichllm --quant Q4_K_M
whichllm --min-speed 30 # 精确的 tok/s 下限
whichllm --evidence base # 允许 ID/基础模型匹配
whichllm --evidence strict # 仅允许 ID 精确匹配(与 --direct 相同)
whichllm --direct
# JSON 输出
whichllm --json
# 强制刷新(忽略缓存)
whichllm --refresh
# 仅显示硬件信息
whichllm hardware
# 规划:运行特定模型需要什么 GPU?
whichllm plan "llama 3 70b"
whichllm plan "Qwen2.5-72B" --quant Q8_0
whichllm plan "mistral 7b" --context-length 32768
# 升级:将当前机器与候选 GPU 进行比较
whichllm upgrade "RTX 4090" "RTX 5090" "H100"
whichllm upgrade "Apple M4 Max" --top 5
# 运行:下载模型并立即开始聊天
whichllm run "qwen 2.5 1.5b gguf"
whichllm run # 自动选择最适合当前硬件的模型
# 代码片段:输出可直接运行的 Python 代码
whichllm snippet "qwen 7b"
whichllm snippet "llama 3 8b gguf" --quant Q5_K_M
Markdown 输出适用于 GitHub issue、README、Slack、Discord 和博客文章:
whichllm --markdown
whichllm -m --top 5 --gpu "RTX 4090"
JSON 模型行包含 fit_type、vram_required_bytes、vram_available_bytes、uses_multi_gpu、multi_gpu_effective_vram_bytes、estimated_tok_per_sec、speed_confidence、speed_range_tok_per_sec、speed_notes、benchmark_source 和 benchmark_confidence。速度范围是用于规划的估算区间,并非实时基准测试结果。
使用 JSON 输出为脚本提供数据,将 HuggingFace ID 映射到本地 Ollama 模型名称:
# Pick the top HuggingFace model ID
whichllm --top 1 --json | jq -r '.models[0].model_id'
# Find the best coding model ID
whichllm --profile coding --top 1 --json | jq -r '.models[0].model_id'
Ollama 模型名称并不总是与 HuggingFace 仓库 ID 一致,因此在执行 ollama run 之前,通常需要进行一个简单的映射步骤。
添加到你的 .bashrc / .zshrc:
alias bestllm='whichllm --top 1 --json | jq -r ".models[0].model_id"'
# Usage: ollama run $(bestllm)
每个模型都会获得一个 0~100 分的评分。基准测试质量和模型规模构成核心评分;随后,证据置信度和运行时适配度会对其进行缩放,速度、来源可信度和流行度则作为调整项。
~(黄色)——没有直接基准测试;评分继承自模型家族或通过插值计算得出
!sr(亮黄色)——仅有上传者报告的基准测试,未经独立验证
?(红色)——没有可用的基准测试数据
红色——生成速度慢(<4 tok/s)
黄色——生成速度勉强可用(4~10 tok/s)
绿色——生成速度可用(10~30 tok/s)
亮绿色——本地生成速度快(>=30 tok/s)
~(黄色)——提供估算的 tok/s 范围
?(红色)——速度估算置信度低;对后端和运行时高度敏感
硬件检测与模拟
模型获取——从 HuggingFace API 获取热门模型:文本生成模型(下载量高 + 最近更新)、经过 GGUF 筛选的模型(使用单独查询以扩大覆盖范围),以及在使用 --profile vision 或 any 时获取视觉模型(image-text-to-text)
模型获取——从 HuggingFace API 获取热门模型:
文本生成模型(下载量高 + 最近更新)
经过 GGUF 筛选的模型(使用单独查询以扩大覆盖范围)
在使用 --profile vision 或 any 时获取视觉模型(image-text-to-text)
基准测试来源——当前层级(LiveBench、Artificial Analysis Index、Aider)在可访问时实时合并,另加一个精选的多模态/视觉索引;冻结层级(Open LLM Leaderboard v2、Chatbot Arena ELO)。各层级拥有独立的评分上限,并采用感知模型谱系的时效性降权机制,避免陈旧的排行榜继续对较老的模型世代给予过高奖励。
基准测试来源——当前层级(LiveBench、Artificial Analysis Index、Aider)在可访问时实时合并,另加一个精选的多模态/视觉索引;冻结层级(Open LLM Leaderboard v2、Chatbot Arena ELO)。各层级拥有独立的评分上限,并采用感知模型谱系的时效性降权机制,避免陈旧的排行榜继续对较老的模型世代给予过高奖励。
基准测试证据——分为五个解析级别,折扣依次增大:direct——精确匹配模型 ID;variant——去除后缀或 -Instruct 后匹配的变体;base_model——来自 cardData 的基础模型;line_interp——在模型家族内部按规模插值;self_reported——上传者声称的评测结果(大幅折扣)。当某个模型的参数量与其家族主流成员相差超过 2 倍时,将拒绝继承评分,从而识别那些与大得多的基础模型共享 family_id 的 draft / MTP / abliterated 分支。
基准测试证据——分为五个解析级别,折扣依次增大:
direct——精确匹配模型 ID
variant——去除后缀或 -Instruct 后匹配的变体
base_model——来自 cardData 的基础模型
line_interp——在模型家族内部按规模插值
self_reported——上传者声称的评测结果(大幅折扣)
当某个模型的参数量与其家族主流成员相差超过 2 倍时,将拒绝继承评分,从而识别那些与大得多的基础模型共享 family_id 的 draft / MTP / abliterated 分支。
缓存——通常位于 ~/.cache/whichllm/;当 XDG_CACHE_HOME 被设置为绝对路径时,则位于 $XDG_CACHE_HOME/whichllm/:models.json——6 小时 TTL;benchmark.json——24 小时 TTL
缓存——通常位于 ~/.cache/whichllm/;当 XDG_CACHE_HOME 被设置为绝对路径时,则位于 $XDG_CACHE_HOME/whichllm/:
benchmark.json——24 小时 TTL
硬件检测——NVIDIA(nvidia-ml-py)、AMD(ROCm/dbgpu)、Intel、Apple Silicon(Metal)、CPU 核心、内存和磁盘
显存估算——权重 + KV 缓存 + 激活值 + 框架开销(约 500MB)
兼容性——完全使用 GPU / 部分卸载 / 仅使用 CPU;计算能力和操作系统检查
速度——根据 GPU 内存带宽、量化方式、后端、适配类型和 MoE 激活参数量估算 tok/s
评分——基准测试(进行置信度抑制)、规模、量化惩罚、适配类型、速度、流行度、来源可信度(官方与重新打包者)
后端筛选——为保证稳定性,Apple Silicon 和仅使用 CPU 的环境仅限 GGUF;Linux + NVIDIA 允许 AWQ/GPTQ
src/whichllm/
├── cli.py # Typer CLI:main、plan、run、snippet、hardware
├── constants.py # 注册表数据的向后兼容导出
├── data/ # GPU、量化、框架和模型谱系注册表
├── hardware/
│ ├── detector.py # 编排 GPU/CPU/内存检测
│ ├── nvidia.py # 通过 nvidia-ml-py 检测 NVIDIA GPU
│ ├── amd.py # AMD GPU(Linux)
│ ├── apple.py # Apple Silicon(Metal)
│ ├── cpu.py # CPU 名称、核心数、AVX 支持
│ ├── memory.py # 可用内存和磁盘空间
│ ├── gpu_simulator.py # --gpu 标志:根据名称模拟 GPU
│ └── types.py # GPUInfo、HardwareInfo
├── models/
│ ├── fetcher.py # HuggingFace API、模型解析、evalResults
│ ├── benchmark.py # Arena ELO、Leaderboard(parquet/rows API)
│ ├── grouper.py # 按 base_model 和名称进行家族分组
│ ├── cache.py # 带 TTL 的 JSON 缓存
│ └── types.py # ModelInfo、GGUFVariant、ModelFamily
├── engine/
│ ├── vram.py # 显存 = 权重 + KV 缓存 + 激活值 + 开销
│ ├── compatibility.py# 适配类型、磁盘检查、计算能力/操作系统警告
│ ├── performance.py # 根据带宽估算 tok/s
│ ├── quantization.py # 每个权重占用的字节数、质量惩罚、非 GGUF 推理
│ ├── ranker.py # 评分、证据筛选、配置档/匹配
│ └── types.py # CompatibilityResult
└── output/
├── ranking.py # Rich 硬件和推荐表格
├── json_output.py # 排名、规划和升级 JSON
├── plan.py # plan 命令显示
├── upgrade.py # 升级对比显示
└── display.py # 兼容性重新导出垫片
git clone https://github.com/Andyyyy64/whichllm.git
cd whichllm
uv sync --dev
uv run whichllm
uv run pytest
欢迎贡献!相关准则请参阅 CONTRIBUTING.md。
如果 whichllm 帮助你找到了合适的模型,或避免了错误的硬件判断,欢迎赞助。这将有助于项目的持续维护,包括硬件报告、打包、测试夹具、基准测试更新,以及对更多机器的支持。
无论是否获得赞助,whichllm 都会保持开源。始终欢迎提交 Issue 和 PR。
觉得有用?在 GitHub 上点个 Star 能帮助更多人发现它,而且我真的很想知道它为你的设备选出了什么模型。欢迎在 Issues 中分享。
通过 nvidia-ml-py 检测 NVIDIA GPU(默认包含)
自动检测 AMD / Apple Silicon