Bash-Einzeiler-Techniken für LLMs
(justine.lol)- Mit dem zusammen mit Mozilla entwickelten Open-Source-Projekt llamafile lassen sich lokale LLMs wie Shell-Tools als einzelne ausführbare Datei starten und Aufgaben mit Bildern, Webseiten, APIs, Chat, Code und E-Mails per Bash-Einzeiler erledigen
- Ein auf LLaVA basierendes
.llamafilegibt mit nur--imageund einem Prompt Bildbeschreibungen auf die Standardausgabe aus; je nach Betriebssystem können Vorbereitungen wie Xcode,binfmt_miscoder die Endung.exenötig sein - Für den Einsatz in der Automatisierung sollte die Ausgabe mit BNF-Grammatikbeschränkungen,
--temp 0und einer Token-Begrenzung per-neingeengt werden; bei der Dateinamenerzeugung ist es wichtig, unvorhersehbare Ausgaben undENAMETOOLONG-Fehler zu vermeiden - URL-Zusammenfassungen funktionieren, indem HTML mit
linksin Text umgewandelt und dann an ein Mistral-7B-llamafile gepiped wird; im Beispiel wird eine Webseite mit 3.774 Wörtern auf eine Zusammenfassung mit 129 Wörtern reduziert - Möglich sind auch eine lokale OpenAI-kompatible API, ein Terminal-Chatbot, Code-Vervollständigung und das Schreiben von E-Mails; bei LLMs fürs Programmieren gibt es aber Grenzen bei Mathematik und Verifikation, weshalb sie sicherer als Hilfswerkzeug zum Erkunden unbekannter Themen betrachtet werden sollten
llamafile als lokales LLM-Shell-Tool verwenden
- llamafile ist ein Open-Source-Projekt, an dem zusammen mit Mozilla gearbeitet wurde und das LLMs direkt auf dem Computer der Nutzer ausführt
- Das Projekt hat auf GitHub 8,3k stars, auf Hacker News 1073 upvotes erhalten und wurde auch von Hackaday aufgegriffen
- Die Release-Version in den Beispielen ist 0.8.12, und der Text zeigt, was mit dieser Version möglich ist
- Der Einstieg erfolgt, indem man ein vorgefertigtes
.llamafilevon Hugging Face herunterlädt und ausführbar macht- Verwendet wird das
.llamafilellava-v1.5-7b-q4.llamafilefür das multimodale Vision-Modell LLaVA - Es läuft unter MacOS, Linux, Windows und BSD
- Bei Problemen sollte man die Gotchas im README prüfen; unter MacOS kann Xcode nötig sein, unter Linux der
binfmt_misc-Interpreter und unter Windows die Endung.exe
- Verwendet wird das
Bildzusammenfassung: LLaVA auf Standardausgabe aufrufen
llava-v1.5-7b-q4.llamafileverwendet standardmäßig ein multimodales Vision-Modell; mit--mmproj ''verändert sich dieses Verhalten- Bilder werden mit dem Flag
--image GRAPHICübergeben; unterstützt werden Dateien in jpeg, png, tga, bmp, psd, gif, hdr, pic und pnm - Die Frage wird in der Form
--silent-prompt -p PROMPTübergeben, und die Antwort erscheint auf der Standardausgabe - Der Beispiel-Einzeiler fragt für
lemurs.jpgWhat do you see?und verwendet mit--temp 0eine deterministische Ausgabe - Für GPU-Offloading ist
-ngl 999nötig - Selbst derselbe Befehl zur Bildzusammenfassung kann je nach Hardware sehr unterschiedlich lange laufen
- Mac Studio: 4 Sekunden, Preis 8.300 $, M2 Ultra, 800 GB/s Speicherbandbreite, 60 GPU cores
- Windows-PC: 10 Sekunden, vier Jahre alte NVIDIA GeForce RTX 2080 Ti, damaliger Amazon-Preis 500–1.000 $
- Hewlett Packard ProDesk 600 G5: 45 Sekunden, 1.653 $, Intel Core i9-9900, 2667 MT/s oder 19,8 GB/s Speicherbandbreite, keine GPU
- Die Beispielausgabe beschreibt, dass ein weiblicher Lemur zwei von drei Jungtieren hält und ihnen in einer grünen Umgebung Schutz und Wärme bietet
Sichere Dateinamenerzeugung: Grammatikbeschränkungen und Token-Limits
- Das zentrale Risiko bei der Erzeugung von Bilddateinamen mit LLaVA ist, dass LLM-Ausgaben grundsätzlich unvorhersehbar sind
--grammarbegrenzt die möglichen Ausgabetokens per Backus-Naur-Form- Zum Beispiel erzwingt
root ::= "yes" | "no", dass nur"yes\n"oder"no\n"ausgegeben wird - Im Dateinamenbeispiel werden nur Kleinbuchstaben und Leerzeichen zugelassen, danach werden Leerzeichen mit
sedin Unterstriche umgewandelt und.jpgangehängt
- Zum Beispiel erzwingt
- Der Einzeiler zur Dateinamenerzeugung verwendet
--grammar 'root ::= [a-z]+ (" " [a-z]+)+'zusammen mit-n 16 - Wenn mit
-n 16die maximale Zahl der generierten Tokens nicht begrenzt wird, kann das LLM zu langen Text erzeugen und einenENAMETOOLONG-Fehler verursachen - Die Grammatik sollte einigermaßen zu der Art passen, wie das Modell ursprünglich zu generieren gelernt hat
- LLaVA wurde nicht darauf trainiert, Sätze mit Unterstrichen zu erzeugen; wenn man Unterstriche direkt in die BNF aufnimmt, kann die Ausgabe inkonsistent werden
- Kleingeschriebene Ausgaben lagen innerhalb des Bereichs von LLaVA
- Formate wie JSON, die im Web häufig gesammelt wurden, können mit Grammatikbeschränkungen als Guardrail dienen, um Syntaxfehler in halluziniertem JSON zu verringern
- In vollständigerer Form gibt es das Skript
rename-pictures.sh, das im Beispiel auf~/Picturesangewendet wird
URL-Zusammenfassung: Kombination aus links und Mistral 7B
- Das Mistral 7B instruct llamafile kann die Ausgabe des Befehls
linksper Pipe für die Zusammenfassung von HTML-URLs verwenden linksist ein Webbrowser für die Kommandozeile und lässt sich unter MacOS meist mitbrew install linksinstallieren- Es gibt auch ein vorgefertigtes APE-Binary für Fälle ohne Paketmanager
linksv2.29, 7,7 MB- Für AMD64+ARM64 sowie Linux+Windows+FreeBSD+NetBSD+OpenBSD
- Der URL-Zusammenfassungs-Einzeiler arbeitet mit folgendem Ablauf
- Zuerst wird
[INST]Summarize the following text:ausgegeben - Mit
links -codepage utf-8 -force-html -width 500 -dump URLwird die Webseite in Text umgewandelt - Mit
sed 's/*/ /g'werden einige Zeichen bereinigt - Danach wird
[/INST]angehängt und alles mit-f /dev/stdinan das Mistral-llamafile übergeben
- Zuerst wird
- Die Beispielseite „Real Programmers Don’t Use Pascal“ wird von 3.774 Wörtern auf eine Zusammenfassung mit 129 Wörtern reduziert
- Auf dieselbe Weise sind auch beliebige Fragen zu einem Text möglich
- Im Beispiel wird gefragt, ob der Autor mental instabil wirke; Mistral berücksichtigt dabei, dass der Text zwar übertrieben und hyperbolisch ist, aber eine satirische Schrift von 1983 darstellt
- Mit
--grammar 'root ::= "yes" | "no"'lässt sich die Ausgabe für Skripte bequem auf ein YES/NO-Format beschränken
- Eine wichtige Beschränkung ist, die Kontextgröße von 32k Tokens in Mistral v0.2 nicht zu überschreiten
-width 500hilft, Umbrüche in Absätzen zu vermeiden und überflüssige Zeilenumbrüche zu reduzieren- Mit
sed 's/ */ /g'lassen sich wiederholte Leerzeichen reduzieren dd bs=1 count=80000kann als letzte Verteidigungslinie dienen, um lange Webseiten grob abzuschneiden
Lokale OpenAI-kompatible API
- Ein „server“-llamafile stellt lokal einen OpenAI-API-kompatiblen Endpoint bereit
- Im Beispiel wird Mixtral 8x7B verwendet, wofür eine starke GPU nötig ist, die ein 30-Gibibyte-Modell ausführen kann
- Der Server wird mit
mixtral-8x7b-instruct-v0.1.Q5_K_M-server.llamafile --nobrowsergestartet - In einem separaten Terminal wird mit
curleine Anfrage anhttp://localhost:8080/v1/chat/completionsgesendet, und das zurückgegebene JSON wird mit Python hübsch formatiert ausgegeben - Das Request-JSON folgt dem OpenAI-Chat-Completions-Format mit
modelaufgpt-3.5-turbosowie einem Nachrichtenarray aus system- und user-Nachrichten - Die Beispielantwort enthält eine
assistant-Nachricht, die das Konzept der Rekursion in Gedichtform erklärt, sowie die Nutzungswertecompletion_tokens,prompt_tokensundtotal_tokens
Terminal-Chatbot: Digital-Athena-Prompt
- llamafile kann als komprimiertes Binary von der Release-Seite geladen oder aus dem Sourcecode gebaut und wie ein normales UNIX-Kommandozeilenwerkzeug genutzt werden
- Gezeigt wird der Ablauf
git clone,make -j8,sudo make install,man llamafile
- Gezeigt wird der Ablauf
- Dieser Ansatz macht die Nutzung zusammen mit GGUF weights von Hugging Face einfach
- Das Chatbot-Beispiel verwendet das ursprüngliche LLaMA-Modell, das Facebook zu Forschungszwecken veröffentlicht hat
- Wichtig ist ein Prompt, der das Modell nicht vermenschlicht und es in akademischem Ton sprechen lässt
- Der Name Digital Athena stammt von Athena, der griechischen Göttin der Weisheit und des Wissens
- Gestartet wird im Dialogformat zwischen
ResearcherundDigital Athena
- Für den interaktiven Betrieb werden Optionen wie
--interactive,--color,--ctx_size 4096und--reverse-prompt 'Researcher:'verwendet --temp 0sorgt dafür, dass die Ausgabe deterministisch und reproduzierbar ist- Ohne diese Option nutzt llamafile den Zufallsgrad von Version 0.8.12, sodass jedes Mal eine andere Antwort entsteht
- Wenn man einen stärker vermenschlichten Chatbot will, kann das ursprüngliche LLaMA-Modell schwierig sein, weil seine Grundeinstellung Nutzer eher wie fremde Personen auf Reddit behandelt
Code-Vervollständigung: Wizard Coder verwenden
- Wer das Wizard Coder llamafile herunterlädt, kann es in Emacs oder Vim zur Autovervollständigung der aktuellen Zeile nutzen
- Das Beispielmodell wurde auf Python fokussiert feinjustiert, erzeugt aber eine Implementierung von
memcpy()in C - Der Prompt enthält nur den Beginn eines Markdown-Codeblocks und die Funktionssignatur, ohne englische Erklärung
- Wenn man kein Englisch schreibt, sinkt die Wahrscheinlichkeit, dass das Modell lange Codeerklärungen anhängt
- Ein Markdown-Codeblock erhöht die Chance, dass das mit
-rangegebene reverse-prompt-Token erscheint und die Generierung zum passenden Zeitpunkt endet - Um sicherer zu stoppen, kann man die Antwort mit
-n 100auf 100 Tokens begrenzen
- Die Beispielausgabe ist eine
memcpy()-Implementierung, die mit einerfor-SchleifesizeBytes vonsrcnachdstkopiert unddstzurückgibt - LLMs zum Programmieren haben klare Grenzen
- Sie verstehen menschliche Sprache gut, sind aber schwach in Mathematik
- Sie schreiben plausibel wirkenden Code, der einer Prüfung aber oft nicht standhält
- Hilfreich ist es, sie als Werkzeug zu sehen, das Stack-Overflow-Antworten in mehreren Sprachen wiederkäut
- Für gute Erfahrungen sollte man erwarten, Hilfe beim Erkunden unbekannter Themen zu bekommen
E-Mails schreiben: Antworten mit kleinen Modellen erzeugen
- Das Beispiel zum Schreiben von E-Mails beschreibt einen Raspberry Pi für 50 $, der auf Firmen-E-Mails antwortet und beim Produktverkauf hilft
- Rocket 3B verwendet eine leicht andere Prompt-Syntax; in diesem Fall kann Temperature helfen, Improvisation nachzuahmen
- Das Beispiel geht von einem PHP-Server aus, der Supportanfragen in den Prompt einfügt und die Ausgabe an
sendmailpipet - Der System-Prompt weist das Modell an, dem Nutzer zu helfen und das Gespräch zugleich in Richtung Pickle-Kauf zu lenken
- Im Beispiel sagt ein Nutzer, er brauche nach starkem Wind auf dem Long Island Sound Rettung; das Modell erzeugt daraufhin erst eine empathische Antwort und empfiehlt dann Bill Pickle’s Gourmet Dill Pickles
- Das letzte Beispiel ist als Humor gemeint und darf nicht so verstanden werden, dass Mozilla ein bestimmtes Modell, eine bestimmte Lizenz, einen bestimmten Datensatz oder bestimmte Praktiken empfiehlt oder garantiert
1 Kommentare
Hacker-News-Meinungen
Seit einigen Monaten erkunde ich mit Freude die Kombination aus LLMs und CLI-Utilities, und die beiden passen wirklich gut zusammen
Die Art, mit Pipes im Sinne der Unix-Philosophie mehrere Tools aneinanderzureihen, passt auch gut zur Funktionsweise von LLMs
Ich habe hauptsächlich mit dem CLI-Tool https://llm.datasette.io/ experimentiert, außerdem gibt es auch Einmal-Tools wie https://github.com/simonw/blip-caption und https://github.com/simonw/ospeak
Es macht so viel Spaß, dass ich mich fast wundere, dass nicht noch mehr Leute den Bereich LLM+CLI intensiv erkunden
Es war die lauteste technische Erkundung, die ich bisher gesehen habe; ich müsste davon eher weniger als noch mehr hören
Prompt-Templates werden wie Kommandozeilen-Verben bereitgestellt und können aus mehreren „Repositories“ geladen werden
Für jedes Repository, an dem ich arbeite, pflege ich eine Sammlung von Prompts und lege dazu auch eigene „prompto“-Skripte https://github.com/go-go-golems/prompto ab, die dynamischen Prompt-Kontext erzeugen
Für Third-Party-Bibliotheken habe ich ebenfalls einiges gebaut; das liegt unter https://github.com/go-go-golems/promptos
Einige der öffentlichen Prompts kann man unter https://github.com/go-go-golems/geppetto/tree/main/cmd/pinoc... sehen, und derzeit baue ich ein deklaratives Agenten-Framework
Kürzlich habe ich mit httrack + w3m dump + sgpt images + GPT Vision eine spezifische Wissensbasis mit 278.000 Tokens aufgebaut und per eigenem Perl-Hack, der die Gliederungsstruktur des Wissens bewahrt, RAG umgesetzt
Ich frage mich, ob du Tools gesehen hast, die gut zur Unix-Philosophie passen, für Eingabeverarbeitung und lokales RAG
Nebenbei sehe ich, dass der Autor des Originalbeitrags dazu bereits einiges gemacht und unter https://simonwillison.net/2023/Oct/23/embeddings/ zusammengefasst hat
Der Punkt, an dem ich gerade festhänge, ist eine Toolchain zum Chunking der Inhalte, für die Embeddings erstellt werden sollen. Schön wäre etwas, das Positionskontext wie „2.1 Failover“ oder „Chapter 8: The dream“ im Originaltext erkennt, Zeilenumbrüche aus 80-Zeichen-breiten Quellen auflöst und Absätze beibehält, also intelligent segmentiert
Ich denke, der Hauptgrund ist VS Code, und die Entwickler, die ich unterstütze, wollen eher Point-and-Click als Terminal und CLI
Aktuelle verwandte Beiträge
Llamafile – The easiest way to run LLMs locally on your Mac - https://news.ycombinator.com/item?id=38522636 - Dezember 2023, 17 Kommentare
Llamafile is the new best way to run a LLM on your own computer - https://news.ycombinator.com/item?id=38489533 - Dezember 2023, 47 Kommentare
Llamafile lets you distribute and run LLMs with a single file - https://news.ycombinator.com/item?id=38464057 - November 2023, 287 Kommentare
Wirklich großartig. Besonders gefällt mir das Beispiel, bei dem mit einem LLM Bilddateien beschreibend umbenannt werden
Ich habe es auf einem Windows-Desktop mit einer NVIDIA GeForce RTX 3080 Ti ausprobiert, und es gab ein paar Stolpersteine, bis es lief
WSL wirft den Fehler
error: APE is running on WIN32 inside WSL. You need to run: sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop', der im One-Liner nach/dev/nullversteckt wirdDanach erschien in zsh
zsh: exec format error: ./llava-v1.5-7b-q4-main.llamafile, sodass ich es in bash ausführen musste. Im Titel steht zwar bash, aber dass es in zsh nicht funktioniert, wirkt merkwürdigEs erscheint auch eine Warnung, dass GPU-Offloading nicht unterstützt wird; vermutlich liegt das an WSL. Auf dieser Windows-Maschine mache ich keine GPU-Programmierung
shvor den Befehl setzt:sh ./llava-v1.5-7b-q4-main.llamafileDas ist eine Eigenheit von zsh und APE, und unter https://justine.lol/ape.html steht etwas dazu
Ich frage mich, ob der Test mit nur der CPU sehr langsam war
Eine kurze Suche auf Hugging Face zeigt ein paar TinyLlama-Llamafiles in der Größenordnung von etwa 1B.
Zusammen mit den drei bereits vorhandenen llamafile wären das insgesamt sechs; ich frage mich, ob es in freier Wildbahn noch weitere llamafile gibt.
Ich frage mich, wie HN llamafile und modelfile (https://github.com/jmorganca/ollama/blob/main/docs/modelfile...) einschätzt.
Beides erinnert an eine Dockerfile-ähnliche Erfahrung. Modelfile sieht direkt wie ein Dockerfile aus, aber llamafile wirkt schwerer zu schreiben, und die tatsächliche Form erschließt sich nicht sofort. Ich frage mich, ob es eine Sequenz von Befehlen ist, die man im Terminal ausführt.
Theoretisch frage ich mich auch, warum man nicht einfach Dockerfile verwendet.
--grammar; sie beschränkt die Logits der LLM-Ausgabe und ist damit sehr nützlich für Bash-Skripte, die alle möglichen Klassifizierungsaufgaben in der Verarbeitung natürlicher Sprache erledigen.Ansonsten nutze ich ollama, wenn ich ein lokales LLM brauche, vllm, wenn ich einen GPU-Server miete, und die OpenAI API, wenn ich einfach das beste Modell brauche.
Man lädt llamafile herunter, macht
chmod +xund führt es mit./runaus.Docker + llamafile ist allerdings ebenfalls möglich. Unter https://github.com/ajbouh/cosmos gibt es eine ziemlich gute Dockerfile-Konfiguration.
Ich frage mich, welche Vor- und Nachteile llamafile aus dem Originalbeitrag gegenüber ollama hat.
Dadurch bekommt man mit minimalem Aufwand Zugriff auf alle möglichen Konfigurationsregler. Besonders wenn man das „server“-llamafile herunterlädt, ist es der schnellste Weg, ein lokales LLM in einem Browser-Tab zu starten.
https://huggingface.co/jartine/llava-v1.5-7B-GGUF/tree/main
llamafile kann zwar auch einen Kommandozeilen-Chatbot ausführen, aber für diesen Zweck bietet ollama eine deutlich sauberere und ausgereiftere Erfahrung.
Ich möchte prüfen, ob ich das richtig verstanden habe: Wenn man llamafile in einem Shell-Skript ausführt, um etwa Dateinamen in einem Verzeichnis umzubenennen, muss dann bei jedem neuen Dateinamen die ausführbare Datei geöffnet und geladen werden?
Falls ja, wird dieser Speicher dann jedes Mal geladen und wieder entladen, oder gibt es irgendein schickes Caching, von dem ich nichts weiß?
Beim ersten Ausführen des Bildunterschriften-Beispiels auf einem M1 Pro dauerte es 13 Sekunden, beim zweiten Mal 8 Sekunden, und spätere Läufe brauchten weiterhin ungefähr ähnlich lange.
Wenn man sehr viele Dateien verarbeitet, scheint es wirklich nötig zu sein, die Gewichte nur einmal zu laden und sie während einer Prozessschleife im Speicher zu behalten.
Trotzdem ist es weiterhin sehr nützlich und interessant.
Solange dieser RAM nicht von etwas anderem angefordert wird, bleiben die betreffenden Pages zwischen Befehlsaufrufen im Speicher gecacht.
Auf einer Workstation mit 128 GB bleiben sogar mehrere 7B-Modelle auf der CPU alle im Cache.
mainaus llama.cpp und server + POST-HTTP-Requests ist ziemlich groß, aber nicht weltbewegend.Bei ein paar Zeilen Completion auf einem 8-GB-VRAM-Modell sind es grob 6 Sekunden gegenüber 2 Sekunden; auf einer 3090 mit 96 GB RAM läuft die Inferenz komplett auf der GPU.
Wenn man wirklich Batch-Jobs macht, ist es eindeutig besser, das Modell zwischen Completions geladen zu lassen.
Andererseits hat man den Nachteil, an das im Server geladene Modell gebunden zu sein. Wenn man es bei Bedarf lädt, kann man Modelle austauschen.
Das ist für multimodale Bildabfragen wichtig, weil andere Modelle die projizierten Bild-Token nicht verstehen.
In den Installationsschritten stehen die folgenden Befehle; ich frage mich, ob das sicher ist.
Ich frage mich, ob man etwas tun muss, um llamafile unter Windows 10 auszuführen.
Wenn ich
llava-v1.5-7b-q4-server.llamafilein git bash ausführe, beendet es sich sofort mit „Segmentation fault“, und in cmd gibt es keinerlei Ausgabe.Ich habe auch llamafile und das Modell separat heruntergeladen und
llamafile.exe -m llava-v1.5-7b-Q4_K.ggufprobiert, aber das Problem bleibt dasselbe.Ich konnte kein ähnliches Problem finden, und aus meiner Sicht scheint es auch kein Antivirus-Problem zu sein.
cmd.exeoder PowerShell ausprobiert hast.Du kannst das Flag
--straceoder, falls möglich,--ftraceübergeben, um zu sehen, was passiert..llamafilein.exeumbenennen..llamafilein.exeumbenennen.