Files
2026-07-13 12:29:01 +08:00

424 lines
10 KiB
Markdown

# Troubleshooting
This page lists common issues and the first checks to make.
## No GPU detected
Run:
```bash
whichllm hardware
```
If an NVIDIA GPU is missing:
- check that the driver is installed
- check `nvidia-smi`
- check that `nvidia-ml-py` can load NVML
whichllm falls back to `nvidia-smi`, but it still needs the NVIDIA driver tools
to be working.
If an AMD GPU is missing:
- on Linux, check `rocm-smi`, `lspci`, and `/sys/class/drm`
- on Windows, check that PowerShell can read `Win32_VideoController`
- for Ryzen AI / Radeon integrated graphics, check whether `whichllm hardware`
shows shared memory instead of a tiny 512 MB or 4 GB adapter
If an Intel iGPU is missing:
- Linux detection uses `lspci` or `/sys/class/drm`
- Windows detection uses `Win32_VideoController`
- many Intel iGPUs do not expose dedicated VRAM, so they may be shown as shared
memory graphics
## Simulate hardware instead
If detection is unavailable or you are planning a purchase, use `--gpu`:
```bash
whichllm --gpu "RTX 4090"
whichllm hardware --gpu "Apple M3 Max"
whichllm --gpu "RTX 5060 Ti" --vram 16
whichllm --gpu "2x RTX 4090"
whichllm --gpu "RTX 4090" --gpu "RTX 3090"
```
Use `--vram` when the GPU name has multiple memory variants or is not in the
database.
For detected iGPU or unified-memory systems, override the usable GPU memory and
bandwidth directly:
```bash
whichllm hardware --vram 8 --ram-bandwidth 68
whichllm --vram 8 --bandwidth 68
```
If `whichllm hardware` lists multiple GPUs, add `--gpu-index` with the GPU
number from that output.
`--vram` only applies to one simulated or detected GPU. For multi-GPU
simulation, use known GPU names and omit `--vram`.
## `--cpu-only` conflicts with `--gpu`
These flags are mutually exclusive:
```bash
whichllm --cpu-only --gpu "RTX 4090"
```
Choose one:
```bash
whichllm --cpu-only
whichllm --gpu "RTX 4090"
```
## `--vram` / `--bandwidth` needs a GPU
These overrides need either a detected GPU or a simulated GPU:
```bash
whichllm --vram 8 --ram-bandwidth 68
whichllm --gpu "RTX 3060" --vram 12
```
If no GPU is detected, use `--gpu` to simulate one or check the detection steps
above.
## No compatible models found
Try:
```bash
whichllm
whichllm --cpu-only
whichllm --refresh
```
Common causes:
- the selected `--quant` is too restrictive
- `--gpu-only` or `--fit full-gpu` filters out partial-offload and CPU-only candidates
- `--speed usable`, `--speed fast`, or `--min-speed` filters out slower candidates
- `--min-speed` is too high
- `--evidence strict` filters out all candidates
- the requested context length is too large
- available RAM is too low after reserving space for the OS
- disk free space is too low for the model weights
For very small machines, remove optional filters first:
```bash
whichllm --top 20
```
## Recommendations use RAM or CPU offload, but I only want VRAM
By default, whichllm includes any runnable candidate: full-GPU, partial-offload,
and CPU-only. This is useful for finding what can run at all, but it can be too
loose when you want only models that fit entirely in GPU VRAM.
Use:
```bash
whichllm --gpu-only
whichllm --fit gpu
whichllm --fit full-gpu
```
If no rows are shown, this machine has no ranked candidates that fit fully in
GPU memory under the current filters. Remove `--gpu-only`, lower the context
length, or try a smaller quantization.
## A model fits, but it is too slow
The default ranking table shows estimated generation speed. Slow rows are red,
marginal rows are yellow, usable rows are green, and fast rows are bright
green. The `~` and `?` markers are confidence markers for the estimate.
Filter slow rows with:
```bash
whichllm --speed usable # >=10 tok/s
whichllm --speed fast # >=30 tok/s
whichllm --min-speed 4 # exact floor, if you want a lower threshold
```
For an exact threshold:
```bash
whichllm --min-speed 10
```
## LM Studio or another runtime says the model barely does not fit
whichllm estimates model memory, but real runtimes can need extra room for
loader overhead, graph buffers, KV cache choices, and OS pressure. By default,
whichllm reserves a small automatic VRAM headroom before fit checks.
Tune it with:
```bash
whichllm --vram-headroom 1.5GB
whichllm --vram-headroom 10%
whichllm --vram-headroom none
```
Use `none` when you want the old raw-VRAM behavior.
## RAM offload depends on what else is running
Partial offload uses system RAM. If Docker, Elasticsearch, a browser, or
another workload is already using a large amount of memory, cap the offload
budget:
```bash
whichllm --ram-budget available
whichllm --ram-budget 8GB
whichllm --ram-budget 50%
```
`available` reads the current available RAM from the OS at startup. Fixed
values are useful when you know how much memory you want to leave for other
processes.
## Results look stale
whichllm caches model data for 6 hours and benchmark data for 24 hours.
Force a refresh:
```bash
whichllm --refresh
whichllm plan "qwen 7b" --refresh
```
The caches live under:
```text
~/.cache/whichllm/
```
If `XDG_CACHE_HOME` is set to an absolute path, the caches live under:
```text
$XDG_CACHE_HOME/whichllm/
```
## `uvx` fails with `realpath: command not found`
Some older macOS versions do not include a `realpath` command. If the `uvx`
launcher fails before whichllm starts, with output like:
```text
realpath: command not found
/Users/.../python: No such file or directory
```
run whichllm through Python's module entry point instead:
```bash
uvx --from whichllm python -m whichllm
```
Pass normal whichllm arguments after the module name:
```bash
uvx --from whichllm python -m whichllm --gpu "RTX 4090"
```
## The top pick has `~`, `!sr`, or `?`
These markers describe benchmark evidence:
| Marker | Meaning |
| --- | --- |
| `~` | Inherited or interpolated benchmark evidence |
| `!sr` | Uploader-reported benchmark only |
| `?` | No benchmark evidence |
Use stricter evidence when you want only independently matched benchmark data:
```bash
whichllm --evidence strict
whichllm --direct
```
Use `--evidence base` when base-model matches are acceptable but interpolation
and self-reported values are not.
## The largest model did not win
That is expected. whichllm scores:
- benchmark quality
- model size
- quantization loss
- full GPU vs partial offload vs CPU-only
- estimated speed
- evidence confidence
- source trust
- generation lineage
A smaller current-generation model with strong direct evidence can beat a
larger model that only barely fits or relies on stale benchmark data.
## Estimated speed differs from real speed
Speed is an estimate based on:
- model weight size
- MoE active parameters
- GPU memory bandwidth
- quantization efficiency
- backend factor
- partial-offload penalty
Real performance depends on the inference runtime, driver, prompt length,
batching, thermal limits, and background memory pressure.
The default ranking table shows the speed estimate and its confidence marker.
Use `--details` only when you want download counts instead.
Speed colors and markers:
- red: slow generation speed, under 4 tok/s
- yellow: marginal generation speed, 4-10 tok/s
- green: usable generation speed, 10-30 tok/s
- bright green: fast local generation speed, 30+ tok/s
- `~`: estimated speed range is available
- `?`: low-confidence estimate; runtime/backend differences can be large
JSON includes the same information as `speed_confidence`,
`speed_range_tok_per_sec`, and `speed_notes`.
## Apple Silicon partial offload looks different
Apple Silicon uses unified memory. Partial offload does not cross a discrete
PCIe boundary, so whichllm applies a milder speed penalty than it does for
discrete GPUs.
The same is true for recognized AMD shared-memory APUs such as Strix Halo,
Ryzen AI MAX, and Ryzen AI / Radeon 890M-class integrated graphics.
DGX Spark / NVIDIA GB10 is handled the same way when NVIDIA reports GPU memory
as unavailable.
On Windows, `Win32_VideoController.AdapterRAM` can cap around 4 GB. whichllm
uses the 64-bit registry memory value when it is available, and treats known
shared-memory APUs as unified-memory style devices instead of tiny discrete
GPUs.
## `run` says `uv is required`
Install `uv` first:
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```
Then retry:
```bash
whichllm run
```
## `run` cannot download a model
Possible causes:
- the model is gated on HuggingFace
- local HuggingFace authentication is missing
- the selected GGUF filename no longer exists
- network access failed
- disk space is too low
Try a known public GGUF model first:
```bash
whichllm run "qwen 2.5 1.5b gguf"
```
## Hugging Face API access fails or needs a mirror
whichllm uses the Hugging Face API to fetch model metadata. If direct access to
`huggingface.co` fails in your network, set `HF_ENDPOINT` to a compatible
endpoint root:
```powershell
$env:HF_ENDPOINT = "https://huggingface.co"
whichllm --refresh
```
```bash
HF_ENDPOINT="https://huggingface.co" whichllm --refresh
```
Do not include `/api` in `HF_ENDPOINT`; whichllm adds that path internally.
## How much disk space does `run` need?
Normal ranking commands do not download model weights. They cache Hugging Face
model metadata and benchmark metadata under the whichllm cache.
`whichllm run` downloads the selected GGUF file through `huggingface_hub`. The
required disk space is roughly the selected GGUF file size plus normal Hugging
Face cache overhead.
By default, Hugging Face stores downloaded files under:
```text
~/.cache/huggingface/hub
```
You can move that cache by setting `HF_HOME` or `HF_HUB_CACHE`.
Cleanup is handled by the Hugging Face cache tools:
```bash
hf cache scan
hf cache delete
```
whichllm does not currently delete model files automatically after a run.
## Ollama names do not match HuggingFace IDs
JSON output returns HuggingFace repo IDs:
```bash
whichllm --top 1 --json | jq -r '.models[0].model_id'
```
Ollama model names often use a different naming scheme. Map the HuggingFace ID
to your local Ollama model name before calling `ollama run`.
## Debugging a specific model
Use `plan` to inspect memory requirements:
```bash
whichllm plan "Qwen2.5-72B" --quant Q4_K_M
whichllm plan "Qwen2.5-72B" --quant Q8_0 --context-length 32768
```
Use plain output when filing issues:
```bash
whichllm --gpu "RTX 4090" --json
whichllm --gpu "RTX 4090" --markdown
whichllm hardware
```
Include:
- OS
- GPU name and VRAM
- CPU and RAM
- command used
- expected result
- actual result