1 points par GN⁺ 2023-12-15 | 1 commentaires | Partager sur WhatsApp
  • 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 .llamafile basé sur LLaVA envoie une description d’image sur la sortie standard avec seulement --image et un prompt ; selon le système d’exploitation, des préparatifs comme Xcode, binfmt_misc ou le suffixe .exe peuvent être nécessaires
  • Pour l’intégrer à de l’automatisation, il faut restreindre la sortie avec des contraintes de grammaire BNF, --temp 0 et 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 erreurs ENAMETOOLONG
  • 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 .llamafile précompilé depuis Hugging Face et lui donner les droits d’exécution
    • Le modèle utilisé est llava-v1.5-7b-q4.llamafile pour 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

Résumé d’image : appeler LLaVA vers la sortie standard

  • llava-v1.5-7b-q4.llamafile utilise 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 de lemurs.jpg et utilise --temp 0 pour 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
  • --grammar limite 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 sed pour remplacer les espaces par des underscores et ajoute .jpg
  • 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 erreur ENAMETOOLONG
  • 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
  • links est un navigateur web en ligne de commande, généralement installable sur MacOS avec brew install links
  • Des binaires APE précompilés sont aussi fournis pour les cas où aucun gestionnaire de paquets n’est disponible
    • links v2.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
  • 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 inutiles
    • sed 's/ */ /g' permet de réduire les espaces répétés
    • dd bs=1 count=80000 peut 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-turbo comme valeur de model et un tableau de messages system et user
  • La réponse d’exemple contient un message assistant expliquant le concept de récursion sous forme de poème, ainsi que les compteurs d’usage completion_tokens, prompt_tokens et total_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
  • 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 Researcher et Digital Athena
  • L’exécution interactive utilise des options comme --interactive, --color, --ctx_size 4096 et --reverse-prompt 'Researcher:'
  • --temp 0 est 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 -r apparaisse 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 copie size octets de src vers dst avec une boucle for, puis renvoie dst
  • 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 sendmail par 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

 
GN⁺ 2023-12-15
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

    • Ces 9 derniers mois, 70 % de la première page de Hacker News et de Twitter parlaient de toutes sortes de LLM CLI
      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
    • J’utilise beaucoup https://github.com/go-go-golems/geppetto au travail, avec un mode CLI et un mode de chat TUI
      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
    • Ce sont de bons liens. J’utilisais https://github.com/npiv/chatblade et https://github.com/tbckr/sgpt, et je suis entièrement d’accord pour dire que LLM+CLI est une combinaison parfaite
      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
    • L’enthousiasme pour les workflows centrés sur la CLI semble s’essouffler
      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/null dans le one-liner
    Ensuite, 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 zsh
    Un 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

    • Sous zsh, ajouter sh devant la commande règle le problème : sh ./llava-v1.5-7b-q4-main.llamafile
      C’est un comportement particulier de zsh et d’APE, et il y a des détails à ce sujet sur https://justine.lol/ape.html
    • C’était un bug de ZSH et il a été corrigé il y a quelques mois. Il semble que vous utilisiez une ancienne version de ZSH
    • J’envisageais d’essayer sur une machine Windows avec une RTX 4070, mais on dirait que le GPU n’est pas utilisé sous WSL
      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 ne connais pas la réponse à la question, mais je me demandais si vous saviez qu’il est possible de télécharger l’exécutable autonome llamafile-server et de l’utiliser avec n’importe quel modèle gguf
  • 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

    • La fonctionnalité clé est l’option --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
    • https://news.ycombinator.com/item?id=38464057
    • llamafile n’utilise pas Docker. C’est juste un exécutable
      Il suffit de télécharger llamafile, de faire chmod +x, puis de lancer ./run
      Cela 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

    • llamafile est essentiellement proche de llama.cpp, sans avoir à le compiler soi-même
      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

    • Le modèle est mappé en mémoire depuis le disque, donc le noyau se charge de le lire en mémoire
      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
    • La différence entre lancer le main de llama.cpp et utiliser server + des requêtes HTTP POST est assez importante, mais pas au point de tout changer
      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

    sudo wget -O /usr/bin/ape [https://cosmo.zip/pub/cosmos/bin/ape-$(uname](<https://cosmo.zip/pub/cosmos/bin/ape-$(uname>) -m).elf  
    sudo chmod +x /usr/bin/ape  
    sudo sh -c "echo ':APE:M::MZqFpD::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"  
    sudo sh -c "echo ':APE-jart:M::jartsr::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"  
    
  • 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.llamafile dans git bash, il meurt immédiatement avec “Segmentation fault”, et dans cmd il n’affiche rien
    J’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 persiste
    Je n’ai pas trouvé de problème similaire et, à mon avis, cela ne vient pas de l’antivirus

    • Je me demande si vous avez essayé depuis cmd.exe ou PowerShell
      Vous pouvez passer le flag --strace, ou --ftrace si possible, pour voir ce qui se passe
    • Sous Windows, il faut renommer le .llamafile téléchargé en .exe
    • Sous Windows, il faut renommer le .llamafile en .exe