Performances et mémoire
Chronicler est lent pour l'une de ces trois raisons, par ordre de probabilité :
- Il n'y a pas de carte graphique, ou il y en a une et elle n'est pas utilisée.
- Docker n'a pas assez de mémoire, et le modèle se recharge sans arrêt.
- Le modèle est trop gros pour la machine et déborde sur le disque.
Traitez-les dans cet ordre. Accélération GPU couvre le premier point, cette page couvre les autres.
1. Donner plus de mémoire à Docker
C'est le réglage que l'on vise quand on dit « allouer plus de RAM », et il se trouve dans Docker, pas dans Chronicler. Rien dans le fichier compose ne peut l'augmenter.
Docker Desktop avec le moteur WSL2 prend sa mémoire via WSL, et par défaut il
peut prendre jusqu'à la moitié de la machine. Pour fixer la valeur, créez ou
modifiez %UserProfile%\.wslconfig :
[wsl2]
memory=16GB
processors=8
swap=8GB
Puis, dans un PowerShell administrateur :
wsl --shutdown
Redémarrez Docker Desktop. Laissez au moins 4 à 8 Go à Windows : affamer le système pour nourrir le modèle empire tout.
wsl --shutdown arrête vos conteneurs. À faire quand personne n'utilise le
serveur.Les conteneurs utilisent directement la mémoire de la machine : il n'y a rien à augmenter. Assurez-vous simplement qu'il y en a assez de libre, et qu'un espace d'échange existe pour qu'un pic ne fasse pas tuer le backend :
free -h
Vérifiez ce que Docker a réellement obtenu :
docker info --format "{{.MemTotal}}"
En dessous de 4 Gio, le backend sera tué dès le chargement d'un modèle.
2. Régler le runtime du modèle
Ces valeurs vont dans le .env à côté de votre fichier compose. Chacune est
facultative : omise, le réglage par défaut d'Ollama s'applique. Lancez
docker compose up -d après modification.
| Réglage | Défaut | Effet |
|---|---|---|
OLLAMA_KEEP_ALIVE | 5m | Durée pendant laquelle le modèle reste chargé après une question. |
OLLAMA_NUM_PARALLEL | automatique | Nombre de questions traitées simultanément par un modèle. |
OLLAMA_MAX_LOADED_MODELS | automatique | Nombre de modèles différents gardés en mémoire. |
OLLAMA_CONTEXT_LENGTH | 16384 | Contexte par défaut pour les clients qui n'en demandent pas. |
OLLAMA_KEEP_ALIVE — celui qui vaut le détour
Ollama décharge le modèle cinq minutes après la dernière question. La question suivante repaie le chargement complet : une à trois minutes sur processeur, quelques secondes sur carte graphique. Sur un serveur dédié, rien ne justifie de repayer cela.
OLLAMA_KEEP_ALIVE=-1
-1 garde le modèle résident en permanence. Le coût est exactement la mémoire du
modèle (3 à 20 Go selon le modèle), occupée même quand personne ne demande rien.
Sur une machine partagée qui a d'autres tâches, préférez 2h.
OLLAMA_NUM_PARALLEL — pour plusieurs personnes à la fois
Chaque emplacement parallèle a sa propre mémoire de contexte, en plus du poids du
modèle. Doubler la valeur double à peu près cette mémoire. À un ou deux
utilisateurs, n'y touchez pas ; la valeur 1 libère aussi de la mémoire sur une
petite machine.
OLLAMA_NUM_PARALLEL=4
Utile seulement avec de la mémoire disponible. Si la machine est déjà juste, davantage d'emplacements ralentit tout au lieu d'accélérer.
OLLAMA_MAX_LOADED_MODELS
Chronicler génère avec un seul modèle : ne pas y toucher convient à presque tout
le monde. La valeur 1 sur une petite machine garantit qu'un second modèle ne
s'installera jamais en mémoire.
OLLAMA_CONTEXT_LENGTH
Mentionné pour être complet. Le modifier n'est presque jamais la solution recherchée.
3. Régler la base de données
Également dans .env. Les valeurs par défaut sont celles de PostgreSQL, connues
pour leur prudence.
| Réglage | Défaut | Effet |
|---|---|---|
POSTGRES_SHARED_BUFFERS | 128MB | Cache de la base. Celui qui compte pour la recherche sur une grande bibliothèque. |
POSTGRES_WORK_MEM | 4MB | Mémoire par tri. À augmenter par petits paliers. |
POSTGRES_SHARED_BUFFERS=2GB
POSTGRES_WORK_MEM=32MB
Une règle empirique répandue pour shared_buffers est 25 % de la mémoire que
vous acceptez de donner à la base. work_mem est alloué par tri, pas par
connexion : une grande valeur multipliée par de nombreuses requêtes simultanées
est la façon classique d'épuiser la mémoire. 32 Mo est généreux, 1 Go est une
erreur.
À ne considérer qu'à partir de plusieurs milliers de documents. En dessous, la valeur par défaut suffit et c'est le modèle qui limite.
4. Choisir un modèle à la bonne taille
Un modèle qui ne tient pas est le pire cas : il déborde sur le disque et chaque réponse prend des minutes. Adaptez le modèle à la mémoire réellement disponible — voir Modèles. Plus petit et résident bat plus gros et qui déborde, à chaque fois.
Exemples concrets
Portable, sans GPU, 16 Go
Docker : 8 Go. Modèle : gemma4:e2b.
OLLAMA_KEEP_ALIVE=30m
OLLAMA_NUM_PARALLEL=1
Serveur de bureau, sans GPU, 32 Go
Docker : 24 Go. Modèle : gemma4:e4b.
OLLAMA_KEEP_ALIVE=-1
OLLAMA_NUM_PARALLEL=2
POSTGRES_SHARED_BUFFERS=2GB
POSTGRES_WORK_MEM=16MB
Station de travail, NVIDIA 24 Go
COMPOSE_PROFILES=nvidia. Modèle : gemma4:26b.
OLLAMA_KEEP_ALIVE=-1
OLLAMA_NUM_PARALLEL=4
POSTGRES_SHARED_BUFFERS=4GB
POSTGRES_WORK_MEM=32MB
Vérifier ce que vous avez changé
docker compose config | grep -A6 "OLLAMA_" # ce que compose a résolu
docker exec chronicler-ollama env | grep OLLAMA # ce que le conteneur a reçu
docker exec chronicler-postgres psql -U chronicler -d chronicler_app -c 'show shared_buffers;'
docker stats --no-stream # ce que tout cela consomme
Un réglage absent du .env n'apparaîtra pas du tout dans le conteneur. C'est
normal : cela signifie que la valeur par défaut du runtime s'applique.
De la vitesse qui ne tient pas à la mémoire
- Cadrez vos questions. Une conversation limitée à trois documents est bien plus rapide qu'une conversation ouverte sur tout.
- Indexez aux heures creuses. Les imports en masse, surtout scannés, se disputent le processeur avec les conversations.
- Utilisez un SSD. Charger un modèle de 20 Go depuis un disque mécanique est une mauvaise minute.