Mon royaume pour 4 Go de VRAM : faire entrer Ollama dans le GPU

Dans un précédent billet, « Mon royaume pour une IA en localhost », je racontais mes premiers pas avec Ollama. L’enjeu était assez simple : si je dois confier des articles, des rapports ou des archives de recherche à une intelligence artificielle, je préfère que tout cela reste dans ma machine. Garder l’IA dans sa boîte, donc, avec l’espoir de conserver un peu de prise sur ce que je lui donne et sur ce qu’elle en fait.

À ce stade, faire répondre un modèle dans un terminal avait quelque chose de presque magique. Mais entre demander un résumé de trois pages et faire analyser un véritable corpus de recherche, il y a un petit gouffre. C’est dans ce gouffre que mon ordinateur et moi sommes tombés.

L’histoire qui suit est donc un retour d’expérience sur la manière dont j’ai essayé de faire travailler Ollama avec une petite carte graphique de portable. Ce n’est pas un tutoriel universel : les réglages dépendent du modèle, du GPU, de sa mémoire et de la taille des textes. C’est plutôt un pense-bête documenté pour éviter de refaire, dans six mois, le même chemin à travers les journaux d’erreurs.

Le contexte : 839 documents et une semaine de patience

Je travaille sur les archives du projet Santé & Territoires au Sénégal. Le corpus rassemble des comptes rendus, présentations, termes de référence, tableaux, documents de travail et rapports produits autour des Living Labs de Mbane et de Keur Momar Sarr, près du lac de Guiers.

L’objectif n’était pas seulement de faire résumer les documents. Je voulais reconstruire une chronologie, retrouver les groupes impliqués, repérer les formes de participation, distinguer ce qui avait été proposé de ce qui avait réellement été fait et suivre la manière dont la perspective « Une seule santé » avait été progressivement prise en compte. Le tout en conservant, pour chaque codage, un extrait et un chemin vers le document source.

Après extraction des textes, agrégation des doublons et exclusion des images, vidéos et fichiers audio, il restait tout de même 839 unités documentaires susceptibles de passer devant le LLM.

J’ai donc lancé mon script R, assez fier de moi, avec plusieurs workers pour les opérations locales et Ollama pour le codage. Quelques heures plus tard, la barre de progression affichait quelque chose comme :

Codage LLM documents   16/839 | écoulé 4h29m | ETA ≈ 231h22m

Le script annonçait ensuite, avec un calme que je trouvais presque provocateur :

Timeout ou échec pour D00010 chunk 4 (4000 caractères) ;
repli en 2 sous-chunk(s) de 2500 caractères au maximum.

Le premier bloc attendait le timeout. Puis le script le découpait en deux et recommençait. Quand plusieurs requêtes partaient en même temps, elles se disputaient la mémoire disponible. À ce rythme, l’analyse ne ressemblait plus vraiment à un gain de temps. Elle ressemblait plutôt à une manière sophistiquée de transformer un ordinateur portable en radiateur et par ces temps de canicules, pas la meilleur idée que j’ai eu!

Pas qu’un problème de modèle

Ma première réaction a été de chercher un modèle plus petit. C’est assez logique : un modèle de 8 milliards de paramètres sera plus lourd qu’un modèle de 3 ou 4 milliards. Mais cela n’expliquait pas complètement pourquoi des passages de quelques milliers de caractères pouvaient immobiliser Ollama pendant plusieurs minutes.

La machine possède deux processeurs graphiques :

Intel Corporation Meteor Lake-P [Intel Arc Graphics]
NVIDIA RTX 500 Ada Generation Laptop GPU

La carte NVIDIA ne dispose que de 4 Go de VRAM. Ce n’est pas énorme, mais un llama3.2:latest quantifié pèse environ 2 Go. Il devait donc être possible d’en faire quelque chose.

La commande suivante confirmait d’ailleurs qu’Ollama voyait bien la carte :

nvidia-smi

Dans la liste des processus, /usr/local/bin/ollama occupait environ 666 Mio de mémoire vidéo. Mais cette information ne disait pas quelle part du modèle était réellement exécutée sur le GPU. Pour cela, il fallait demander directement à Ollama :

ollama run llama3.2:latest "Réponds uniquement par OK"
ollama ps

Et là, surprise :

NAME               SIZE     PROCESSOR          CONTEXT
llama3.2:latest    18 GB    71%/29% CPU/GPU    16384

Le modèle téléchargé faisait environ 2 Go, mais Ollama annonçait une empreinte de 18 Go et ne plaçait que 29 % du calcul sur le GPU. Le même test avec qwen3:4b-instruct donnait encore moins :

qwen3:4b-instruct    18 GB    83%/17% CPU/GPU    16384

Le GPU était donc bien utilisé, mais comme une petite annexe du CPU. La majeure partie de l’inférence se faisait toujours dans la mémoire centrale. Hors, j’ai toujour entendu Théo me parler de GPU dans sa thèse.

Quatre contextes pour une seule petite carte

L’indice principal était la valeur CONTEXT 16384. Ollama avait réservé beaucoup plus de mémoire que nécessaire. Le parallélisme était ici particulièrement coûteux : plusieurs requêtes simultanées signifient plusieurs contextes à conserver en mémoire. Quatre contextes de 4 096 tokens donnent justement 16 384 tokens à allouer.

La documentation d’Ollama précise que la mémoire nécessaire augmente avec le produit :

OLLAMA_NUM_PARALLEL × OLLAMA_CONTEXT_LENGTH

Sur une grosse carte, plusieurs requêtes parallèles peuvent augmenter le débit. Sur 4 Go de VRAM, elles font surtout sortir le modèle du GPU. Le paradoxe est assez joli : j’avais demandé plus de parallélisme pour aller plus vite, et ce parallélisme était précisément ce qui ralentissait le calcul.

Il fallait donc distinguer deux choses dans mon script :

  • les opérations de lecture, d’extraction et de classement des fichiers, qui peuvent utiliser plusieurs cœurs CPU ;
  • les appels au modèle, qui doivent rester séquentiels tant que la mémoire du GPU est aussi contrainte.

Dans R, je pouvais conserver dix travailleurs pour préparer les documents, mais il fallait impérativement revenir à :

--llm-workers 1

Régler Ollama plutôt que brutaliser R

Ollama fonctionne comme un service. Le script R lui envoie des requêtes HTTP, mais c’est Ollama qui décide où charger le modèle, combien de contextes préparer et combien de temps le garder en mémoire. Il n’y avait donc pas besoin d’ajouter du code CUDA dans R. Il fallait régler le serveur.

Sous Linux, cela passe par une surcharge du service systemd :

sudo systemctl edit ollama.service

J’ai commencé avec cette configuration :

[Service]
Environment="OLLAMA_NUM_PARALLEL=1"
Environment="OLLAMA_MAX_LOADED_MODELS=1"
Environment="OLLAMA_CONTEXT_LENGTH=6144"
Environment="OLLAMA_KEEP_ALIVE=30m"

Puis il faut recharger la configuration et redémarrer Ollama :

sudo systemctl daemon-reload
sudo systemctl restart ollama

Les paramètres ont chacun un rôle assez simple :

  • OLLAMA_NUM_PARALLEL=1 interdit à un même modèle de préparer plusieurs requêtes en parallèle ;
  • OLLAMA_MAX_LOADED_MODELS=1 évite que plusieurs modèles se disputent les 4 Go de VRAM ;
  • OLLAMA_CONTEXT_LENGTH fixe la quantité maximale de texte et de réponse que le modèle peut garder dans son contexte ;
  • OLLAMA_KEEP_ALIVE=30m évite de recharger le modèle entre deux documents, sans pour autant l’immobiliser éternellement dans la mémoire.

Avec un contexte de 6 144 tokens, llama3.2:latest tenait entièrement sur le GPU. J’ai ensuite tenté 8 192 tokens, parce que mon prompt contient à la fois un codebook, un schéma JSON, des métadonnées et plusieurs passages du document.

Le résultat restait très honorable :

NAME               SIZE      PROCESSOR         CONTEXT
llama3.2:latest    3.5 GB    9%/91% CPU/GPU    8192

Le modèle était désormais exécuté à 91 % sur le GPU, contre 29 % avant le réglage. On était passé d’une empreinte annoncée de 18 Go à 3,5 Go.

Gratter encore un peu de mémoire

À 8 192 tokens, la carte était juste à la limite. Il restait une possibilité : réduire la mémoire occupée par le cache K/V, c’est-à-dire la mémoire dans laquelle le modèle conserve les éléments du contexte déjà traités.

J’ai donc ajouté :

Environment="OLLAMA_FLASH_ATTENTION=1"
Environment="OLLAMA_KV_CACHE_TYPE=q8_0"

La configuration complète devient :

[Service]
Environment="OLLAMA_NUM_PARALLEL=1"
Environment="OLLAMA_MAX_LOADED_MODELS=1"
Environment="OLLAMA_CONTEXT_LENGTH=8192"
Environment="OLLAMA_KEEP_ALIVE=30m"
Environment="OLLAMA_FLASH_ATTENTION=1"
Environment="OLLAMA_KV_CACHE_TYPE=q8_0"

Flash Attention permet de réduire la consommation de mémoire lorsque le contexte augmente. La quantification q8_0 utilise environ deux fois moins de mémoire que le cache f16 par défaut, avec une perte de précision généralement faible. Il existe également un cache q4_0, encore plus compact, mais la perte devient plus sensible. Pour un travail de codage scientifique, je préfère réduire légèrement le contexte plutôt que comprimer davantage le cache.

Il faut ici éviter une confusion : je n’ai pas fine-tuné le modèle au sens de l’apprentissage automatique. Je n’ai modifié ni ses poids ni son comportement appris. J’ai plutôt ajusté — tuné, si l’on veut — son régime d’inférence : nombre de requêtes, taille du contexte, occupation de la mémoire et répartition entre CPU et GPU.

Faire moins de requêtes reste la meilleure optimisation

Même correctement installé sur le GPU, un LLM n’a aucune raison de lire 839 documents de bout en bout si la majorité n’est pas utile à la question de recherche. Le réglage matériel ne devait donc pas remplacer le travail méthodologique.

J’ai repris le script R pour organiser l’analyse en deux passes.

La première réalise une présélection à rappel élevé. Elle lit le nom, le chemin et quelques passages de chaque document, puis décide s’il peut documenter les Living Labs, la participation des parties prenantes ou la perspective « Une seule santé ». Les décisions sont exportées dans un fichier CSV et peuvent être corrigées manuellement.

Rscript analyse_corpus_llama31_8b.R \
  --input "ST_KB_destination" \
  --output "resultat_corpus_llama31" \
  --model "llama3.2:latest" \
  --triage-model "llama3.2:latest" \
  --mode triage \
  --triage-batch-size 8 \
  --workers 10 \
  --llm-workers 1 \
  --api-timeout 300

Le fichier 00_triage_decisions.csv possède une colonne manual_selected. Je peux y inscrire TRUE pour repêcher un document ou FALSE pour l’écarter avant la seconde passe.

La seconde passe ne lit plus nécessairement toutes les pages. Elle présente au modèle le début, la fin et les passages les plus denses en termes liés au terrain et aux catégories analytiques. Chaque observation doit rester associée à un extrait et au chemin de sa source.

Rscript analyse_corpus_llama31_8b.R \
  --input "ST_KB_destination" \
  --output "resultat_corpus_llama31" \
  --model "llama3.2:latest" \
  --triage-model "llama3.2:latest" \
  --mode full \
  --deep-reading targeted \
  --workers 10 \
  --llm-workers 1 \
  --api-timeout 300

La machine travaille donc mieux, mais elle travaille surtout moins inutilement. C’est probablement l’optimisation la plus importante de toute cette histoire.

Ce que j’en retiens

Faire fonctionner une IA en local ne consiste pas seulement à télécharger un modèle et à lancer une commande. Entre le modèle et la machine s’installe tout un petit monde de paramètres : quantification, contexte, cache, parallélisme, chargement des modèles et partage entre CPU et GPU.

Les valeurs par défaut sont nécessairement génériques. Elles ne savent pas que mon ordinateur possède une RTX 500 Ada de seulement 4 Go, que je préfère une requête fiable à quatre requêtes concurrentes, ni que mon corpus contient des centaines de documents en français avec un schéma de codage assez lourd.

Il faut donc reprendre la main sur l’outil. Pas pour optimiser chaque seconde comme un nouvel ergonome de soi-même, mais pour que la technique reste proportionnée à la machine et à l’usage. Dans mon cas, la frugalité ne consistait pas seulement à choisir un petit modèle. Elle consistait à limiter le parallélisme, choisir la taille de contexte utile, écarter les documents hors sujet et maintenir une possibilité de validation humaine.

Le modèle est moins gros, les requêtes sont moins nombreuses et le GPU est enfin devenu autre chose qu’un petit témoin lumineux dans nvidia-smi. Ce n’est toujours pas le futur. Mais, cette fois, ça ressemble un peu plus à un outil que je peux habiter.

Et de la philo ?

Cette expérience prend alors un autre relief à la lecture de Günther Anders, mon héro. Le « rêve des machines » n’est pas celui de mieux servir les humains, mais celui d’un monde entièrement organisé selon leur propre fonctionnement, dans lequel l’homme finit par devenir un rouage de l’appareil qu’il a construit. Le décalage prométhéen apparaît lorsque notre capacité à produire de tels dispositifs dépasse notre capacité à nous les représenter, à les maîtriser et à décider collectivement de leurs usages.

À une échelle évidemment bien modeste, mon premier réflexe avait précisément consisté à adapter mon travail aux exigences d’Ollama : multiplier les traitements, découper les documents, attendre des centaines d’heures et laisser la machine imposer son rythme à l’enquête.

Paramétrer le modèle, limiter les requêtes et sélectionner les textes pertinents pourrait peut être revenir à inverser cette relation : faire entrer la machine dans les contraintes de la recherche, plutôt que transformer le chercheur — et son corpus — en simples rouages de la machine.

Quelques commandes à garder sous le coude

Identifier les cartes graphiques :

lspci | grep -Ei "VGA|3D|Display"

Surveiller la carte NVIDIA :

watch -n 1 nvidia-smi

Vérifier où Ollama a chargé le modèle :

ollama ps

Afficher la configuration transmise au service :

systemctl show ollama --property=Environment

Arrêter un modèle et libérer sa mémoire :

ollama stop llama3.2:latest

Quelques références

Convivialité et logiciel libre deux ingrédients pour échapper aux enfers

En 2013, c’est Damien Chapoulart qui m’avait glissé le petit livre d’Ivan Illich dans le sac. On était dans le garage transformé en bureau du GDA Cru Banyuls, tous les deux accompagnés dans la découverte de la viticulture du cru par Eric Noémie. Damien m’avait dit « ça te parlera », avec un regard entendu.

Il avait tellement raison ! À l’époque on travaillait sur des questions de température et d’ensoleillement des zones viticoles sur GRASS-GIS. GRASS-GIS est un logiciel de traitement de données spatiales extrêmement puissant, mais connu pour la rugosité de l’interface.

La convivialité comme fermant du pharmakon

À la lecture de « La convivialité » (1973), j’avais été frappé par l’actualité de la pensée d’Illich. Il s’y oppose à la domination des institutions et des technologies sur la vie humaine et plaide pour des outils et des pratiques qui favorisent l’autonomie et les relations interpersonnelles. Un outil convivial est celui qui permet à l’utilisateur de réaliser ses intentions sans dépendre d’experts ou de structures hiérarchiques. Pour lui, la technologie doit donc rester au service des hommes, où les utilisateurs ont le contrôle et peuvent participer activement à la production et à l’entretien des outils. Il y décrit, le travailleur dans son atelier qui organise son espace en fonction de son vécu, et la dépossession de son lieu de travail quand l’ergonome impose une place aux outils pour lui faire gagner du temps.

Le lien avec le logiciel libre m’avait sauté aux yeux. Un code source ouvert, qui permet aux utilisateurs de pouvoir se saisir de l’outil ! Je l’avais proposé en ouverture du FOSS4G-fr en 2016, puis dans la préface de « Introduction à la géomatique » de Nicolas Roeland en 2019, commise avec mes complices Simon Georget et Didier Richard.

Malgré son image de logiciel jamais vraiment fini, réaliser par des hobistes, les logiciels libres ont, petit à petit, réussi a estompé cette image à l’exemple de GIS (une pensée émue pour GRASS et Qgis en 2010). Pourtant, cette austérité, nous dit Ivan Illich (1973) « n’a pas vertu d’isolation ou de clôture sur soi. Pour Aristote comme pour Thomas d’Aquin, elle est ce qui fonde l’amitié. […] Thomas d’Aquin définit l’austérité comme une vertu qui n’exclut pas tous les plaisirs, mais seulement ceux qui dégradent la relation personnelle ». L’austérité devient le moteur de la « société conviviale […] où l’outil moderne est au service de la personne intégrée à la collectivité, et non au service d’un corps de spécialistes. Conviviale est la société où l’homme contrôle l’outil. »

Survivre dans un monde dominé par Windows

En passant à Linux il y a plus de 10 ans pour des raisons politiques auxquelles Illich n’était pas étranger, j’avais expérimenté la difficulté d’exister dans un monde qui s’échange des fichiers de MSOffice.

On ne compte plus le nombre de situations embarrassantes dans lesquelles on se trouve quand on doit travailler sur un doc commun et que je fais sauter la mise en page parce que je l’ai ouvert avec OpenOffice ou libre Office.

Vous me direz c’est le temps que stabiliser un réseau de pratiques. Par exemple, quelle fluidité de travailler avec la Team OpenMole (ou le libre n’est pas une option). Pour les autres, on trouvait des astuces. Pour remplir les ordres de mission par exemple, j’avais monté une VM pour mon unité de recherche avec Windows installé dessus, pour permettre au non Windows de remplir ces tâches administratives.

La circulation se faisait, on bricolait des ponts. Comme tout bricolage, ça nécessite de monter en compétences techniques, ce qui peu à peu initie une forme d’hybridation. Une manière « d’être au monde » et de faire un monde qui n’est pas enfermé par la technique.

Et sont arrivés les LLM (Large Langage Model) et GPT (Generative Pre-trained Transformer). Là, toutes les frontières ont sauté aussi bien hardware que software ! Logitec a intégré des boutons sur ses claviers pour raccourcir l’accès à ChatGPT, des raccourcis sont aussi disponibles dans les extensions de Thunderbird … et Microsoft propose d’introduire l’IA dans sa prochaine mouture de Windows. Il y a un incontestable effet « wouahou » qui s’empare de tout le monde. Et des effets de bord (pour le moment) dont on identifie pour le moment mal les retombés.

IA Générative et environnement de travail

Sans le dire, sans en discuter collectivement, l’IA chamboule donc beaucoup de pratiques issues d’une co-évolution plutôt « longue » à l’échelle du numérique. On arrive à un point où il me semble que l’intégration de l’IA repose complètement des question de maitrise de nos environnements de travail et de nos vies.

C’est là que Günther Anders entre dans la danse. Dans « L’Obsolescence de l’homme », il utilise le concept de friction pour décrire la résistance qui empêche l’intégration parfaite des humains dans le monde technologique. En abordant la friction dans ce contexte, Günther Anders ne pointe pas simplement un problème technique, mais met en lumière une question philosophique et éthique profonde. Il avertit que sans aborder cette friction, l’humanité risque de devenir obsolète, incapable de maintenir le contrôle sur les technologies qu’elle a créées.

Un thème qu’on retrouvera dans « Rêve des machines » (trad. 2022 ed. Allia), il annonce p. 71 « il est maintenant bien clair,[…] que le principe dont je parle, à savoir la tendance à un expansionnisme sans limite et à un intégrationnisme total, est inhérent à la technique en tant que telle ; que ce principe ne gouverne pas uniquement les pays généralement regroupé tant bien que mal sous la dénomination d’État totalitaire. » La technique de par son expansion s’étend sans distinction politique. Et la vitesse de son extension joue aussi un rôle dans la friction et obsolescence. Alors que le monde s’accélère, l’Homme n’as pas le temps de s’hybrider.

Or c’est bien le propos d’Yvan Illich dans « la convivialité » tout l’enjeu est dans le choix, et la possibilité de conserver ce choix dans le temps. Un choix individuel, qui repose sur son propre consentement à l’hybridation avec l’IA, et un choix collectif, qui lui repose sur l’acceptation ou non de permettre un post-traitement des photos, des enregistrements audio, etc… parfois sans véritablement s’en rendre compte. Ce questionnement devient encore plus prégnant quand on considère l’éco-système privé et privateur de liberté qui est en train de se construire. Il y a donc comme avec le logiciel libre un enjeu à soutenir et accompagner le développement d’IA libre et suffisamment frugale pour tourner sur des machines personnelles.

Mon royaume pour une IA en localhost

Depuis la sortie en 2022 de chatGPT, les solutions basées sur des IA sont partout. La question n’est plus, il me semble : « comment vivre sans ? », ou encore « est-ce qu’il est souhaitable de mettre de l’IA partout ?  » une question qui ne nous a jamais été posée collectivement.

Xavier De La Porte résume très bien mon état d’esprit dans l’intro de son podcast (le code a changer : Série « Humains-machines : nos langues entremêlées » Épisode 1/2 : Une histoire d’interruption ) : « je crois que je n’en peux déjà plus des discussions autour de ce que nous racontent les IA. Je n’en peux déjà plus d’entendre des gens s’extasier de tout ce que savent les IA, ou, a contrario, se plaindre de leurs hallucinations. Je n’en peux plus des gens qui me détaillent ce qu’ils font avec GPT, Claude, Perplexity ou Le Chat. »

L’IA est là, elle étend son emprise, est-ce que je peux limiter ma zone de contact en gardant le « contrôle » sur ce que je donne à la machine ? Parce que la tentation est de plus en plus forte de donner aux promptes des papiers scientifiques, des rapports, etc. pour lui demander des résumés… Bien sûr qu’il faut les avoir lus pour espérer échapper aux hallucinations, mais le temps que je pourrais gagner à lui faire faire cet élagage est sans commune mesure. Ce qui me pose évidemment la question de gagner du temps pour faire quoi ? Et bien, pour le moment c’est la théorie de la reine rouge. Comme tout le monde utilise chatGPT, pour aller plus vite, je suis toujours à la traine.

Bien sûr, céder à ce chantage, c’est faire un pas de plus dans le rêve des machines de Günther Anders ! Nous devenons toujours plus consommateurs :

« si nous sommes considérés comme de meilleurs travailleurs, notre consommation sera d’autant plus satisfaisante et nous pourrons accomplir plus rapidement le devoir qui nous incombe d’œuvrer comme liquidateur ; les produits apparaissent d’autant plus réussis qu’ils sont capables de se laisser rapidement user par nous. » (G. Anders, 2022, p.85)

Couverture du livre de Günther Anders "Le Rêve des machines" aux éditions allia

Donc comment garder le contrôle ? En gardant l’IA dans sa boite — c’est à dire dans ma machine. Rien ne fuite car tout reste là en local sur mon ordinateur.

Techniquement comment j’ai fait ?

Installer Ollama c’est facile

Ollama c’est facile a installer sur Linux :

curl -fsSL https://ollama.com/install.sh | sh

Cet utilitaire fonctionne un peu comme docker. On fournit un nom de modèle et il se charge de le télécharger et de le faire fonctionner. Une fois l’utilitaire installé, il faudra donc télécharger des LLM. Il y en a une flopé disponible sur le site. À titre d’exemple, voilà celui que j’essaie en ce moment.

ollama run gpt-oss

Normalement en sortie de commande (après le téléchargement de plusieurs Go de modèle), vous tomberez dans un prompt dans le terminal. Pour en sortir ctrl + d.

Installer open-WebUI c’est moins évident

Avant tout, j’ai perdu pas mal de temps à essayer de comprendre pourquoi les modèles que j’avais téléchargés avec Ollama n’étaient pas visibles dans l’interface de open-WebUI. Il se trouve qu’il y a encore des incompatibilités entre open-WebUI et Firefox. J’ai fini par trouver les infos !

Donc, pour installer le service web, la solution proposée est basée sur docker. Chez moi, c’est passé avec cette commande :

sudo docker run -d --network=host -v open-webui:/app/openWebUI -e OLLAMA_BASE_URL=http://127.0.0.1:11434 --name open-webui --restart always ghcr.io/open-webui/open-webui:main

Une fois que le docker est lancé, il met quelques minutes à s’instancier correctement. On peut accéder au service en local : http://localhost:8080/

RetEx à chaud 🪖

Après quelques essais, c’est chouette, mais ce n’est pas encore le futur! Déjà ça va pousser les « vieilles » machines dans la tombe et accentuer la fracture numérique. Ici une requête sur le modèle GPT-OSS occupe pas mal ma machine.

Je cherchais quelque chose qui me permette de faire de la synthèse de fichier. Le point positif c’est que c’est possible d’envoyer des fichiers au LLM dans l’interface d’open WebIU (qui intègre RAF), mais les formats ne sont pas tous supportés (PDF, odt, et autre format libre oui), mais les formats propriétaire comme docx semblent non pris en charge… Ensuite le niveau de réponse n’est pas foufou, et très dépendant du modèle qu’on charge. D’un point de vue contextuel, peut être que cela dépend des réglages de l’interface, mais la priorité n’est pas donnée au fichier que vous fournissez. Il arrive que se glissent des informations de fichier analysé précédemment.

Quelques références :

Institutional Gramar – un outils pour penser la gestions des ressources

Du 19 au 24 juin 2023, j’ai pu participer au congrès de l’IASC (International Association for the Study of the Commons) qui s’est déroulé à Nairobi. La thématique de la conférence était « the commons we want« , a donné lieu à une très grande diversité de panels en parallèle et donc a un programme riche et varié.

J’ai eu la chance, presque un peu par hasard, de participer au workshop, puis au panel sur l’Institutional Gramar (IG) proposé par Saba Siddiki, Christopher Frantz, et Ute Brady. Ce qui m’a permis une introduction rapide aux potentialités de la formalisation proposée.

Une synthèse de l’institutional Grammar

L’approche de la Grammaire institutionnelle (Institutional Grammar ou IG en anglais) est une approche définie conceptuellement par Crawford et Ostrom en 1995. Au fil des 25 dernières années, cette approche a été largement utilisée dans l’analyse des politiques, la modélisation informatique, etc.

l’IG appelée « Institutional Grammar 2.0 », actualise l’approche pour de nouvelles applications dans divers domaines de recherche. Cette version 2.0 offre une représentation plus précise et complète des informations institutionnelles, en mettant l’accent sur le sens, les fonctions et les effets des déclarations institutionnelles.

La formalisation des informations en passant par un encodage particulier et non ambigu (ou en tout cas moins ambigu que le langage naturel), indépendamment du domaine d’application et de la méthode analytique utilisée, ouvre des perspectives extrêmement intéressantes et déjà largement utilisées en termes d’analyse comparée et d’évolution temporelle des organisations. En soulignant l’importance de l’analyse institutionnelle, il me semble que l’IG est adaptable à diverses situations d’actions.

La formalisation proposée par l’IG 2.0 repose sur une grammaire générative décrite dans la table ci dessous par Watkins et Westphal (2016).

Tableau reprenant les composants de l’IG dans le papier de Watkins et Westphal (2016)

L’intérêt de l’Institutional Grammar réside pour moi dans le cadre d’analyse rigoureux qu’elle offre et qui donne des outils holistiques pour étudier le fonctionnement des institutions et des organisations. En utilisant cette approche, les chercheurs peuvent mieux comprendre comment les règles, les normes et les valeurs institutionnelles influencent les comportements et les décisions des acteurs impliqués.

Cette compréhension approfondie des structures institutionnelles et de leurs effets permet de proposer des solutions plus adaptées pour résoudre les problèmes et les défis auxquels sont confrontées les organisations. L’Institutional Grammar peut également aider à identifier les facteurs qui favorisent ou entravent l’efficacité des institutions, ce qui peut avoir des implications importantes pour l’amélioration des politiques publiques et des pratiques organisationnelles.

De retour dans la vraie vie, j’ai essayé de comprendre plus finement la méthodologie et les usages que je pouvais en faire. J’ai identifier deux cas d’usage au Sénégal : autour du lac de Guiers dans le cadre du projet Santés & Territoires, et dans la zone pastorale dans le cadre du projet Dundi Ferlo, et dans le cadre de la convention de programme sur les Communs.

Santés & Territoires : une approche co-construite de one Health

Le projet s’appuie sur une approche participative, impliquant les acteurs du système autour de la transition agro-écologique comme levier d’amélioration des santés (approche one Health). Des chercheurs et des acteurs locaux sont donc impliqués dans 4 pays : au Sénégal, au Bénin, au Laos et au Cambodge, au travers de dispositifs de recherche-action que peuvent être les livings lab. Au Sénégal, les livings-lab se positionnent autour du lac de Guiers (à Mbane, et Keur Momar Sarr).

Entre février et septembre 2023, Amandine Adamczewski-Hertzog et moi avons encadré Mathilde Hibon dans le cadre de son stage de fin d’études pour un double diplôme entre l’école d’agronomie de Purpan et l’ISARA (Norwegian University of Life Sciences, vous pouvez retrouver son rapport ici).

Mathilde put encoder tous ses entretiens avec l’IG. Cela lui a donné 150 entrées dans sa base. À partir de là, on a exploré ces entrées avec des outils de l’analyse de réseau (R, et gephi). En les exprimant par point de vue. C’est à dire, envisager la manière dont chacun considère les relations d’interaction (au travers de règles ou de stratégies). Voilà le résultat de l’une de ces analyses du point de vue des populations locales.

En regardant les relations qui sont identifiées à partir des entretiens mener auprès des institutions, on constate que la centralité des acteurs n’est pas du tout la même, ce qui permet entre autres choses de visualiser facilement les différences de points de vue.

La CP Commun

Dans le cadre de la CP Commun, l’équipe GIREL du GRET Sénégal a séléctionné deux terrain : Mont-Rolland et Diender pour y déployer le jeu f’eau diem. Le jeu f’eau diem étant utilisé comme une arène qui permet de virtualiser les problèmes auxquels les participants font face. On réutilise à notre compte le concept de Johan Huizinga (1949) : “The Magic Circle”. Cela renvoie à l’espace conceptuel (mental) et physique (le lieu) dans lequel les règles du jeu prennent le dessus sur celles de la réalité quotidienne. L’identification de cet espace permet aux observateurs de la session de jeu de mieux comprendre les relations que les joueurs tissent localement avec la réalité. Comment ceux-ci adoptent des rôles ou des comportements qu’ils n’auraient pas dans leur vie quotidienne.

Les participants a la session de jeu f’eau diem de Diender en mai 2024

De cette manière nous nous attendons à ce que les joueurs ne nous parlent pas directement de leurs problèmes et de solutions de gestion mais de ceux identifiés dans le jeu, qui pour autant ont des équivalences dans la réalité.

A partir des observations des sessions de jeux, l’objectif est de remplir la matrice des formalisations des règles largement inspirées de l’Institutional gramar. Ce formalisme nous semblait être en mesure de capturer les éléments de réglementation formelle ou informelle que les participants allaient évoquer dans le cercle magique (c.f. fig I).

Figure issue du papier de Schlüter, A., & Theesfeld, I. (2010). The grammar of institutions: The challenge of distinguishing between strategies, norms, and rules. Rationality and Society p. 457

Les institutions (action d’instituer en économie) sont composées d’un ensemble de stratégies, normes et règles qui sont mises en place par un groupe d’agents. Pour un agent, une institution peut-être consciente et inconsciente. La Stratégie décrit le comportement d’un joueur dans un jeu. Elle peut être individuelle si on ne sait pas qui d’autre la mobilise. Collective, dans ce cas là, on assiste à l’apparition d’une institution. Les normes peuvent être internalisées, c’est-à-dire incorporées à l’intérieur de l’individu de manière à ce qu’il s’y conforme sans récompense ou punition externe, ou elles peuvent être imposées par des sanctions positives ou négatives venant de l’extérieur.

Les règles identifiées par les observateurs devaient être mises en discussion puis testées dans des sessions de jeux. S’il y a eu des adaptations locales, on peut globalement dire que le plan ne s’est pas passé comme prévu. Philippe Karpe (Cirad – UMR SENS) nous avait un peu mis en garde vis-a-vis de la grille. Elle était très compatible avec le droit positif, mais assez peu opérante pour faire face aux systèmes de régulation endogène mis en place par les participants. On a donc encore du travail 🙂

Dundi Ferlo : travailler avec les populations locales au projet de Grande Muraille Verte

Penda Diop Diallo, a emmené le CNRF (Centre National de Recherche Forestière Sénégalais) dans les approches de modélisation d’accompagnement (ComMod). Dans ce projet il s’agira de s’inscrire dans le projet panafricain de la grande muraille verte, en prenant en accompagnant les acteurs dans le processus. Dans les faits, cela veut dire accompagner la mise en place de parcelles de reboisement gérer collectivement par les populations locales aussi bien du point de vue du fourrage herbacé, que du potentiel fourrage aérien, et un jour des productions forestières non ligneuses.

Dans le cadre de ce travail, Penda accompagnée d’Anna Ndiaye ont réutilisé et adapté un jeu sérieux dans la plus pure approche ComMod. Il s’agissait de se servir de cet outil comme d’un simulateur social qui permettent aux acteurs de se projeter dans des mesures de gestion, d’en évaluer ainsi la faisabilité et les implications sur l’usage de la ressource.

Ces activités, réalisées à Vélingara Ferlo et Younofere, ont amené les acteurs à exprimer des ensembles de règles de gestion qui ont été implémentés la même année dans les parcelles. Penda a travaillé à la formalisation de ces règles dans l’Institutional Grammar pour pouvoir identifier les trajectoires institutionnelles que chacune des zones a décidé de prendre. Cela permettra de comparer facilement les directions que vont prendre les deux terrains d’étude.

Les perspectives

Si ça vous intéresse je vous encourage à aller voir le site de l’institutional Grammar initiative. En terme de perspective, il me semble que ce cadre est extrêmement stimulant, malgré les limites identifié précédemment, pour modéliser et donc simplifier les types de relation liés aux règles formelles et informelles dans la zone.

Cormas dans container OpenMole

Je parlais l’autre jour de l’utilisation de Cormas dans Docker et j’avais évoqué la possibilité d’utiliser cette plateforme multi-agent à l’intérieur d’openMole pour pouvoir bénéficier des possibilités de la taupe pour paralléliser le calcul et explorer des modèles.

J’avais profité de Romain pendant le coding-camp 2018 pour qu’on propose une première version de plug-in cormas pour openMole. En plus d’ouvrir des portent au calcul pour Cormas, l’idée était de permettre à l’équipe de développer de se concentrer sur le développement de la plateforme plutôt que sur le redéveloppement des méthodes de calcules.

Etape 1 : un container OpenMole

Pour tester Cormas dans openMole le plus simple est d’utiliser docker. En effet l’équipe openMole propose un joli petit container qui rox les poneys ! Vous pouvez le lancer comme ça :

## telecharger la derniere image
docker pull openmole/openmole:8.0-SNAPSHOT
## cree un conteneur avec les droit décriture sur le dossier monte
docker run -u root  -v /root/openMole_workSpace:/var/openmole openmole/openmole:8.0-SNAPSHOT chown -R openmole:openmole /var/openmole/
## lancer le contener en mode detache
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -p 8080:8443 -v /root/openMole_workSpace:/var/openmole/ openmole/openmole:8.0-SNAPSHOT

Etape 2 : le plug-in cormas pour OpenMole

Voilà la primitive cormas n’est pas directement intégrée à OpenMole, il faudra donc télécharger le plug-in, et l’importer en utilisant le bouton idoine (la prise électrique) dans la barre d’outils en haut.

Etape 3 : Le script OpenMole

Une fois que le plug-in est installé, il ne reste plus qu’à exécuter un script. Pour se simplifier la vie, on utilisera pour l’exemple un modèle chargé par défaut dans cormas : le modèle des pompiers. Pour ceux qui n’ont pas une petite idée ce que c’est, on a un automate cellulaire dont les cellules passe de arbre à brulé et des agents pompier qui vont essayer d’éteindre l’incendie.

Vous pouvez maintenant crée un script.oms qui sera executable par OpenMole.

// OpenMole Variable definition.
// Those variables will be populated in openMole
// and send in JSON to Pharo/Cormas

val seed = Val[Int]

val numberOfFires = Val[Int]
val numberOfFiremen = Val[Int]
val percentageOfTrees = Val[Double]
val dimensionMin = Val[Int]
val dimensionMax = Val[Int]
val nbTrees = Val[Int]

// The CORMASTask take in parameters the class and method able to
// launch our simulation. In OUr case using the Cormas-Model-FireAutomata
// we run a methods build for OpenMole. You can take a look.
// set() allow you to pass some other thing to your task. You can pass :
// * your model as a file.st
// * inputs from OpenMole Variable
// * outputs as an array
// * defined parameters how doesn't change between simulation.

val model = CORMASTask("CMFireAutomataModel simuOpenMole") set (
//resources += workDirectory / "Cormas-Model-FireAutomata.st",
inputs += seed,
cormasInputs += numberOfFires,
cormasInputs += numberOfFiremen,
cormasInputs += percentageOfTrees,
cormasInputs += dimensionMin,
cormasInputs += dimensionMax,
cormasOutputs += nbTrees,

outputs += (seed, numberOfFires, numberOfFiremen, percentageOfTrees, dimensionMin, dimensionMax),

numberOfFires := 3,
numberOfFiremen := 10,
percentageOfTrees := 0.65,
dimensionMin := 60,
dimensionMax := 80
)

// With the DirectSampling() method you define an easy wait to generate
// a sampling for numberOfFires between 1 to 10.
DirectSampling(
evaluation = model hook CSVHook(workDirectory / "results.csv"),
DirectSampling(
  evaluation = model hook CSVHook(workDirectory / "results.csv"),
  sampling = (numberOfFires in (1 to 10)) x
             (seed in (UniformDistribution[Int]() take 10))
)

Dans ce script la partie propre à Cormas est bien sûr la CORMASTask(). Elle devra contenir l’ensemble des instructions qui seront passées au docker de cormas. Dans l’exemple ici, nous fixons tous les paramètres par défaut. C’est dans la méthode DirectSampling() que l’on va faire varier le nombre de feux a l’initialisation et qu’on définira le nombre de réplications du modèle.

Etape 4 : passer à l’échelle

À l’étape précédente, on utilise un seul thread de l’ordinateur. Pour passer à l’échelle rien de plus simple, il faut simplement modifier la fin du script :

val env = LocalEnvironment(2)

// With the DirectSampling() method you define an easy wait to generate
// a sampling for numberOfFires between 1 to 10.
DirectSampling(
evaluation = model on env hook CSVHook(workDirectory / "results.csv"),
sampling = (numberOfFires in (1 to 10)) x
(seed in (UniformDistribution[Int]() take 10))
)

On définit une variable env qu’on va ensuite appelée dans évaluation. Notre variable env fera alors tourner les modèles en parallèle sur … 2 thread. Si vous avez accès à plus en local, n’hésitez pas à pousser. Enfin si vous avez la chance d’avoir accès à un cluster il ne vous reste plus qu’a explorer les différents environnements pris en charge par OpenMole.

Voilà par exemple sur un cluster SGE, 100 jobs lancés que l’on peut monitor dans l’interface openMole

et que l’on peut voir sur le cluster avec qstat

Références :

Peaufiner XFCE

Vous savez comme va la vie, on à parfois besoin de changer le papier peint ! Depuis quelques mois, mon Linux tombait en petites pièces. De petits dysfonctionnements … qui ne sont pas gênants. Et puis un jour de grisaille, on se dit que ça suffit ! Je suis reparti sur une install de manjaro (ce dériver d’Archlinux) avec XFCE.

Ça fonctionne bien, mais je cherchais quelque chose d’un peut plus eye candy... Et bien XCFE est super paramétrable ! Ici quelques idées de choses à installer pour s’éloigner de l’austérité 🙂

Plank un dock léger et minimal

Installer plank, ce chouette dock qui est disponible dans les dépôts officiels

sudo pacman -S plank

N’oubliez pas de l’ajouter dans les applications au démarrage

Il est possible qu’une ligne grise vienne faire comme un reflet à quelques centimètres au déçu du dock. C’est l’ombre … qu’il faudra désactiver dans les paramètres de fenêtres: Paramètres -> Peaufinage des fenêtres -> Compositeur.

Un thème pour changer de look

Il n’y a pas mal de thèmes et icônes disponible sur https://www.xfce-look.org/

Une petite note sur Zettlr

Depuis 2018, j’ai pris l’habitude de prendre des notes en markdown des réunions, ou des pensées qui arrivait au fils de l’eau. Markdown parce que j’aime ce format, parce qu’il reste lisible même sans logiciel dédié, parce que c’est devenu un standard sur les différents dépôts git, et parce que j’aime les environnements de travail minimalistes, ça m’aide à rester concentré.

J’utilise depuis maintenant 1 an Zettlr après avoir passé pas mal de temps sur atom. Et j’en suis très satisfait ! Il permet l’export en docx, odt, etc. quand je dois travailler avec des collègues. Il supporte bien les entêtes yaml.

Ce matin je voulais changer la police de l’éditeur. Je suis un grand fan de la police utiliser par les blogs du monde diplo : WalbaumGrotesk. Je me suis dit que ce serait chouette de l’avoir pour écrire. J’ai un peut tâtonner, mais voilà, il faut aller dans Fichier → CSS personnalisé et ça permet pas mal de choses.

Pour mois ça donne ça pour utilisé cette chouette font!

body #editor {
font-family: 'WalbaumGrotesk Text', monospace;
}

Construire un container pour Cormas

Cormas est une plateforme de modélisation multi-agents développée en SmallTalk. Historiquement le choix de développement s’était porté sur VisualWork mais depuis quelque temps l’équipe regardait en direction de Pharo.

Cormas sous pharo

Le portage se fait petit à petit, et la feuille de route avance assez rapidement. Si le sujet vous intéresse, nous sommes en train de rédiger un manuel d’utilisation de cette nouvelle version de Cormas sous pharo.

Comme c’est le moment des grandes décisions on s’interroge sur les passerelles avec d’autres outils régulièrement utilisés par les communautés de chercheurs utilisant les SMA et plus largement la simulation. Pour le moment l’attention est portée sur les connexions entre cette nouvelle version de cormas et R et cormas/openMole.

Pour cette dernière, openMole intègre un système de conteneur basé sur udocker. Je suis donc en train de fouiller les possibilités de dockerisé cormas/pharo pour dans un futur que j’espère assez proche nous puissions faire l’ensemble de nos explorations en utilisant openMole.

Ecrire un dockerfile

# Set the base image
FROM ubuntu
# Dockerfile author / maintainer
MAINTAINER Etienne  <moi@truc.fr>

# Update software repository
# and install dependencies
run dpkg --add-architecture i386
run apt-get update && apt-get install -y curl unzip libx11-6:i386 libgl1-mesa-glx:i386 libfontconfig1:i386 libssl1.0.0:i386 libcairo2:i386

RUN mkdir cormas && cd cormas
RUN curl https://get.pharo.org | bash
RUN ./pharo Pharo.image config http://ss3.gemstone.com/ss/Cormas --install=development

Construire un conteneur à partir du dockerfile

sudo docker build -t cormas

Lancer un conteneur à partir du build

docker run --name cormas_instance -t cormas

Tester le fonctionnement

Votre conteneur doit être en train de fonctionner. Pour le vérifier, vous pouvez lancer les commandes suivantes.

docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
914f52adbd98 cormas "/bin/bash" About a minute ago Up About a minute cormas_instance
eeba02bea345 mdillon/postgis "docker-entrypoint.s…" 2 weeks ago Exited (0) 2 weeks ago psql-futurSahel

Vous voyez que j’ai deux conteneurs (psql-futurSahel et cormas_instance) et que le conteneur cormas_instance est en cour de fonctionnement.

On peut maintenant essayer d’interagir avec pharo à l’intérieur du conteneur

sudo docker exec -it 914f52adbd98 /pharo Pharo.image eval '1 + 20'

Si tout s’est bien passé, vous constaterez que pharo vous répond de manière aimable 21 !

Note :

Pour pousser un nouveau conteneur

sudo docker tag cormas elcep/cormas
sudo docker push elcep/cormas

 

Références :