Aller au contenu

Benchmark TurboQuant sur Apple Silicon

TurboQuant (Google Research, ICLR 2026) compresse le KV cache des LLM de 5x sans perte de qualité, permettant de faire tourner des modèles 70B sur un Mac Mini avec 64 Go de RAM. Voici des benchmarks réels mesurés avec asiai sur du matériel réel.

Résultats

Llama-3.1-70B-Instruct Q4_K_M sur Mac Mini M4 Pro 64 Go

Métrique Valeur
Débit 6,3 tok/s (stable, IC 95 % : 6,3-6,3)
TTFT 196 ms (médiane)
Puissance GPU 23,8 W
VRAM modèle 44,1 Go (40 Go poids + 4 Go KV turbo3)
Contexte 32 768 tokens
GPU Offload 81/81 couches sur Metal
Thermique Nominal (pas de throttling)
Stabilité Stable (écart-type 0,04 tok/s sur 3 exécutions)

Configuration du KV cache : clés en q8_0 (haute précision), valeurs en turbo3 (3 bits, compression 5x).

Avant vs Après TurboQuant

Sans TurboQuant Avec TurboQuant (turbo3)
KV cache (ctx 32K) ~20 Go (q8_0) ~4 Go (turbo3)
RAM totale nécessaire 60+ Go (OOM sur 64 Go) 44 Go (tient dans 64 Go)
Peut-on faire tourner 70B sur 64 Go ? Non Oui
Qualité Référence -1 % PPL (négligeable)
Récupération NIAH 100 % 100 %

Qu'est-ce que TurboQuant ?

TurboQuant est un algorithme de compression du KV cache développé par Google Research, présenté à l'ICLR 2026. Pendant l'inférence des LLM, le KV cache stocke les états d'attention intermédiaires et croît linéairement avec la longueur du contexte. Pour un modèle 70B avec un contexte de 128K en FP16, ce cache seul peut consommer 20 à 40 Go de RAM.

TurboQuant compresse ce cache à 3 bits par valeur en utilisant :

  • Rotation aléatoire (transformée de Walsh-Hadamard) pour gaussianiser les données
  • Quantification scalaire optimale (PolarQuant) proche de la limite de Shannon
  • QJL (Quantized Johnson-Lindenstrauss) pour préserver les produits scalaires

Le résultat : 5x de réduction mémoire, pas de fine-tuning nécessaire, et une perte de qualité quasi nulle.

Guide d'installation

Matériel

  • Mac Mini M4 Pro, 64 Go de mémoire unifiée (2 700 $)
  • Tout Mac Apple Silicon avec 32+ Go devrait fonctionner (ajustez la taille du modèle en conséquence)

Installer TurboQuant llama.cpp

# Install build tools
brew install cmake

# Clone the TurboQuant fork
git clone https://github.com/TheTom/llama-cpp-turboquant.git
cd llama-cpp-turboquant
git checkout feature/turboquant-kv-cache

# Build with Metal (Apple Silicon GPU)
cmake -B build -DGGML_METAL=ON -DGGML_METAL_EMBED_LIBRARY=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(sysctl -n hw.ncpu)

Télécharger un modèle

# Llama 3.1 70B Q4_K_M (~40 GB)
curl -L -o llama-3.1-70b-q4_k_m.gguf \
  "https://huggingface.co/bartowski/Meta-Llama-3.1-70B-Instruct-GGUF/resolve/main/Meta-Llama-3.1-70B-Instruct-Q4_K_M.gguf"

Augmenter la limite mémoire GPU de macOS

sudo sysctl iogpu.wired_limit_mb=61440

Lancer le serveur

./build/bin/llama-server \
  -m llama-3.1-70b-q4_k_m.gguf \
  --cache-type-k q8_0 --cache-type-v turbo3 \
  -c 32768 \
  --port 8081 \
  --host 0.0.0.0 \
  -fa 1 \
  -ngl 99 \
  -t 10 \
  --no-mmap \
  --chat-template chatml

Explication de la configuration

Paramètre Valeur Pourquoi
--cache-type-k q8_0 Clés en 8 bits Les clés sont sensibles à la compression
--cache-type-v turbo3 Valeurs en 3 bits Les valeurs tolèrent une compression extrême (5x)
-fa 1 Flash Attention Requis pour TurboQuant
-ngl 99 GPU offload complet Les 81 couches sur Metal
-t 10 10 threads Le M4 Pro a 10 coeurs de performance
--no-mmap Pas de memory mapping Charge tout au démarrage, évite les défauts de page
--chat-template chatml Format ChatML Meilleure compatibilité avec ce fork

Benchmark avec asiai

pip install asiai
asiai detect --url http://localhost:8081
asiai bench --engines llamacpp --prompts code --runs 3 --kv-cache turbo3 --card

Modèles compatibles 64 Go avec TurboQuant

Modèle Poids (Q4_K_M) KV Cache (32K, turbo3) Total Statut
Llama 3.1 70B 40 Go ~4 Go 44 Go Testé : 6,3 tok/s
Qwen2.5 72B 40 Go ~4 Go 44 Go Devrait fonctionner
Llama 70B ctx 128K 40 Go ~16 Go (turbo3) 56 Go Serré mais possible
Command-R+ 104B 58 Go ~4 Go 62 Go Très serré

FAQ

Peut-on faire tourner un modèle 70B sur un Mac avec 64 Go de RAM ?

Oui, avec TurboQuant. Le KV cache est compressé 5x, donc Llama 70B Q4_K_M (40 Go de poids) tient confortablement dans 64 Go avec un contexte de 32K. Nous avons mesuré 6,3 tok/s sur un Mac Mini M4 Pro.

TurboQuant réduit-il la qualité ?

Aucune perte de qualité mesurable. L'augmentation de la perplexité est inférieure à 1 % par rapport à q8_0, et le score de récupération Needle-in-a-Haystack atteint 100 % sur un contexte de 32K.

Quel format TurboQuant utiliser ?

Asymétrique : q8_0 pour les clés + turbo3 pour les valeurs. Les clés sont sensibles à la compression (toute la dégradation de qualité vient de la compression des K). Les valeurs peuvent être compressées à 2-3 bits sans aucun effet sur la qualité de l'attention.

TurboQuant fonctionne-t-il avec MLX ?

Des implémentations communautaires existent (turboquant-mlx) mais sont moins matures que le fork llama.cpp. Pour un usage en production, nous recommandons TheTom/llama-cpp-turboquant.

Comment cela se compare-t-il au llama.cpp standard ?

La vitesse de décodage est d'environ 0,9x par rapport à q8_0 (légèrement plus lent par token), mais le vrai gain est de faire tenir des modèles et des contextes qui ne tenaient tout simplement pas avant. Le prefill peut en fait être plus rapide sur de longs contextes grâce à la réduction de la pression sur la bande passante mémoire.

Références