-
Notifications
You must be signed in to change notification settings - Fork 0
Troubleshooting
Check logs:
docker compose logs winnowCommon causes:
-
Missing required env var —
IMMICH_URLorAPI_KEYnot set -
Cannot reach Immich — check the URL and that Immich is running; use
http://nothttps://unless you have TLS set up
Your API key has been revoked or expired. Generate a new one in Immich → Account Settings → API Keys and update API_KEY in your .env.
Set VERBOSE=true in .env (or pass -e VERBOSE=true) to enable DEBUG-level output on the console. Useful for tracing exactly which images are being fetched, filtered, and selected.
The log file at /app/winnow.log always captures DEBUG regardless of VERBOSE:
docker exec winnow cat /app/winnow.log- Make sure Immich has completed face recognition and you have named people in your library
-
YEARS_FILTERdefaults to 10 years — increase it if your tagged photos are older -
MIN_FACE_COUNTskips people with few photos — lower or remove it
- Confirm
FRIGATE_URLis reachable from inside the container:docker exec winnow curl $FRIGATE_URL/api/stats - Check Frigate v0.16+ — older versions don't have the face training API
- Set
DRY_RUN=trueto verify selection without uploading
winnow downloads InsightFace and HuggingFace (SigLIP) models on first run.
- Ensure the container has internet access
- Confirm the model volume is mounted and writable
- If behind a proxy, set
HTTP_PROXY/HTTPS_PROXYenv vars
Use the :cpu image tag (ghcr.io/sudolulo/winnow:cpu) which omits the CUDA base entirely. Or set FORCE_CPU=true with :latest to disable GPU at runtime.
Everything works on CPU but embedding computation is slower — typically tens of seconds per person instead of under a second on GPU.
Memory: CPU mode requires more host RAM than GPU mode. Set a minimum container memory limit of 2 GB (mem_limit: 2g in compose). If you have a large library — hundreds of images per person — allow more. Thumbnails are processed in bounded batches of 32 so peak RAM stays flat regardless of library size, but the embedding models themselves use roughly 1–1.5 GB.
If you have a GPU and the container is running but winnow reports no GPU provider:
-
Confirm the GPU device is visible inside the container:
docker exec winnow nvidia-smiIf this fails, the container doesn't have GPU access — check the
deploy.resources.reservations.devicesblock incompose.ymland that the NVIDIA container toolkit is installed on the host. -
Check which ONNX providers are available:
docker exec winnow /app/.venv/bin/python3 -c \ "import onnxruntime as ort; ort.preload_dlls(cuda=True, cudnn=True); print(ort.get_available_providers())"
Expected (GPU working):
['CUDAExecutionProvider', 'CPUExecutionProvider', ...]
GPU not working:['AzureExecutionProvider', 'CPUExecutionProvider']— only CPU providers listed. -
If only CPU providers appear even though
nvidia-smiworks, you may be running an image older than 0.2.11. A packaging bug in 0.2.10 caused the CPUonnxruntimepackage to silently overwriteonnxruntime-gpu, removing GPU support without any error. Update to:latestto fix it:docker compose pull && docker compose up -d -
Set
VERBOSE=trueand check startup logs — winnow logsONNX providers available: [...]at DEBUG level on every start.
The upload tracker is stored in CACHE_DIR (/app/.if_cache by default). If this volume isn't persisted between runs, the tracker resets and images are re-uploaded.
Make sure /app/.if_cache is mounted to a persistent host path.
To clear the upload history for one person and start fresh:
RESET_PERSON=JohnRemove this after one run — it clears the history and then processes normally.
-
Too blurry: Lower
BLUR_THRESHOLD(default 100) — e.g.50accepts more blur -
Face too small: Lower
MIN_FACE_WIDTH(default 50px) -
Low confidence detections included: Raise
MIN_CONFIDENCE(default 0.7) -
Rejected images being re-tried: Set
RETRY_REJECTED=truefor one run