Brief IA : Ollama : Optimisation locale des modèles de langue révolutionnée

Ollama : Optimisation locale des modèles de langue révolutionnée

Brief IA
Tom Levy·9 min·4 vues

Ollama offre un moteur de configuration qui permet d'affiner les paramètres des modèles de langue locaux, améliorant ainsi leur performance. Cette personnalisation est cruciale pour les développeurs qui souhaitent adapter les modèles à des besoins spécifiques, optimisant ainsi l'efficacité des applications basées sur l'IA. En exécutant les modèles localement, Ollama garantit également la confidentialité des données et réduit les coûts liés aux API.

En bref
1Ollama permet l'exécution locale de modèles de langue, garantissant confidentialité et réduction des coûts liés aux API.
2Le Modelfile d'Ollama offre une personnalisation avancée des modèles, similaire à un Dockerfile, pour des performances optimisées.
3Ajuster les hyperparamètres comme la température et les pénalités de répétition améliore la précision et la créativité des modèles.
💡Pourquoi c'est importantLes développeurs peuvent désormais adapter les modèles de langue à des besoins spécifiques, optimisant ainsi les performances et la confidentialité des applications.
Le brief IA que lisent les pros

La recherche en IA te passionne ?

Les papers et avancées qui comptent, expliqués simplement, chaque soir. Gratuit.

Inclus dès l'inscription : notre sélection des meilleurs guides & comparatifs IA.

Choisis ton rythme

Gratuit · Pas de spam · Désabonnement en 1 clic

📄
L'analyse en français

Ollama : Une nouvelle ère pour les modèles de langue locaux

Les modèles de langue continuent de transformer la manière dont les praticiens et développeurs en apprentissage automatique construisent des applications. L'avènement de modèles de langue compacts et performants ajoute une dimension intéressante. En contournant les API tierces, l'exécution des modèles localement garantit une confidentialité totale des données, élimine les coûts par jeton des API et permet un fonctionnement hors ligne. Parmi les outils qui alimentent cette révolution, Ollama s'est imposé comme l'un des standards pour l'inférence locale grâce à son moteur léger basé sur Go, son interface en ligne de commande simple et son système de gestion de modèles robuste semblable à Docker.

Cependant, il est rare que le simple téléchargement d'un modèle et son exécution avec les paramètres par défaut soient optimaux. Les configurations par défaut sont ajustées pour un large public généraliste, souvent au détriment de la performance, du raisonnement déterministe ou des besoins spécifiques des systèmes. Si vous construisez un assistant de codage, un pipeline ETL automatisé ou un système multi-agents, les configurations par défaut entraîneront probablement une latence élevée, des limitations de fenêtre de contexte ou des résultats aléatoires et imprévisibles.

Pour améliorer vos applications d'IA locales, vous devez comprendre comment ajuster à la fois les hyperparamètres au niveau du modèle et les environnements d'exécution au niveau du serveur. Dans cet article, nous allons explorer en profondeur le moteur de configuration d'Ollama, en examinant comment affiner les paramètres des modèles de langue locaux à l'aide du Modelfile d'Ollama, optimiser les performances matérielles avec des variables d'environnement serveur, et formater des flux de prompts précis en utilisant la syntaxe de template Go.

1. Le Modelfile d'Ollama : Votre Plan Local de Modèle

Tout comme un Dockerfile définit comment un conteneur est construit, un Modelfile d'Ollama est un fichier de configuration déclaratif qui définit comment un modèle de langue local doit se comporter. Il vous permet de personnaliser les instructions système, d'ajuster les paramètres du modèle et de regrouper ces configurations dans une nouvelle variante de modèle réutilisable que vous pouvez exécuter avec une seule commande.

Un Modelfile de base se compose d'une référence de modèle de base (en utilisant la directive FROM), de directives au niveau système (en utilisant SYSTEM) et de modifications de paramètres (en utilisant la directive PARAMETER) :

// Exemple : Un Modelfile Développeur Personnalisé
# Utiliser Llama 3.1 8B comme modèle de base
FROM llama3.1:8b
# Définir les paramètres au niveau du modèle
PARAMETER temperature 0.2
PARAMETER num_ctx 8192
PARAMETER min_p 0.05
# Définir la persona système et les directives comportementales
SYSTEM """Vous êtes un ingénieur logiciel d'élite, très précis.
Fournissez des solutions de code concises, modulaires et optimisées.
N'incluez pas de remplissage conversationnel à moins d'y être explicitement invité."""

Pour compiler et exécuter votre modèle personnalisé, vous utilisez la commande ollama create dans votre terminal :

// Créer le modèle nommé 'dev-[llama](/dossier/meta-ia)' à partir du Modelfile
ollama create dev-llama -f ./Modelfile
// Exécuter le modèle nouvellement créé
ollama run dev-llama

En encapsulant ces paramètres directement dans la définition du modèle, vous vous assurez que chaque application ou appel API interrogeant dev-llama hérite de ces optimisations par défaut, sans avoir besoin de passer des charges utiles de paramètres JSON bruts dans chaque requête API.

2. Affinage des Paramètres d'Échantillonnage

Lorsque un modèle génère du texte, il ne "sait" pas quels mots utiliser ; il calcule une distribution de probabilité sur son vocabulaire pour le prochain jeton le plus probable. Les paramètres d'échantillonnage dictent comment le moteur choisit le prochain jeton à partir de cette distribution. Ajuster ces paramètres est le moyen le plus efficace d'aligner la créativité et la précision du modèle avec votre cas d'utilisation spécifique.

Température : Le Régulateur de Randomness

Le paramètre de température contrôle l'échelle de la distribution de probabilité des jetons. Mathématiquement, il divise les logits bruts (scores pré-softmax) générés par le modèle avant qu'ils ne soient convertis en probabilités :

  • Basse température (par exemple, 0.1 à 0.2) : Aplati les options à faible probabilité et amplifie celles à haute probabilité. Cela donne des complétions très déterministes, cohérentes et logiques. Idéal pour la génération de code, le raisonnement mathématique, l'extraction de données structurées (JSON/YAML) et la synthèse factuelle.

  • Haute température (par exemple, 0.8 à 1.2) : Aplati les différences entre les probabilités des jetons, rendant les jetons moins probables plus compétitifs. Cela introduit de la diversité, de l'aléatoire et de la "créativité" dans les réponses. Idéal pour l'écriture créative et le brainstorming.

Configurer pour des tâches hautement déterministes et structurées

PARAMETER temperature 0.1

Top-K, Top-P et Min-P : Rétrécir le Pool de Jetons

Sans contrôle, même à basse température, les modèles peuvent parfois sélectionner des jetons très inappropriés à partir de la queue de la distribution de probabilité. Pour éviter cela, les moteurs de modèles filtrent le pool de jetons actifs avant de sélectionner le jeton final.

  • Top-K (par exemple, 40) : Restreint le pool aux K jetons suivants les plus probables. Tout jeton classé en dessous de 40 est immédiatement rejeté, quelle que soit sa probabilité réelle. C'est une méthode rudimentaire mais efficace pour élaguer les jetons très erratiques.

  • Top-P / Nucleus Sampling (par exemple, 0.90) : Restreint le pool à un ensemble dynamique de jetons dont la probabilité cumulative dépasse le seuil P. Par exemple, à 0.90, Ollama trie tous les jetons de la plus haute à la plus basse probabilité et ne conserve que le groupe supérieur qui constitue les 90 % de la distribution. Si le modèle est très confiant, le pool peut se réduire à seulement 2 ou 3 jetons ; s'il est confus, le pool s'élargit.

  • Min-P (par exemple, 0.05 à 0.10) : Une alternative moderne, largement supérieure à Top-P. Au lieu de prendre une tranche cumulative statique, min_p filtre les jetons dont la probabilité est inférieure à un seuil dynamique par rapport à la probabilité du jeton principal. Par exemple, si le jeton principal a une probabilité de 0.80 et que min_p est fixé à 0.05, le seuil minimum pour qu'un autre jeton soit considéré est 0.80 * 0.05 = 0.04. Si le jeton principal est très certain (par exemple, 0.99), tous les autres jetons sont agressivement élagués. Si le jeton principal est incertain (par exemple, 0.15), le seuil tombe à 0.0075, gardant un large éventail de choix créatifs ouverts.

Établir des limites d'échantillonnage robustes dans le Modelfile

PARAMETER top_k 40
PARAMETER top_p 0.90
PARAMETER min_p 0.05

⚠️ Lors de l'utilisation de min_p, vous devriez généralement laisser top_p à sa valeur par défaut (1.0) ou la régler très haut (0.95+) afin qu'elle n'interfère pas avec le comportement d'échelle dynamique supérieur de min_p.

3. Arrêter les Boucles et les Sorties Répétitives

L'une des défaillances les plus frustrantes dans le déploiement de modèles locaux est la boucle de répétition, où un modèle commence à générer la même phrase, le même bloc de code ou la même phrase indéfiniment. Cela est généralement déclenché par une combinaison d'une petite taille de modèle (par exemple, 1.5B ou 3B de paramètres) et d'un manque de limites de pénalité.

Ollama fournit trois paramètres clés pour prévenir et interrompre ces états de boucle.

Pénalités de Répétition et de Présence

  • Pénalité de répétition (repeat_penalty) : Multiplie les logits bruts des jetons qui ont déjà été générés, les rendant moins susceptibles d'apparaître à nouveau. Une valeur de 1.1 à 1.2 est généralement suffisante pour décourager les boucles sans faire éviter au modèle les mots de grammaire nécessaires (comme "le" ou "et").

  • Pénalité de présence (presence_penalty) : Applique une pénalité unique à tout jeton qui est apparu au moins une fois dans le texte généré, encourageant le modèle à introduire des sujets ou un vocabulaire complètement nouveaux.

  • Pénalité de fréquence (frequency_penalty) : Applique une pénalité proportionnelle au nombre de fois qu'un jeton est apparu, décourageant progressivement l'utilisation excessive de termes spécifiques.

Décourager les boucles et encourager la variété du vocabulaire

PARAMETER repeat_penalty 1.15
PARAMETER presence_penalty 0.05
PARAMETER frequency_penalty 0.05

Arrêter la Génération avec des Séquences d'Arrêt

Parfois, le modèle ne boucle pas en interne, mais il ne réalise pas quand il a terminé son tour, continuant à halluciner des réponses fausses de l'utilisateur. Vous pouvez éviter cela en définissant des séquences d'arrêt explicites (jetons d'arrêt). Lorsque le modèle génère une séquence d'arrêt, le moteur interrompt immédiatement l'inférence et retourne la réponse.

Les jetons d'arrêt courants incluent des marqueurs de chat comme <|im_end|>, des en-têtes de section markdown ou des délimiteurs personnalisés :

# Arrêter de générer lorsque des balises ChatML ou des lignes Utilisateur sont générées
PARAMETER stop "<|im_end|>"
PARAMETER stop "<|im_start|>"
PARAMETER stop "Utilisateur :"

4. Gestion des Fenêtres de Contexte et de la Mémoire

Les ressources matérielles locales — en particulier la mémoire vidéo (VRAM) sur votre GPU — sont très limitées. Comprendre comment dimensionner les structures de mémoire de votre modèle est essentiel pour construire des applications locales robustes.

Longueur de Contexte (num_ctx)

La longueur de contexte (num_ctx) définit la taille de la fenêtre d'attention (en jetons) que le modèle peut traiter à la fois. Cela inclut à la fois le prompt d'entrée (et l'historique système) et les nouveaux jetons de sortie générés.

Par défaut, Ollama initialise de nombreux modèles avec une fenêtre de contexte conservatrice de 2048 ou 4096 jetons pour éviter le débordement de mémoire sur du matériel de bas de gamme. Cependant, des modèles modernes comme Llama 3.1 ou Mistral prennent en charge des fenêtres de contexte natives allant jusqu'à 128 000 jetons. Si vous construisez un système de génération augmentée par récupération (RAG) ou importez de grands fichiers de code, 2048 jetons entraîneront une troncature silencieuse du prompt, entraînant une perte de contexte et des complétions très inexactes.

Vous pouvez explicitement augmenter ce paramètre dans votre Modelfile :

# Étendre la fenêtre de contexte à 16 384 jetons
PARAMETER num_ctx 16384

⚠️ Le calcul d'attention évolue de manière quadratique ($O(N^2)$) avec la longueur de contexte. Doubler votre num_ctx augmentera considérablement la VRAM requise pour stocker l'état actif du modèle pendant la génération. Assurez-vous que votre matériel peut gérer l'augmentation de l'allocation.

Quantification du Cache KV (OLLAMA_KV_CACHE_TYPE)

Pour suivre les relations entre les jetons au cours d'une longue conversation, le modèle stocke un cache clé-valeur (KV) actif dans la VRAM. À de grandes longueurs de contexte (comme 32k ou 128k), la taille du cache KV pourrait dépasser la taille des poids du modèle lui-même, provoquant des plantages par manque de mémoire.

Pour lutter contre cela, Ollama prend en charge la quantification du cache KV. Tout comme les poids du modèle peuvent être compressés de flottants 16 bits à entiers 4 bits, le cache KV peut être quantifié à des précisions inférieures avec une dégradation minimale de la qualité du texte.

Suivez Brief IA

L'actu IA du jour, aussi dans votre fil.

Commentaires