Techniques de one-liners Bash pour les LLM
(justine.lol)- Utilisation de llamafile, un projet open source créé avec Mozilla, comme outil shell afin d’exécuter des LLM locaux sous forme d’un fichier exécutable unique et de traiter des tâches d’images, de pages web, d’API, de chat, de code et d’e-mails avec des one-liners Bash
- Un
.llamafilebasé sur LLaVA envoie une description d’image sur la sortie standard avec seulement--imageet un prompt ; selon le système d’exploitation, des préparatifs comme Xcode,binfmt_miscou le suffixe.exepeuvent être nécessaires - Pour l’intégrer à de l’automatisation, il faut restreindre la sortie avec des contraintes de grammaire BNF,
--temp 0et une limite de tokens-n; lors de la génération de noms de fichiers, il est important d’éviter les sorties imprévisibles et les erreursENAMETOOLONG - Le résumé d’URL consiste à convertir le HTML en texte avec
links, puis à le passer par pipe à un llamafile Mistral 7B ; dans l’exemple, une page web de 3 774 mots est réduite à un résumé de 129 mots - API locale compatible OpenAI, chatbot dans le terminal, complétion de code et rédaction d’e-mails sont possibles, mais les LLM de codage ont des limites en mathématiques et en validation ; il est plus sûr de les voir comme des assistants pour explorer des sujets inconnus
Utiliser llamafile comme outil shell de LLM local
- llamafile est un projet open source réalisé avec Mozilla qui permet d’exécuter des LLM directement sur l’ordinateur de l’utilisateur
- Le projet a obtenu 8,3k stars sur GitHub, 1 073 upvotes sur Hacker News, et a aussi été couvert par Hackaday
- La version utilisée dans les exemples est la 0.8.12, et l’article montre ce qu’il est possible de faire avec cette version
- Pour démarrer, il faut télécharger un
.llamafileprécompilé depuis Hugging Face et lui donner les droits d’exécution- Le modèle utilisé est
llava-v1.5-7b-q4.llamafilepour le modèle de vision multimodal LLaVA - Il peut être exécuté sur MacOS, Linux, Windows et BSD
- En cas de problème, il faut consulter les « Gotchas » du README ; MacOS peut nécessiter Xcode, Linux un interpréteur
binfmt_misc, et Windows le suffixe.exe
- Le modèle utilisé est
Résumé d’image : appeler LLaVA vers la sortie standard
llava-v1.5-7b-q4.llamafileutilise par défaut un modèle de vision multimodal, et ce comportement change si l’on passe--mmproj ''- L’image est fournie avec le flag
--image GRAPHIC, et les fichiers jpeg, png, tga, bmp, psd, gif, hdr, pic et pnm sont acceptés - La question est transmise sous la forme
--silent-prompt -p PROMPT, et la réponse est écrite sur la sortie standard - Le one-liner d’exemple pose la question
What do you see?à propos delemurs.jpget utilise--temp 0pour une sortie déterministe - L’offloading GPU nécessite
-ngl 999 - Même la commande de résumé d’image peut avoir des temps d’exécution très différents selon le matériel
- Mac Studio : 4 secondes, prix 8 300 $, M2 Ultra, bande passante mémoire de 800 GB/s, 60 cœurs GPU
- PC Windows : 10 secondes, NVIDIA GeForce RTX 2080 Ti de 4 ans, prix Amazon à l’époque entre 500 et 1 000 $
- Hewlett Packard ProDesk 600 G5 : 45 secondes, 1 653 $, Intel Core i9-9900, bande passante mémoire de 2667 MT/s ou 19,8 GB/s, pas de GPU
- L’exemple de sortie décrit une mère lémurienne tenant deux de ses trois petits, leur apportant protection et chaleur dans un environnement verdoyant
Générer des noms de fichiers sûrs : contraintes de grammaire et limite de tokens
- Le principal risque lors de la génération de noms de fichiers d’images avec LLaVA est que la sortie d’un LLM est généralement imprévisible
--grammarlimite les tokens pouvant être produits à l’aide de la Backus-Naur Form- Exemple :
root ::= "yes" | "no"force la sortie à être seulement"yes\n"ou"no\n" - L’exemple de nom de fichier ne produit que des mots en minuscules et des espaces, puis utilise
sedpour remplacer les espaces par des underscores et ajoute.jpg
- Exemple :
- Le one-liner de génération de nom de fichier utilise
--grammar 'root ::= [a-z]+ (" " [a-z]+)+'avec-n 16 - Sans limitation du nombre maximal de tokens générés avec
-n 16, le LLM peut produire un texte trop long et provoquer une erreurENAMETOOLONG - La grammaire doit correspondre dans une certaine mesure à la manière dont le modèle cherche naturellement à générer du texte
- LLaVA n’a pas été entraîné à générer des phrases contenant des underscores ; mettre directement des underscores dans la BNF peut donc produire des sorties incohérentes
- La sortie en minuscules entrait dans les capacités de LLaVA
- Pour des formats très présents sur le web, comme JSON, les contraintes de grammaire peuvent servir de garde-fous pour réduire les erreurs de syntaxe dans du JSON halluciné
- Une version plus aboutie existe sous la forme du script
rename-pictures.sh, avec un exemple d’exécution visant~/Pictures
Résumer des URL : combinaison de links et Mistral 7B
- Le Mistral 7B instruct llamafile peut être utilisé pour résumer des URL HTML en lui passant par pipe la sortie de la commande
links linksest un navigateur web en ligne de commande, généralement installable sur MacOS avecbrew install links- Des binaires APE précompilés sont aussi fournis pour les cas où aucun gestionnaire de paquets n’est disponible
linksv2.29, 7,7 MB- Pour AMD64+ARM64, Linux+Windows+FreeBSD+NetBSD+OpenBSD
- Le one-liner de résumé d’URL suit ce flux
- Afficher d’abord
[INST]Summarize the following text: - Transformer la page web en texte avec
links -codepage utf-8 -force-html -width 500 -dump URL - Nettoyer certains caractères avec
sed 's/*/ /g' - Ajouter
[/INST], puis transmettre le tout au llamafile Mistral avec-f /dev/stdin
- Afficher d’abord
- La page d’exemple « Real Programmers Don’t Use Pascal » passe de 3 774 mots à un résumé de 129 mots
- La même méthode permet aussi de poser des questions arbitraires sur le texte
- Dans l’exemple, on demande si l’auteur semble mentalement instable, et Mistral tient compte du fait qu’il y a de l’exagération et de l’hyperbole, mais qu’il s’agit d’un texte satirique de 1983
- Avec
--grammar 'root ::= "yes" | "no"', la sortie peut être limitée à une forme YES/NO plus facile à utiliser dans un script
- La contrainte importante est de ne pas dépasser la taille de contexte de 32k tokens de Mistral v0.2
-width 500évite de réarranger les paragraphes et réduit les retours à la ligne inutilessed 's/ */ /g'permet de réduire les espaces répétésdd bs=1 count=80000peut servir de dernière ligne de défense en coupant grossièrement les longues pages web
API locale compatible OpenAI
- Le llamafile « server » fournit localement un endpoint compatible avec l’API OpenAI
- L’exemple utilise Mixtral 8x7B et nécessite un GPU puissant capable d’exécuter un modèle de 30 gibibytes
- Le serveur est lancé avec
mixtral-8x7b-instruct-v0.1.Q5_K_M-server.llamafile --nobrowser - Dans un autre terminal, une requête est envoyée avec
curlàhttp://localhost:8080/v1/chat/completions, puis le JSON renvoyé est joliment affiché avec Python - Le JSON de requête suit le format OpenAI Chat Completions, avec
gpt-3.5-turbocomme valeur demodelet un tableau de messages system et user - La réponse d’exemple contient un message
assistantexpliquant le concept de récursion sous forme de poème, ainsi que les compteurs d’usagecompletion_tokens,prompt_tokensettotal_tokens
Chatbot dans le terminal : prompt Digital Athena
- llamafile peut être utilisé comme un outil UNIX standard en ligne de commande, soit en téléchargeant le binaire compressé depuis la page des releases, soit en le compilant depuis les sources
- Le flux présenté est
git clone,make -j8,sudo make install,man llamafile
- Le flux présenté est
- Cette approche facilite l’utilisation avec les poids GGUF de Hugging Face
- L’exemple de chatbot utilise le modèle LLaMA original publié par Facebook à des fins de recherche
- Il est important de concevoir le prompt pour que le modèle parle sur un ton académique sans l’anthropomorphiser
- Le nom Digital Athena vient d’Athéna, déesse grecque de la sagesse et de la connaissance
- Le prompt commence sous forme de dialogue entre
ResearcheretDigital Athena
- L’exécution interactive utilise des options comme
--interactive,--color,--ctx_size 4096et--reverse-prompt 'Researcher:' --temp 0est un réglage qui rend la sortie déterministe et reproductible- Sans cela, llamafile utilise le niveau d’aléa de la version 0.8.12, ce qui donne une réponse unique à chaque fois
- Si l’on veut un chatbot anthropomorphisé, le modèle LLaMA original peut être difficile à manier, car il a tendance par défaut à traiter l’utilisateur comme un inconnu sur Reddit
Complétion de code : utiliser Wizard Coder
- En téléchargeant le Wizard Coder llamafile, on peut l’utiliser dans Emacs ou Vim pour l’autocomplétion de la ligne courante
- Le modèle d’exemple a été fine-tuné principalement pour Python, mais il génère une implémentation de
memcpy()en C - Le prompt ne contient aucune explication en anglais, seulement le début d’un bloc de code Markdown et la signature de la fonction
- Ne pas écrire en anglais réduit la probabilité que le modèle ajoute une longue explication du code
- Utiliser un bloc de code Markdown augmente les chances que le token de reverse prompt indiqué avec
-rapparaisse et que la génération s’arrête au bon moment - Pour l’arrêter plus sûrement, on peut limiter la réponse à 100 tokens avec
-n 100
- L’exemple de sortie est une implémentation de
memcpy()qui copiesizeoctets desrcversdstavec une bouclefor, puis renvoiedst - Les LLM de codage ont des limites évidentes
- Ils comprennent bien le langage humain, mais sont faibles en mathématiques
- Ils écrivent du code qui semble plausible, mais qui peut rarement résister à une revue
- Il peut être utile de les voir comme des outils qui répètent des réponses Stack Overflow dans plusieurs langages
- Pour en tirer une bonne expérience, il faut s’attendre à ce qu’ils aident surtout à explorer des sujets inconnus
Rédaction d’e-mails : générer des réponses avec un petit modèle
- L’exemple de rédaction d’e-mails met en scène un Raspberry Pi à 50 $ qui répond aux e-mails d’une entreprise pour aider à vendre des produits
- Rocket 3B utilise une syntaxe de prompt légèrement différente, et dans ce cas la temperature peut aider à imiter l’improvisation
- L’exemple suppose une configuration dans laquelle un serveur PHP injecte une demande de support dans le prompt et envoie la sortie vers
sendmailpar pipe - Le prompt système indique d’aider l’utilisateur tout en orientant la conversation vers l’achat de pickles
- En réponse à un utilisateur qui dit avoir rencontré des vents violents dans le Long Island Sound et avoir besoin d’être secouru, le modèle génère une réponse empathique avant de recommander les Bill Pickle’s Gourmet Dill Pickles
- Le dernier exemple est humoristique et ne doit pas être interprété comme une recommandation ou une approbation par Mozilla d’un modèle, d’une licence, d’un jeu de données ou de pratiques spécifiques
1 commentaires
Avis de Hacker News
Cela fait plusieurs mois que j’explore avec plaisir la combinaison des LLM et des utilitaires CLI, et les deux vont vraiment très bien ensemble
La manière dont la philosophie Unix enchaîne plusieurs outils avec des pipes correspond aussi très bien au fonctionnement des LLM
J’ai surtout expérimenté avec l’outil CLI https://llm.datasette.io/, et il existe aussi des outils ponctuels comme https://github.com/simonw/blip-caption et https://github.com/simonw/ospeak
Le domaine LLM+CLI est tellement amusant que je trouve étonnant que davantage de gens ne l’explorent pas en profondeur
C’est l’exploration technique la plus bruyante que j’aie vue jusqu’ici, au point qu’on pourrait presque en entendre moins, pas plus
Il expose les modèles de prompts comme des verbes en ligne de commande, et peut les charger depuis plusieurs « dépôts »
Je maintiens un ensemble de prompts pour chaque dépôt sur lequel je travaille, avec aussi des scripts “prompto” personnalisés https://github.com/go-go-golems/prompto qui génèrent un contexte de prompt dynamique
J’en ai aussi créé pas mal pour des bibliothèques tierces, disponibles sur https://github.com/go-go-golems/promptos
Une partie des prompts publics est visible sur https://github.com/go-go-golems/geppetto/tree/main/cmd/pinoc..., et je travaille actuellement sur un framework d’agents déclaratif
Récemment, avec httrack + w3m dump + sgpt images + la vision GPT, j’ai construit une base de connaissances spécifique de 278 000 tokens, et j’ai mis en place un RAG avec un hack Perl personnalisé qui préserve la structure générale des connaissances
Je me demande si quelqu’un a déjà vu des outils compatibles avec la philosophie Unix pour le traitement des entrées et le RAG local
À noter que l’auteur de l’article original avait déjà fait pas mal de travail sur le sujet, résumé ici : https://simonwillison.net/2023/Oct/23/embeddings/
Le point qui me bloque actuellement est la chaîne d’outils pour découper en chunks le contenu à vectoriser. Ce serait bien d’avoir des choses comme la détection du contexte d’emplacement dans le texte source, par exemple “2.1 Failover” ou “Chapter 8: The dream”, la suppression des retours à la ligne d’une source à 80 caractères de large, et un découpage intelligent qui préserve les paragraphes
Je pense que la principale raison est VS Code, et les développeurs que j’accompagne préfèrent eux aussi le point-and-click au terminal et à la CLI
Articles récents liés
Llamafile – The easiest way to run LLMs locally on your Mac - https://news.ycombinator.com/item?id=38522636 - décembre 2023, 17 commentaires
Llamafile is the new best way to run a LLM on your own computer - https://news.ycombinator.com/item?id=38489533 - décembre 2023, 47 commentaires
Llamafile lets you distribute and run LLMs with a single file - https://news.ycombinator.com/item?id=38464057 - novembre 2023, 287 commentaires
Vraiment excellent. J’aime particulièrement l’exemple où l’on utilise un LLM pour renommer des fichiers image avec des noms descriptifs
Je l’ai essayé sur un desktop Windows équipé d’une NVIDIA GeForce RTX 3080 Ti, et j’ai rencontré quelques obstacles avant de le faire fonctionner
WSL renvoie l’erreur
error: APE is running on WIN32 inside WSL. You need to run: sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop', masquée par/dev/nulldans le one-linerEnsuite, sous zsh, j’obtenais
zsh: exec format error: ./llava-v1.5-7b-q4-main.llamafile, il fallait donc l’exécuter avec bash. Le titre parle bien de bash, mais c’est étrange que ça ne fonctionne pas avec zshUn avertissement indique aussi que le déchargement sur GPU n’est pas pris en charge, probablement à cause de WSL. Je ne fais pas de programmation GPU sur cette machine Windows
shdevant la commande règle le problème :sh ./llava-v1.5-7b-q4-main.llamafileC’est un comportement particulier de zsh et d’APE, et il y a des détails à ce sujet sur https://justine.lol/ape.html
Je me demande si les tests étaient beaucoup plus lents avec le CPU seul
Une recherche rapide sur Hugging Face montre quelques Llamafiles TinyLlama d’environ 1B
En les ajoutant aux trois llamafile existants, cela fait 6 au total, mais je me demande s’il existe d’autres llamafile dans la nature
Je me demande comment HN voit llamafile et modelfile(https://github.com/jmorganca/ollama/blob/main/docs/modelfile...)
Les deux évoquent une expérience à la Dockerfile. Modelfile ressemble directement à un Dockerfile, mais llamafile paraît plus difficile à écrire et sa forme réelle n’est pas immédiatement évidente. Je me demande s’il s’agit d’une séquence de commandes à exécuter dans le terminal
En théorie, je me demande aussi pourquoi ne pas simplement utiliser un Dockerfile
--grammar, qui limite les logits de la sortie du LLM et convient très bien aux scripts bash effectuant toutes sortes de tâches de classification en traitement du langage naturelÀ part ça, si j’ai besoin d’un LLM local, j’utilise ollama ; quand je loue un serveur GPU, j’utilise vllm ; et si j’ai simplement besoin du meilleur modèle, j’utilise l’API OpenAI
Il suffit de télécharger llamafile, de faire
chmod +x, puis de lancer./runCela dit, l’association Docker + llamafile est aussi possible. Il y a une configuration Dockerfile plutôt correcte sur https://github.com/ajbouh/cosmos
Je me demande quels sont les avantages et inconvénients de llamafile, tel qu’utilisé dans l’article d’origine, par rapport à ollama
On peut donc utiliser toutes sortes de réglages avec un minimum d’effort. En particulier, si l’on télécharge le llamafile “server”, c’est le moyen le plus rapide de lancer un LLM local dans un onglet de navigateur
https://huggingface.co/jartine/llava-v1.5-7B-GGUF/tree/main
llamafile peut aussi servir de chatbot en ligne de commande, mais pour cet usage, ollama offre une expérience bien plus propre et aboutie
Je voudrais vérifier si j’ai bien compris. Si on utilise llamafile dans un script shell pour renommer des fichiers dans un répertoire, faut-il bien ouvrir et charger l’exécutable à chaque nouveau nom de fichier traité ?
Dans ce cas, je me demande si cette mémoire est chargée puis déchargée à chaque fois, ou s’il existe un mécanisme de cache ingénieux que j’ignore
Sur un M1 Pro, l’exemple de légende d’image a pris 13 secondes au premier lancement, puis 8 secondes au deuxième, et les exécutions suivantes prenaient encore à peu près le même temps
Si l’on doit traiter un très grand nombre de fichiers, il semble vraiment nécessaire de charger les poids une seule fois et de les garder pendant qu’un processus boucle
Cela reste tout de même très utile et intéressant
Tant que rien d’autre ne réclame cette RAM, ces pages restent en cache en mémoire entre deux appels de commande
Sur une station de travail avec 128 Go, même en utilisant plusieurs modèles 7B sur CPU, ils restent tous en cache
Pour compléter quelques lignes avec un modèle tenant dans 8 Go de VRAM, c’est environ 6 secondes contre 2 secondes, et sur une 3090 avec 96 Go de RAM, toute l’inférence tourne sur GPU
Si l’on fait vraiment du traitement par lots, il vaut clairement mieux garder le modèle chargé entre les complétions
En revanche, cela implique d’être lié au modèle chargé par le server. En le chargeant à la demande, on peut changer de modèle
C’est important pour les requêtes multimodales sur image, car les autres modèles ne comprennent pas les tokens d’image projetés
Les étapes d’installation contiennent les commandes suivantes, et je me demande si c’est sûr
Je me demande s’il faut faire quelque chose pour exécuter llamafile sous Windows 10
Quand j’exécute
llava-v1.5-7b-q4-server.llamafiledans git bash, il meurt immédiatement avec “Segmentation fault”, et dans cmd il n’affiche rienJ’ai aussi essayé de télécharger séparément llamafile et le modèle, puis de lancer
llamafile.exe -m llava-v1.5-7b-Q4_K.gguf, mais le problème persisteJe n’ai pas trouvé de problème similaire et, à mon avis, cela ne vient pas de l’antivirus
cmd.exeou PowerShellVous pouvez passer le flag
--strace, ou--ftracesi possible, pour voir ce qui se passe.llamafiletéléchargé en.exe.llamafileen.exe