• Stefy Lanza (nextime / spora )'s avatar
    feat: add DINOv2-SALAD VPR (8448-d) as an isolated-subprocess embedding model · 319fb44a
    Stefy Lanza (nextime / spora ) authored
    Second VPR option for REQUEST-vpr-embeddings.md, alongside the in-process
    EigenPlaces. SALAD is near-SOTA for place recognition but its deps
    (pytorch_lightning, pytorch_metric_learning) are heavy and version-sensitive, so
    it runs in a SEPARATE process with those deps quarantined in a
    --system-site-packages venv (shares the main torch, adds only the extras). The
    main engine venv never imports them — verified clean.
    
    - codai/api/vpr_salad_server.py: stdin image-path -> stdout JSON embedding server
      (same protocol as dinov2-embed), GPU-preferred with CPU fallback, announces its
      true width (8448) on ready.
    - embeddings.py: 'salad'/'dinov2-salad' -> 'vpr-server' backend that spawns the
      server via /cache/salad-venv/bin/python; reuses the dinov2cpp reader/cleanup.
    - Self-healing: _EmbeddingModel gains a respawn hook. If the manager kills the
      child under VRAM pressure but keeps the cached model, the embed path now
      respawns the server in place instead of failing forever with a stale handle
      (this was causing persistent "process died" 500s once salad was evicted).
    - packaging/setup-salad-venv.sh: idempotent creator for the isolated venv.
    
    Both VPR models pass the decisive ordering test on same-place/different-place
    image sets (zero overlap between same-place min and different-place max); SALAD's
    margin (0.516 vs 0.150) is wider than EigenPlaces' (0.479 vs 0.349). Verified:
    8448-d L2=1.0, deterministic, ~0.2s warm / ~8s cold, GPU, subprocess isolation
    intact. Config: models.json 'salad' + alias 'dinov2-salad', engine nvidia.
    Co-Authored-By: 's avatarClaude Opus 4.8 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LoSpEthysqmseCc6Geizty
    319fb44a
setup-salad-venv.sh 1.1 KB