Jérémy Berry

Reconnais l'occasion favorable

Installer un LLM sur son ordinateur sous Linux

tl;dr

Il y a encore un an et demi, c'était assez laborieux d'installer un LLM sur son ordinateur, mais aujourd'hui des outils libres et pratiques ont été développés par une communauté grande et enthousiaste. Dans ce tutoriel, nous allons utiliser Ollama.

Mots-clés :

  • Ollama
  • Llama 3
  • Open WebUI
  • LLM
  • Ubuntu

Dédicace au bon Denis.

Je pars du principe cher lecteur que tu es un utilisateur novice de Linux et que tu sais, au moins vaguement, ce qu'est une IA et un LLM. Sinon, tu peux regarder l'excellente série de vidéos de 3Blue1Brown sur l'apprentissage profond[^1], ou celles de ScienceEtonnante 😉.

Moi-même je ne le sais que vaguement.

Alors comme ça on ne veut pas payer un abonnement chez OpenAI ?

Même si ce n'est pas forcément cher, tu as peut-être envie que tes requêtes sur le sens de la vie ou que tes requêtes de girlfriend AI restent sur ton ordinateur. Eh bien je te comprends !

Blague à part, un LLM en local pour t'aider à programmer sur un projet Web ou pour t'assister dans un travail créatif est parfois d'une aide précieuse.

Il y a encore un an et demi, c'était assez laborieux d'installer un LLM sur son ordinateur, mais aujourd'hui des outils libres et pratiques ont été développés par une communauté grande et enthousiaste. Dans ce tutoriel, nous allons utiliser Ollama.

Nous allons donc voir :

  • Comment installer un LLM en local ;
  • Comment installer une interface Web de discussion avec tes LLM ;
  • Comment personnaliser tes modèles pour qu'ils jouent un rôle ;
  • Une petite "astuce" si tu as un faible espace disque.

Comment installer un LLM en local ?

Quelle configuration au minimum pour un LLM ?

Tout dépend de la taille du LLM que tu veux faire tourner sur ton ordinateur. Pour les modèles habituels autour de sept milliards de paramètres, avoir autour 6 Go de mémoire vive sur ta carte graphique dédiée (GPU avec 6 Go de VRAM) est bien. Pour les ordinateurs portable (hors Apple), une carte Nvidia RTX 3060 est une carte milieu de gamme tout à fait adaptée.

Dans ce tutoriel, on va installer Llama 3 8B, sorti il y a moins de deux semaines, le 18 avril 2024, et le faire tourner sur GPU en local !

À savoir :

  • Si tu n'as pas de carte graphique dédiée, le LLM peut tourner sur le processeur (CPU), mais la vitesse de réponse sera plus faible.
  • Si tu veux faire tourner un modèle qui est trop gros pour ton GPU, mais que tu as assez de RAM, il pourra être chargé en RAM et être utilisé sur le CPU, mais plus le modèle est gros et plus la vitesse de réponse sera faible. Maintenant, il y a même des optimisations pour faire tourner une partie d'un gros LLM dans ton GPU et le reste sur le CPU avec la RAM.
  • Si tu as moins de 6 Go de VRAM, il y a de plus petits modèles qui pourront tourner sur un GPU modeste. Par exemple, TinyLlama a eu besoin d'1,2 Go de VRAM sur mon GPU quand je l'ai essayé, et c'était pour une qualité de discussion déjà bonne. Et plus un modèle est petit, plus il tournera vite, que ce soit sur le GPU (où il sera chargé dans la VRAM) ou sur le CPU (où il sera chargé dans la RAM) : TinyLlama me répond aussi vite sur mon CPU que Llama 3 8B sur mon GPU.
  • Enfin, si tu as besoin de vitesse et de beaucoup de mémoire sur GPU (genre 80 Go de VRAM), tu peux toujours louer une machine avec une carte très très haut de gamme chez OVH ou Paperspace. Il y a d'autres services de locations de GPU, mais je ne connais que ceux de chez OVH et Paperspace, qui sont plutôt biens.

Ce tutoriel va se concentrer sur la distribution Ubuntu LTS 22.04.1 (un système Linux accessible pour le grand public, on laisse Gentoo aux barbus et au bon Denis). La procédure peut varier d'une distribution à l'autre.

Je pars du principe que tu as une carte Nvidia et que les pilotes sont déjà installés.

Aller, on entre dans le vif du sujet !

Ollama, ou le LLM en local pour tou(te)s

Ollama est un de ces outils qui a émergé de la communauté, il permet d'installer très simplement un LLM sur ton ordinateur.

L'installation

On va l'installer, comment ? En lisant la doc, qui nous dit qu'il faut taper dans le terminal :

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

Une remarque générale si tu as une erreur :

  • Ce petit film te montre ce que tu peux voir en exécutant les commandes. Tu verras que parfois, en suivant la documentation tu arrives à un résultat différent, à des erreurs. Je te montrerai donc aussi les fails dans mon terminal, si tu as une erreur similaire à ce qu'il y a dans les petits films, tu pourras essayer de reproduire ce que j'ai fait pour peut-être débloquer ton installation d'un LLM sur ton ordinateur. Comme ce petit film est un enregistrement textuel du terminal, tu pourras copier/coller mes commandes si besoin.
    • C'est important de comprendre que si tu n'arrives pas à reproduire complètement une procédure (installation, résultats, ...), il peut y avoir plusieurs raisons pour l'expliquer. C'est pourquoi il ne faut pas se décourager. Même les scientifiques et les programmeurs n'arrivent parfois pas à reproduire les résultats des autres, c'est ce qu'on appelle le problème de la reproductibilité. Des outils comme Docker (que l'on utilisera plus bas) ou Guix sont utilisés entre autres pour pallier certains problèmes de reproductibilité.
    • Bref je le répète car c'est important : il ne faut pas se décourager. Vois plutôt le processus de reproduction d'un programme ou d'une installation comme une enquête à résoudre, ça pourrait devenir de plus en plus fun au fur et à mesure de tes progrès et de tes succès 😉.
    • Une erreur ne veut pas dire qu'on est nul, juste qu'il faut continuer de try hard.

"Keep trying hard en cas d'erreur"

Lancer un modèle avec Ollama dans le terminal

Pour lancer un modèle, il faut déjà en choisir un. Pour cela, direction la bibliothèque de modèles d'Ollama ! N'hésite pas à parcourir la liste, car il y a beaucoup de modèles disponibles, chacun ayant sa spécialisation (plutôt aide à la programmation, discussion généraliste, ...).

Capture d'écran de la bibliothèque de modèles du site d'Ollama

On va choisir Llama 3, qui vient de sortir. En cliquant sur son lien dans la bibliothèque, on arrive sur la fiche du modèle :

Meta Llama 3, a family of models developed by Meta Inc. are new state-of-the-art, available in both 8B and 70B parameter sizes (pre-trained or instruction-tuned).

Llama 3 instruction-tuned models are fine-tuned and optimized for dialogue/chat use cases and outperform many of the available open-source chat models on common benchmarks.

Si tu galères en anglais, tu peux utiliser un traducteur comme DeepL et copier/coller le texte à traduire dedans 😉.

Remarque : le modèle pre-trained est le modèle de base, qui vient de l'entraînement sur un grand nombre de données. En l'état ce modèle n'est pas utilisable pour la discussion, mais il est capable déjà de faire plein de choses, il faut l'aider à se spécialiser en discussion par une étape dite de « réglage fin » (fine-tuning). Si tu veux en savoir plus, je te recommande la vidéo "# Understand ChatGPT Better Than 99% of People" de Boris Meinardus (active les sous-titres si besoin).

On va le télécharger avec la commande ollama pull llama3. Si tout se passe bien, tu devrais avoir quelque chose du genre :

Une fois que l'on a téléchargé le modèle sur notre disque dur, il n'y a plus qu'à le lancer avec ollama run llama3 et commencer à échanger avec le LLM. Voici ce que cela peut donner :

À savoir :

  • Llama 3 comprend plutôt bien le français, mais sa langue « principale » est l'anglais.
    • S'il arrive que les réponses soient bizarres ou inadaptées, essaie de poser tes questions en anglais.
    • Si tu n'es pas à l'aise en anglais, tu peux utiliser un LLM dont la langue principale est le français, comme les LLM de la famille Vigogne. Par exemple, tu peux installer le modèle Vigostral sur ton ordinateur avec ollama pull benob/vigostral.

Comment installer une interface Web de discussion ?

Discuter dans le terminal, c'est bien ! Mais pour copier/coller du code, avoir une mise en forme améliorée ou encore garder un historique de façon ergonomique, il y a plus pratique pour les débutants... Une interface Web !

Ça tombe bien, la communauté s'est dit la même chose et l'on peut utiliser Open WebUI. Il y en a beaucoup d'autres que tu peux voir listées ici, mais on va utiliser arbitrairement Open WebUI pour ce tutoriel.

Installer Open WebUI

Pour l'installer, direction la documentation !

Installer Docker

Docker est un logiciel qui permet de lancer des applications. Pour l'installer sous Ubuntu, utilises la procédure décrite ici. Cela devrait te donner quelque chose qui ressemble au petit film suivant :

L'installation de Docker est terminée. Comme on a installé Ollama précédemment, d'après la documentation d'Open WebUI, en allant à l'adresse http://127.0.0.1:11434/ avec ton navigateur, tu devrais voir ce texte-là :

Ollama is running

Ollama tourne donc sur ton ordinateur. Reste à le connecter à l'interface Web.

Connecter l'interface à Ollama

La documentation nous indique de lancer dans mon terminal cette commande :

docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

Dans mon terminal, j'ai :

Puis, je me rends à l'adresse http://localhost:8080/... Et là, c'est le drame !

Capture d'écran de l'erreur de connexion à Open WebUI en local

Heureusement, en parcourant la même page de la documentation, on apprend que c'est un problème courant :

Encountering connection issues between the Open WebUI Docker container and the Ollama server? This problem often arises because distro-packaged versions of Docker—like those from the Ubuntu repository—do not support the host.docker.internal alias for reaching the host directly. Inside a container, referring to localhost or 127.0.0.1 typically points back to the container itself, not the host machine.

To address this, we recommend using the --network=host flag in your Docker command. This flag allows the container to use the host's networking stack, effectively making localhost or 127.0.0.1 in the container refer to the host machine. As a result, the WebUI can successfully connect to the Ollama server at 127.0.0.1:11434. Please note, with --network=host, the container's port configuration aligns directly with the host, changing the access link to http://localhost:8080.

N'oublie pas le traducteur DeepL en cas de besoin 😉.

La commande à utiliser à la place est :

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

Si ça a marché de ton côté, tant mieux ! Et si t'as eu la même chose que moi, ça n'a pas marché car on a oublié de repartir de zéro (en supprimant les effets de la première commande). Voici comment faire, sans cacher les erreurs :

Et maintenant c'est bon normalement 😉.

Utiliser Open WebUI

On retourne sur : http://localhost:8080/. Normalement, on a maintenant une page de connexion :

Capture d'écran du formulaire à la première connexion à Open WebUI en local

Comme l'installation est toute fraîche, il faut se créer un compte, donc clique sur "Sign up" en bas et fais-toi un compte :

Capture d'écran d'une création de compte

L'interface est en anglais, si tu n'es pas à l'aise, ouvre les paramètres avec la roue crantée en haut à droite :

Capture d'écran sur comment accéder aux réglages

Dans l'onglet "General", tu peu changer la langue en utilisant le menu déroulant :

Capture d'écran de l'onglet "General"

Bon, à ce stade le plus dur est fait ! Reste plus qu'à sélectionner le modèle que l'on a installé en ligne de commande plus tôt (avec ollama pull llama3 si tu te rappelles 😉)...

Capture d'écran du menu déroulant pour sélectionner son modèle

Et à commencer une discussion.

Capture d'écran d'une discussion avec un LLM en utilisant Open WebUI

Comment personnaliser un modèle pour qu'il joue un rôle ?

Bon, alors « personnaliser » ici est un bien grand mot. C'est plutôt que tu peux fournir des instructions à un modèle pour qu'il adopte un comportement plus spécifique. Par exemple, qu'il agissent comme s'il était quelqu'un qui t'aide pour tes révisions de physique, qui t'aide pour programmer... N'hésite pas à imaginer un scénario à tester.

Et justement, comment tester un scénario ?

Tu peux le faire avec l'interface Web Open WebUI. Le plus simple est d'apprendre en voyant comment les autres le font et après de le faire par toi-même.

Le site OpenWebUI rassemble une communauté de personnes qui propose des fichiers de personnalisation de modèle, ce sont les "Modelfiles".

Capture d'écran de la page d'accueil du site OpenWebUI

On va installer le Modelfile "Studybuddy". Pour cela, une fois que l'on est sur la page du Modelfile :

Capture d'écran de la fichier du Modelfile "Studybuddy"

On clique sur le bouton "Get", s'ouvre alors une petite fenêtre :

Capture d'écran d'une petite fenêtre permettant d'importer en local un Modelfile

Tu vas cliquer sur "Import to WebUI". Il faut bien que l'interface Web soit lancée. Pour rappel, c'est celle qu'on a installé plus tôt avec Docker, avec cette longue commande :

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

Normalement, le Modelfile devrait apparaître dans l'interface sur ton ordinateur :

Capture d'écran du récapitulatif avant de valider l'enregistrement sur ton ordinateur du Modelfile

Si tu as une page d'erreur de chargement, c'est peut-être que l'application de l'interface ne fonctionne pas, car elle a été arrêté. Tu peux relancer l'interface avec la commande docker start open-webui (ou sudo docker start open-webui si la première commande te dit que tu n'as pas la permission de le faire).

On veut juste tester donc ici tu cliques sur « Enregistrer & Créer », et le Modelfile contient les informations pour savoir quel LLM télécharger et l'interface Web va s'en charger pour toi :

Capture d'écran de la progression de l'installation du Modelfile

Tu peux retourner sur la page d'accueil de l'interface (http://localhost:8080/) et commencer à discuter avec ton LLM tuteur d'étude. J'ai cliqué sur la suggestion de prompt qui était contenu dans le Modelfile :

Capture d'écran d'une discussion avec le modèle issu du Modelfile, en utilisant une des suggestions par défaut pour commencer la discussion

Tu peux installer autant de modèles que tu veux et charger celui de ton choix depuis la page d'accueil afin de discuter avec. Tu auras dans le menu de gauche l'historique de tes discussions :

Capture d'écran du menu contenant l'historique des discussions

Le "Study plan for Masters Non-..." est la discussion de l'image d'avant.

À toi d'jouer maintenant ! ^^

Ah, j'oubliais ! Si tu installes trop de modèles et que tu n'as plus assez d'espace disque !

Une « astuce » si tu as un faible espace disque

Une « astuce », tu verras plus bas pourquoi je mets de gros guillemets rouges fluo qui clignotent.

Imagine que tu as un ordinateur avec un dual-boot Windows et Linux, c'est-à-dire un ordinateur sur lequel tu as partagé ton disque en deux :

  • Une partition pour Windows (au cas où, même si tu n'y vas qu'une fois tous les deux mois).
  • Une partition avec une distribution Linux.

Avec le poids des logiciels et de données qui explose, tu peux vite arriver à te retrouver à court d'espace disque sur l'une ou l'autre de tes partitions.

Du coup, tu veux télécharger un modèle avec un ollama pull un-super-modèle et paf ! Espace disque insuffisant...

Que faire ? Tu peux :

  • Supprimer un modèle de ton ordinateur avec ollama rm nom-du-modèle (rm signifie "remove", supprimer en anglais). Tu peux lister les modèles présents sur ton ordinateur avec ollama list dans le terminal. Tu peux aussi les ajouter/supprimer depuis l'interface Open WebUI dans ton navigateur, en allant dans l'onglet « Modèles » dans tes paramètres :

Capture d'écran de l'onglet "Modèles" des paramètres

  • Supprimer la partition Windows et récupérer toute cette place pour Linux.
  • Être un filou avec notre « astuce » du jour.

Mon premier mème public : l'astuce c'est d'avoir un second disque dur. L'autre protagoniste dit que c'est nul avec un air déçu.

OK OK, j'avoue. Tu te dis, « ben je mets mes modèles sur mon premier disque dur, puis quand il n'y a plus de place, je mets les suivants sur un nouveau disque dur ». Mais ça ne marche pas comme ça, car tous les modèles doivent rester dans le même dossier, au cas où plusieurs d'entre eux partageraient des données (poids, ...), comme expliqué ici. Cela permet d'économiser de l'espace disque en dédupliquant toutes les données partagées.

À la place, tu peux utiliser la variable d'environnement OLLAMA_MODELS pour spécifier un autre dossier sur un autre disque dur. La FAQ explique comment procéder, et un exemple est disponible ici.

Je voudrais montrer une astuce qui m'amuse plus, celle du binding (avec la commande sudo mount --bind ...). En gros, quand tu vas rentrer dans un dossier de ton premier disque dur, tu vas en fait arriver sur ton second disque dur.

Voici le code expliqué :

# Le dossier appartient à Ollama, on peut le voir avec son nom en rouge ici :
ls /usr/share -alh | grep ollama

# Il ne faut donc pas oublier de lui donner les droits sur le dossier sur le second disque dur, sinon Ollama ne pourra pas accéder aux données pour les modèles.

# Création du dossier des modèles sur le second disque dur.
mkdir -p /media/jeremy/HPC/DL/.ollama/models/
# Pour toi ce sera : "/media/ton-nom-d-utilisateur/nom-du-second-disque-dur/dossier-de-destination".
# Pour moi : mon second disque dur s'appelle "HPC".

# On arrête Ollama, afin de pouvoir transférer les données des modèles.
sudo systemctl stop ollama

# On copie les données des modèles sur le second disque dur.
sudo cp -R /usr/share/ollama/.ollama/models/* /media/jeremy/HPC/DL/.ollama/models/

# Puis supprimer les données du premier disque dur.
sudo rm -R /usr/share/ollama/.ollama/models/*

# Ne pas oublier les droits à donner à Ollama pour le dossier sur le second disque dur.
sudo chown -R ollama:ollama /media/jeremy/HPC/DL/.ollama/*

# On va maintenant lier le dossier des modèles d'Ollama à un dossier du second disque dur.
sudo mount --bind /media/jeremy/HPC/DL/.ollama/models /usr/share/ollama/.ollama/models/

Si tout se passe bien, tu auras une séquence du genre :

On passe du premier disque dur, qui a ~50 Go de libre, quand on est dans le dossier /usr/share/ollama :

Capture d'écran des propriétés d'un dossier, qui indique 50,8 Go de libre sur le disque dur

Et la magie opère, quand on entre dans le dossier /usr/share/ollama/.ollama, qui a ~565 Go d'espace libre :

Capture d'écran des propriétés d'un sous-dossier du dossier précédent, qui indique 565,4 Go de libre sur le disque dur !

L'astuce n'est pas de moi, mais de ChatGPT d'après cette page.

À noter, que cette astuce ne marchera plus au redémarrage de l'ordinateur. Pour la rendre permanente, il faudra modifier le fichier /etc/fstab, qui indique à l'ordinateur (sous Linux) quelles sont les partitions à monter au démarrage et comment le faire. Me concernant, je dois rajouter cette ligne à la fin du fichier, par exemple depuis le terminal en utilisant la commande sudo nano /etc/fstab :

# Pour décharger le disque principal des modèles d'Ollama
/media/jeremy/HPC/DL/.ollama/models     /usr/share/ollama/.ollama/models/     none     defaults,bind     0 0

Je te laisse le soin d'adapter le chemin d'accès à ton cas (normalement tu dois juste changer le chemin /media/jeremy/HPC/DL/.ollama/models), si besoin avec l'aide de Llama 3 8B (ou d'un autre modèle), que tu sais maintenant à peu près lancer sur ton ordinateur 🙂.

Si tu n'y parviens pas, try hard encore un peu, demande de l'aide sur le Discord d'Ollama ou écris-moi et j'essaie de te filer un coup de pouce.

Il faudra aussi s'assurer que ton second disque soit bien monté au démarrage, une procédure est détaillée ici en cas de besoin 😉.

Voilà, c'est tout pour aujourd'hui !

[^1]: En anglais, mais il y a des sous-titres en français.