psutil.virtual_memory() failed; system_ram_gb=0
Traceback (most recent call last):
  File "F:\Projects\cymatix-context\.claude\worktrees\perf-slice1\cymatix_context\hardware.py", line 82, in _detect_cpu
    import psutil
ModuleNotFoundError: No module named 'psutil'
resolved dense device: cuda:0
torch 2.11.0+cu128  cuda_available=True  num_threads=8

-- BGE-M3 dense (query encode) --
codec device: ?

Loading weights:   0%|          | 0/391 [00:00<?, ?it/s]
Loading weights: 100%|##########| 391/391 [00:00<00:00, 24327.25it/s]
bge-m3 single                threads=1     47.0 enc/s  (1.1s/50)
bge-m3 threaded              threads=2     45.6 enc/s  (1.1s/50)
bge-m3 threaded              threads=4     44.8 enc/s  (1.1s/50)
bge-m3 threaded              threads=8     35.7 enc/s  (1.4s/50)
bge-m3 batch bs= 8              171.2 enc/s
bge-m3 batch bs=16              421.6 enc/s

-- SPLADE (query encode) --

Loading weights:   0%|          | 0/204 [00:00<?, ?it/s]
Loading weights: 100%|##########| 204/204 [00:00<00:00, 18014.19it/s]
splade single                threads=1     90.2 enc/s  (0.6s/50)
splade threaded              threads=2    110.6 enc/s  (0.5s/50)
splade threaded              threads=4    135.5 enc/s  (0.4s/50)

-- SEMA / MiniLM --

Loading weights:   0%|          | 0/103 [00:00<?, ?it/s]
Loading weights: 100%|##########| 103/103 [00:00<00:00, 7199.62it/s]
sema single                  threads=1    140.4 enc/s  (0.4s/50)
sema threaded                threads=2    155.0 enc/s  (0.3s/50)

-- implied worker ceilings --
per-family best enc/s: {'bge': 421.6, 'splade': 135.5, 'sema': 155.0}
bottleneck encoder: splade at 135.5 enc/s
  dogfood   (pipeline  0.73s/query): ~ 98.9 concurrent workers before encoder saturation
  erb_100k  (pipeline  5.10s/query): ~691.2 concurrent workers before encoder saturation
  erb_829k  (pipeline 26.10s/query): ~3537.3 concurrent workers before encoder saturation

-- cross-encoder rerank (50 pairs, bs=16) --

Loading weights:   0%|          | 0/105 [00:00<?, ?it/s]
Loading weights: 100%|##########| 105/105 [00:00<00:00, 6712.73it/s]
cross-encoder 50 pairs: 219ms
DONE
