N. Corbellari
← Notes

Local LLM

Développer localement avec l'IA

Pourquoi est-il si difficile de faire tourner un LLM en local ? Entre VRAM, contexte et quantification, voici comment je développe avec l'IA sur une carte graphique de 16 Go.

Introduction

Récemment, Apple a annoncé le MacBook Pro M5 Pro et le M5 Max. Deux monstres informatiques capables de faire tourner des IA localement, avec entre 24 Go et 128 Go de mémoire unifiée. Pourtant, même avec une telle machine, vous ne pourriez pas faire tourner le modèle DeepSeek, qui nécessite aujourd’hui 1,4 To de VRAM.

Fiche technique du modèle DeepSeek

Le pire étant que ce modèle est excellent, mais qu’il n’arrive qu’en 15e position de l’index d’intelligence des LLM. (ref)

Classement de l’index d’intelligence des LLM

Une question s’impose :

Pourquoi est-ce si compliqué de servir une intelligence artificielle ?

De quoi un LLM a-t-il besoin pour fonctionner ?

D’un point de vue matériel, un LLM a besoin de deux éléments principaux :

  • une carte graphique (avec beaucoup de VRAM)
  • de la RAM

C’est quoi la VRAM ?

La VRAM (Video Random Access Memory), vulgarisée, c’est la quantité de données que votre carte graphique peut stocker et traiter. C’est exactement la même chose que la RAM, mais dédiée exclusivement à la carte graphique.

Comment fonctionne l’inférence d’un LLM

Contexte

La compréhension du mécanisme complet d’inférence d’un LLM est très complexe. Ce qu’il faut comprendre, c’est que le document académique Attention Is All You Need a expliqué en 2017 comment l’architecture Transformer permettait de réaliser des opérations en parallèle plutôt qu’en séquentiel sur des cartes graphiques. C’est ce qui a donné naissance à la famille des modèles GPT, dont le célèbre GPT-3.

Fonctionnement concret

Cette section explique comment un modèle d’IA fonctionne localement sur un ordinateur.

1. Chargement du modèle

Le modèle est un fichier généralement en extension .safetensors, .gguf ou .pth qui représente les poids du modèle (le modèle en lui-même).

Celui-ci doit être importé entièrement dans la mémoire de votre carte graphique (votre VRAM) ! Toute la difficulté de l’inférence d’une IA réside ici : l’intégralité du modèle doit tenir dans votre carte graphique.

Chargement des poids du modèle dans la VRAM

2. Inférence

Votre LLM est maintenant dans la mémoire de votre carte graphique et vous pouvez discuter avec lui. Au fur et à mesure que vous discutez avec votre LLM, un autre paramètre va entrer dans l’équation : le contexte.

C’est quoi le contexte ?

Le contexte, c’est la quantité d’informations qu’une IA peut stocker au cours d’une discussion. Pour que le LLM se rappelle des messages précédents (aussi bien ceux des utilisateurs que les siens), il est nécessaire de les stocker quelque part.

Où se situe le contexte ?

Le contexte doit aussi se situer dans la VRAM. C’est un paramètre qui complique d’autant plus l’opération : nous sommes déjà limités par la taille du modèle, à laquelle s’ajoute désormais le contexte.

Plus le modèle est grand, plus le stockage du contexte en VRAM coûte cher.

Modèle Paramètres Consommation moyenne par token
Mistral 7B 7 milliards ~0,13 Mo par token
Llama 3 70B 70 milliards ~0,65 Mo par token (quintuplé)

Il est aussi important de comprendre qu’une conversation ne peut pas être infinie. Chaque modèle possède une limite de contexte appelée Context Window.

Fenêtre de contexte d’un modèle

Le principe est simple. Lorsque l’on commence une conversation, le contexte est à 0 (ou quelques milliers de tokens avec des instructions). Par la suite, plus l’utilisateur parle avec l’IA, plus le contexte se remplit.

Inférence : modèle et contexte résident dans la VRAM

Et si le contexte et le modèle dépassent la VRAM ?

Plus haut, je mentionnais que la RAM est un composant important pour l’inférence d’une intelligence artificielle. Lorsque la carte graphique ne peut plus supporter la charge du modèle et du contexte, les données excédentaires sont déversées dans la RAM classique. Malheureusement, cela a une conséquence considérable sur les performances : la RAM est beaucoup plus lente que la VRAM, et les performances de génération chutent. On passe de 20 à 30 tokens par seconde à quelques tokens par seconde.

Débordement de la VRAM vers la RAM système

Le compromis

Comme vous avez pu le comprendre, il est nécessaire de trouver un compromis. Les deux situations extrêmes sont les suivantes :

L’intelligence sans mémoire

Vous avez un agent extrêmement intelligent, mais votre contexte est limité à une dizaine de milliers de tokens.

Résultat : une intelligence inexploitable, car la moindre tâche complexe qui nécessite de la réflexion ou de la recherche épuisera le contexte existant.

Le simplet bavard

Vous avez un agent très peu intelligent, mais il dispose d’un contexte gigantesque de plus de cent mille tokens.

Résultat : un agent qui peut réfléchir longtemps, mais qui techniquement n’est pas assez intelligent pour réaliser une tâche complexe.

Le meilleur compromis

Tout dépend des tâches réalisées par le LLM. Il faut trouver le sweet spot entre un contexte exploitable et une intelligence suffisante.

Pour un travail de traduction de quelques pages, le contexte n’a pas besoin d’être immense. Pour un travail de codage agentique, le contexte devra être important.

C’est un paramètre propre à chaque installation et à chaque usage.

Des optimisations existantes

Il existe aujourd’hui énormément de manières de réduire la taille du contexte et celle du modèle tout en conservant leur qualité.

La quantification du modèle

Le principe de la quantification est de prendre un LLM et de réduire la précision numérique des poids et des activations d’un modèle dans le but de réduire sa taille, et donc son empreinte mémoire.

Modèle Quantification Poids
Qwen3.8-27B F16 (flottant 16 bits) ~55,6 Go
Qwen3.8-27B-4bit F4 (flottant 4 bits) ~16 Go
La quantification du KV cache

Il s’agit du même principe, mais appliqué au contexte.

MoE (Mixture of Experts)

Le concept est récent et très complexe. Le principe est que le modèle est segmenté en “unités d’expertise” et que, durant l’inférence, au lieu de charger l’intégralité du modèle, seules une partie de ces unités d’experts sont appelées.

Ma configuration avec 16 Go de VRAM

C’est un sujet que je trouve passionnant et que j’essaie d’intégrer dans mon travail. Cette section va décrire le meilleur compromis que j’ai actuellement avec mon matériel. Je considère mon matériel comme étant déjà moyen/haut de gamme.

Mon matériel

Matériel Modèle
Carte graphique RTX 5070 Ti (16 Go de VRAM)
RAM 32 Go

Ma configuration

Moteur d’inférence

Pour réaliser l’inférence sur ma machine, j’utilise l’outil AJEAN, car il s’appuie sur llama.cpp comme moteur d’inférence et permet un contrôle beaucoup plus fin que des alternatives comme Ollama.

Interface d’AJEAN, le moteur d’inférence local

Modèle

Pour réaliser des tâches de code et de développement, j’utilise majoritairement le modèle Qwen3.8-27B-UD-IQ4_XS. Il fait 15,4 Go, ce qui peut paraître très juste pour le contexte, mais la quantification du KV cache permet en réalité de conserver une bonne marge de manœuvre. De plus, le modèle IQ4, bien que quantifié, parvient à conserver une intelligence relativement correcte sur des tâches complexes. Le MTP (Multi-Token Prediction, ou prédiction multi-token) est désactivé, sinon le contexte en est trop impacté et les bénéfices ne sont pas significatifs. Enfin, avec 16 Go de VRAM, la vision n’est pas envisageable sans conséquence sur l’intelligence du modèle.

Harness

Comme indiqué dans cette note, OpenCode n’est pas pratique pour du développement local, notamment à cause du contexte initial injecté dans chaque conversation. Par conséquent, j’utilise Pi, qui permet une meilleure gestion du contexte. Ces deux plateformes de harness disposent d’une fonctionnalité d’auto-compaction. Lorsque l’espace VRAM disponible arrive à saturation, le harness reprend l’intégralité du contexte et réalise un travail de synthèse. Le contexte est ensuite vidé, et le résumé est injecté à sa place.

Auto-compaction du contexte par le harness