Trois ajouts pour rendre le pipeline utilisable sur CPU quand la VRAM
est saturée par d'autres process :
1. Variable QWEN_DEVICE=cpu pour forcer le device CPU. Le défaut "auto"
choisit CUDA si dispo, fallback CPU sinon.
2. Sur CPU, détection automatique du support AVX-512 BF16 via /proc/cpuinfo
(Zen 4/5, Intel Sapphire Rapids+). Si présent, bfloat16 au lieu de
float32 — divise par 2 la RAM et ~2x plus rapide sur matmul.
3. Appel explicite de torch.set_num_threads(N) et set_num_interop_threads(N)
(OMP_NUM_THREADS seul ne suffit pas). Configurable via TORCH_NUM_THREADS,
défaut = os.cpu_count().
Mesure sur Ryzen 9 9950X (Zen 5, 16c/32t, AVX-512 BF16 natif) :
- AVANT : 645% CPU (~6.5 cores), 15 Go RAM (float32)
- APRÈS : 2433% CPU (~24 cores), 8 Go RAM (bfloat16)
Appel `torch.cuda.empty_cache()` en fin d'inférence pour réduire la
fragmentation VRAM quand d'autres process GPU tournent en parallèle.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>