Mit Lamafile können Sie LLMs mit einer einzelnen Datei verteilen und ausführen. (Ankündigungsblog -Beitrag)
Unser Ziel ist es, sowohl Entwicklern als auch Endbenutzern offene LLMs zugänglicher zu machen. Wir tun dies, indem wir Lama.cpp mit Cosmopolitan LIBC zu einem Framework kombinieren, der die Komplexität von LLMs auf eine einzelne ausführbare Datei (als "llamafile" bezeichnet) zusammenfasst, die auf den meisten Computern ohne Installation lokal läuft.
Llamafile ist ein Mozilla Builders -Projekt.
Der einfachste Weg, es selbst auszuprobieren, besteht darin, unser Beispiel Lamafile für das LLAVA -Modell herunterzuladen (Lizenz: LLAMA 2, OpenAI). Llava ist ein neues LLM, das mehr als nur Chat durchführen kann. Sie können auch Bilder hochladen und ihm Fragen zu ihnen stellen. Mit Lamafile geschieht dies alles vor Ort; Keine Daten lassen Ihren Computer jemals.
Download LLAVA-V1.5-7B-Q4.llamafile (4,29 GB).
Öffnen Sie das Terminal Ihres Computers.
Wenn Sie MacOS, Linux oder BSD verwenden, müssen Sie Ihrem Computer die Berechtigung erteilen, diese neue Datei auszuführen. (Sie müssen dies nur einmal tun.)
chmod +x llava-v1.5-7b-q4.llamafile
Wenn Sie unter Windows sind, benennen Sie die Datei am Ende ".exe" um.
Lamafile lamafile. z.B:
./llava-v1.5-7b-q4.llamafile
Ihr Browser sollte automatisch geöffnet und eine Chat -Oberfläche anzeigen. (Wenn dies nicht der Fall ist, öffnen Sie einfach Ihren Browser und zeigen Sie ihn auf http: // localhost: 8080)
Wenn Sie mit dem Chatten fertig sind, kehren Sie zu Ihrem Terminal zurück und drücken Sie Control-C
um Lamafile zu schließen.
Schwierigkeiten haben? Siehe den Abschnitt "Gotchas" unten.
Wenn Llamafile gestartet wird, hostet es auch ein Web -UI -Chat -Server unter http://127.0.0.1:8080/, ein OpenAI -API -kompatibler Endpunkt für Chat -Abschlüsse wird ebenfalls bereitgestellt. Es wurde entwickelt, um die häufigsten OpenAI -API -Anwendungsfälle auf eine Weise zu unterstützen, die vollständig lokal läuft. Wir haben es auch um Lama.CPP -spezifische Funktionen (z. B. Mirostat) erweitert, die auch verwendet werden können. Weitere Informationen zu den verfügbaren Feldern und Endpunkten finden Sie sowohl in der OpenAI -Dokumentation als auch in der Lamafile Server Readme.
Der einfachste Weg, um mit der API zu beginnen, besteht darin, den folgenden Curl -Befehl in Ihr Terminal zu kopieren und einzufügen.
curl http://localhost:8080/v1/chat/completions
-H " Content-Type: application/json "
-H " Authorization: Bearer no-key "
-d ' {
"model": "LLaMA_CPP",
"messages": [
{
"role": "system",
"content": "You are LLAMAfile, an AI assistant. Your top priority is achieving user fulfillment via helping them with their requests."
},
{
"role": "user",
"content": "Write a limerick about python exceptions"
}
]
} ' | python3 -c '
import json
import sys
json.dump(json.load(sys.stdin), sys.stdout, indent=2)
print()
'
Die gedruckte Antwort sollte wie Folgendes aussehen:
{
"choices" : [
{
"finish_reason" : " stop " ,
"index" : 0 ,
"message" : {
"content" : " There once was a programmer named Mike n Who wrote code that would often choke n He used try and except n To handle each step n And his program ran without any hike. " ,
"role" : " assistant "
}
}
],
"created" : 1704199256 ,
"id" : " chatcmpl-Dt16ugf3vF8btUZj9psG7To5tc4murBU " ,
"model" : " LLaMA_CPP " ,
"object" : " chat.completion " ,
"usage" : {
"completion_tokens" : 38 ,
"prompt_tokens" : 78 ,
"total_tokens" : 116
}
}
Wenn Sie Ihre Software bereits mit dem openai
Python -Paket entwickelt haben (das von OpenAI veröffentlicht wurde), sollten Sie in der Lage sein, Ihre App zu portieren, um stattdessen mit Lamafile zu sprechen, indem Sie einige Änderungen an base_url
und api_key
vornehmen. In diesem Beispiel wird davon ausgegangen, dass Sie pip3 install openai
zu installieren, um die Client -Software von OpenAI zu installieren, die in diesem Beispiel erforderlich ist. Ihr Paket ist nur eine einfache Python -Wrapper um die OpenAI -API -Schnittstelle, die von jedem Server implementiert werden kann.
#!/usr/bin/env python3
from openai import OpenAI
client = OpenAI (
base_url = "http://localhost:8080/v1" , # "http://<Your api-server IP>:port"
api_key = "sk-no-key-required"
)
completion = client . chat . completions . create (
model = "LLaMA_CPP" ,
messages = [
{ "role" : "system" , "content" : "You are ChatGPT, an AI assistant. Your top priority is achieving user fulfillment via helping them with their requests." },
{ "role" : "user" , "content" : "Write a limerick about python exceptions" }
]
)
print ( completion . choices [ 0 ]. message )
Der obige Code gibt ein Python -Objekt wie folgt zurück:
ChatCompletionMessage ( content = 'There once was a programmer named Mike n Who wrote code that would often strike n An error would occur n And he ' d shout "Oh no!" n But Python ' s exceptions made it all right.' , role = 'assistant' , function_call = None , tool_calls = None )
Wir bieten auch Beispiele Lamafiles für andere Modelle, sodass Sie Lamafile problemlos mit verschiedenen Arten von LLMs ausprobieren können.
Modell | Größe | Lizenz | lamafile | andere Quants |
---|---|---|---|---|
Lama 3.2 3b anweisen | 2,62 GB | Lama 3.2 | LLAMA-3.2-3B-Instruct.q6_k.llamafile | Siehe HF Repo |
Lama 3.2 1B Anweisung | 1.11 GB | Lama 3.2 | LLAMA-3.2-1B-INSTRUCT.Q6_K.llamafile | Siehe HF Repo |
Gemma 2 2b anweisen | 2,32 GB | Gemma 2 | Gemma-2-2b-it.q6_k.llamafile | Siehe HF Repo |
Gemma 2 9b unterrichten | 7,76 GB | Gemma 2 | Gemma-2-9b-it.q6_k.llamafile | Siehe HF Repo |
Gemma 2 27b unterrichten | 22,5 GB | Gemma 2 | GEMMA-2-27B-IT.Q6_K.llamafile | Siehe HF Repo |
Llava 1.5 | 3,97 GB | Lama 2 | llava-v1.5-7b-q4.llamafile | Siehe HF Repo |
Tinyllama-1.1b | 2,05 GB | Apache 2.0 | Tinyllama-1.1b-chat-v1.0.f16.llamafile | Siehe HF Repo |
Mistral-7B-Struktur | 3,85 GB | Apache 2.0 | Mistral-7b-Instruct-V0.2.q4_0.llamafile | Siehe HF Repo |
PHI-3-Mini-4K-Instruktur | 7,67 GB | Apache 2.0 | PHI-3-Mini-4K-Instruct.f16.llamafile | Siehe HF Repo |
MIXTRAL-8X7B-ISTRUCT | 30.03 GB | Apache 2.0 | MIXTRAL-8X7B-INSSTRUCT-V0.1.Q5_K_M.LLAMAFILE | Siehe HF Repo |
WizardCoder-Python-34b | 22.23 GB | Lama 2 | WizardCoder-Python-34B-V1.0.q5_k_m.llamafile | Siehe HF Repo |
WizardCoder-Python-13b | 7.33 GB | Lama 2 | WizardCoder-Python-13b.llamafile | Siehe HF Repo |
LAMA-3-Instruct-70b | 37,25 GB | llama3 | Meta-llama-3-70b-instruct.q4_0.llamafile | Siehe HF Repo |
LAMA-3-Instruct-8b | 5.37 GB | llama3 | Meta-llama-3-8b-instruct.q5_k_m.llamafile | Siehe HF Repo |
Rocket-3b | 1,89 GB | cc-by-sa4.0 | Rocket-3b.q5_k_m.llamafile | Siehe HF Repo |
Olmo-7b | 5,68 GB | Apache 2.0 | Olmo-7b-0424.q6_k.llamafile | Siehe HF Repo |
Texteinbettungsmodelle | ||||
E5-MISTRAL-7B-ISTRAUT | 5.16 GB | MIT | E5-MISTRAL-7B-INSTRUCT-Q5_K_M.LlAMAFILE | Siehe HF Repo |
MXBAI-EMBED-LARGE-V1 | 0,7 GB | Apache 2.0 | MXBAI-EMBED-LARGE-V1-F16.llamafile | Siehe HF Repo |
Hier ist ein Beispiel für die Mistral Command-Line Lamafile:
./mistral-7b-instruct-v0.2.Q5_K_M.llamafile --temp 0.7 -p ' [INST]Write a story about llamas[/INST] '
Und hier ist ein Beispiel für den WizardCoder-Python-Kommandozeilen Lamafile:
./wizardcoder-python-13b.llamafile --temp 0 -e -r ' ```n ' -p ' ```cnvoid *memcpy_sse2(char *dst, const char *src, size_t size) {n '
Und hier ist ein Beispiel für die LLAVA-Kommandozeile Lamafile:
./llava-v1.5-7b-q4.llamafile --temp 0.2 --image lemurs.jpg -e -p ' ### User: What do you see?n### Assistant: '
Nach wie vor müssen MacOS-, Linux- und BSD -Benutzer den Befehl "CHMOD" verwenden, um der Datei Ausführungsberechtigungen zu erteilen, bevor diese Lamafiles zum ersten Mal ausgeführt werden.
Leider können Windows -Benutzer viele dieser Beispiele Lamafiles nicht verwenden, da Windows eine maximal ausführbare Dateigröße von 4 GB aufweist und alle diese Beispiele diese Größe überschreiten. (Die Llamafile llamafile arbeitet an Fenstern, da es 30 MB schüchtern der Größengrenze ist.) Aber nicht das Herz verlieren: Lamafile ermöglicht es Ihnen, externe Gewichte zu verwenden. Dies wird später in diesem Dokument beschrieben.
Schwierigkeiten haben? Siehe den Abschnitt "Gotchas" unten.
Ein Lamafile ist eine ausführbare LLM, die Sie auf Ihrem eigenen Computer ausführen können. Es enthält die Gewichte für ein bestimmtes offenes LLM sowie alles, was erforderlich ist, um dieses Modell tatsächlich auf Ihrem Computer auszuführen. Es gibt nichts zu installieren oder zu konfigurieren (mit wenigen Einschränkungen, die in nachfolgenden Abschnitten dieses Dokuments erörtert werden).
Dies alles wird erreicht, indem Lama.cpp mit Cosmopolitan LIBC kombiniert wird, was einige nützliche Fähigkeiten bietet:
Lamafiles können auf mehreren CPU -Mikroarchitekturen ausgeführt werden. Wir haben Runtime -Versand zu llama.cpp hinzugefügt, mit dem neue Intel -Systeme moderne CPU -Funktionen verwenden können, ohne die Unterstützung älterer Computer zu verteilen.
Lamafiles können auf mehreren CPU -Architekturen laufen. Wir tun dies, indem wir AMD64- und ARM64 -Builds mit einem Shell -Skript verkettet, das den entsprechenden startet. Unser Dateiformat ist mit Win32 und den meisten Unix -Shells kompatibel. Es ist auch in der Lage, bei Bedarf einfach (entweder von Ihnen oder Ihren Benutzern) in das Plattform-native Format konvertiert zu werden.
Lamafiles können auf sechs OSS (MacOS, Windows, Linux, FreeBSD, OpenBSD und NetBSD) ausgeführt werden. Wenn Sie Ihre eigenen Lama-Dateien erstellen, müssen Sie Ihren Code nur einmal mit einer Toolchain im Linux-Stil erstellen. Der von uns bereitgestellte GCC-basierte Compiler ist selbst eine tatsächlich tragbare ausführbare Datei, sodass Sie Ihre Software für alle sechs Osen bequem erstellen können, die Sie für die Entwicklung am meisten bevorzugen.
Die Gewichte für ein LLM können in die Lamafile eingebettet werden. Wir haben die GGML -Bibliothek unterstützt. Dadurch können unkomprimierte Gewichte direkt in das Gedächtnis abgebildet werden, ähnlich wie ein selbsterrahmerlicher Archiv. Es ermöglicht es, dass quantisierte Gewichte, die online verteilt sind, mit einer kompatiblen Version der Lama.CPP -Software vorangestellt werden, wodurch sichergestellt wird, dass das ursprünglich beobachtete Verhalten auf unbestimmte Zeit reproduziert werden kann.
Mit den in diesem Projekt enthaltenen Tools können Sie schließlich Ihre eigenen Lamafiles erstellen, indem Sie kompatible Modellgewichte verwenden, die Sie gewünscht haben. Sie können diese Lamafiles dann an andere Menschen verteilen, die sie leicht nutzen können, unabhängig davon, welche Art von Computer sie haben.
Obwohl unser Beispiel Lamafiles die Gewichte eingebaut hat, müssen Sie Lamafile nicht so verwenden. Stattdessen können Sie nur die Lamafile -Software (ohne Gewichte enthalten) von unserer Releases -Seite herunterladen. Sie können es dann neben allen externen Gewichten verwenden, die Sie möglicherweise zur Hand haben. Externe Gewichte sind für Windows -Benutzer besonders nützlich, da Sie es ermöglichen, die 4GB -Größenbeschränkung von Windows mit 4GB auszuarbeiten.
Für Windows -Benutzer finden Sie hier ein Beispiel für das Mistral LLM:
curl -L -o llamafile.exe https://github.com/Mozilla-Ocho/llamafile/releases/download/0.8.11/llamafile-0.8.11
curl -L -o mistral.gguf https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.1-GGUF/resolve/main/mistral-7b-instruct-v0.1.Q4_K_M.gguf
./llamafile.exe -m mistral.gguf
Windows -Benutzer müssen möglicherweise ./llamafile.exe
.llamafile.exe
Überprüfen Sie auf einer Plattform, wenn Ihr Llamafile -Prozess sofort getötet wird, ob Sie Crowdstrike haben, und bitten Sie dann, weißezellistische zu sein.
Auf macOS mit Apple Silicon müssen Xcode -Befehlszeilen -Tools für Llamafile installiert sein, um sich selbst zu starten.
Wenn Sie ZSH verwenden und Probleme haben, Lamafile zu betreiben, versuchen Sie, sh -c ./llamafile
zu sagen. Dies ist auf einen Fehler zurückzuführen, der in ZSH 5,9+ behoben wurde. Gleiches gilt für Python subprocess
, alte Fischversionen usw.
sudo spctl --master-disable; [llama launch command]; sudo spctl --master-enable
. Dies liegt daran, dass --master-disable
alle Überprüfungen deaktiviert, sodass Sie es nach dem Abenden von Lama wieder einschalten müssen. Bei einigen Linux-Systemen erhalten Sie möglicherweise Fehler in Bezug auf run-detectors
oder WEIN. Dies ist auf binfmt_misc
-Registrierungen zurückzuführen. Sie können dies beheben, indem Sie eine zusätzliche Registrierung für das APE -Dateiformat Lamafile verwendet: Verwendungszwecke:
sudo wget -O /usr/bin/ape 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 "
Wie oben erwähnt, müssen Sie unter Windows möglicherweise Ihren Lamafile umbenennen, indem Sie den Dateinamen .exe
hinzufügen.
Wie oben erwähnt, hat Windows auch eine maximale Dateigrößengröße von 4 GB für Executables. Der oben ausführbare LLAVA -Server ist nur 30 MB vor diesem Grenzwert. Es funktioniert also unter Windows, aber mit größeren Modellen wie dem Assistentencoder 13b müssen Sie die Gewichte in einer separaten Datei speichern. Ein Beispiel wird oben angegeben; Siehe "Lamafile mit externen Gewichten."
Auf der WSL gibt es viele mögliche Gotchas. Eine Sache, die dazu beiträgt, sie vollständig zu lösen, ist Folgendes:
[Unit]
Description=cosmopolitan APE binfmt service
After=wsl-binfmt.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo ':APE:M::MZqFpD::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"
[Install]
WantedBy=multi-user.target
Setzen Sie das in /etc/systemd/system/cosmo-binfmt.service
ein.
Führen Sie dann sudo systemctl enable cosmo-binfmt
.
Eine andere Sache, die WSL -Nutzern geholfen hat, die Probleme haben, ist die Deaktivierung der Win32 -Interop -Funktion:
sudo sh -c " echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop "
Wenn eine Permission Denied
wird, kann sie dauerhaft deaktiviert werden, indem das folgende in /etc/wsl.conf
hinzugefügt wird
[interop]
enabled=false
Llamafile unterstützt die folgenden Betriebssysteme, für die eine minimale Aktieninstallation erforderlich ist:
Unter Windows läuft Lamafile als native tragbare ausführbare Datei. Auf UNIX-Systemen extrahiert Llamafile ein kleines Lader-Programm namens ape
auf $TMPDIR/.llamafile
oder ~/.ape-1.9
, mit dem Ihr Modell in den Speicher zugeordnet wird.
[1] Darwin Kernel -Versionen 15.6+ sollten unterstützt werden, aber wir können dies derzeit nicht testen.
Lamafile unterstützt den folgenden CPUs:
AMD64 -Mikroprozessoren müssen AVX haben. Andernfalls wird Lamafile einen Fehler drucken und sich weigern, auszuführen. Dies bedeutet, dass, wenn Sie eine Intel -CPU haben, es Intel Core oder neuer sein muss (circa 2006+), und wenn Sie eine AMD -CPU haben, muss es K8 oder neuer sein (circa 2003+). Unterstützung für AVX512, AVX2, FMA, F16C und VNNI sind zur Laufzeit bedingt aktiviert, wenn Sie eine neuere CPU haben. Zum Beispiel hat Zen4 sehr gute AVX512, die BF16 Lamafiles beschleunigen können.
ARM64 -Mikroprozessoren müssen ARMV8A+haben. Dies bedeutet, dass alles von Apple Silicon bis 64-Bit-Himbeer-PIs funktioniert, vorausgesetzt, Ihre Gewichte passen in den Speicher.
Llamafile unterstützt die folgenden Arten von GPUs:
Die GPU auf MacOS ARM64 wird unterstützt, indem ein kleines Modul mithilfe der Xcode -Befehlszeilen -Tools zusammengestellt wird, die installiert werden müssen. Dies ist eine einmalige Kosten, die beim ersten Mal mit Ihrem Lamafile stattfinden. Der von Llamafile erbaute DSO wird in $TMPDIR/.llamafile
oder $HOME/.llamafile
aufbewahrt. Das Abladen in die GPU ist standardmäßig aktiviert, wenn eine Metall -GPU vorhanden ist. Dies kann deaktiviert werden, indem -ngl 0
oder --gpu disable
um Lamafile zur Durchführung von CPU -Inferenz zu erzwingen.
Besitzer von NVIDIA- und AMD -Grafikkarten müssen das Flag -ngl 999
übergeben, um eine maximale Ausladung zu ermöglichen. Wenn mehrere GPUs vorhanden sind, werden die Arbeiten standardmäßig gleichmäßig aufgeteilt, sodass Sie größere Modelle laden können. Mehrere GPU -Unterstützung kann auf AMD -Radeon -Systemen unterbrochen werden. Wenn Ihnen das passiert, verwenden Sie export HIP_VISIBLE_DEVICES=0
was Lamafile dazu zwingt, nur die erste GPU zu verwenden.
Windows -Benutzer werden aufgefordert, unsere Release -Binärdateien zu verwenden, da sie vorgebaute DLLs sowohl für NVIDIA- als auch für AMD -Grafikkarten enthalten, die nur von dem zu installierenden Grafiktreiber abhängen. Wenn Lamafile feststellt, dass die CUDA -SDK von Nvidia oder das ROCM HIP SDK von AMD installiert sind, wird Lamafile versuchen, eine schnellere DLL zu bauen, die Cublas oder Rocblas verwendet. Damit Llamafile erfolgreich ein Cublas -Modul erstellen kann, muss es auf der X64 -MSVC -Eingabeaufforderung ausgeführt werden. Sie können CUDA über WSL verwenden, indem Sie Nvidia CUDA auf WSL aktivieren und Ihre Lamafiles innerhalb von WSL laufen lassen. Die Verwendung von WSL hat den zusätzlichen Vorteil, dass Sie Lamafiles mehr als 4 GB unter Windows ausführen können.
Unter Linux müssen die NVIDIA -Benutzer das CUDA -SDK (idealerweise mit dem Shell -Skript -Installationsprogramm) installieren, und die ROCM -Benutzer müssen das HIP -SDK installieren. Sie werden erkannt, ob nvcc
oder hipcc
auf dem Weg sind.
Wenn Sie sowohl eine AMD -GPU als auch eine NVIDIA -GPU in Ihrer Maschine haben, müssen Sie möglicherweise qualifizieren, welche Sie verwendet werden möchten, indem Sie entweder bestehen --gpu amd
oder --gpu nvidia
.
Für den Fall, dass die GPU -Unterstützung aus irgendeinem Grund nicht kompiliert und dynamisch verknüpft werden konnte, wird Llamafile auf die CPU -Inferenz zurückfallen.
Die Entwicklung von Lamafile erfordert eine moderne Version des GNU make
( unzip
gmake
auf einigen Systemen bezeichnet) curl
sha256sum
(ansonsten wird cc
zum Erstellen verwendet), wget
Pub/Cosmos/bin/. Windows -Benutzer benötigen auch Cosmos -Bash -Shell.
make -j8
sudo make install PREFIX=/usr/local
Hier ist ein Beispiel dafür, wie Sie Code für eine LIBC-Funktion unter Verwendung der Befehlszeilenschnittstelle von LLAMA.CPP unter Verwendung des Assistenten-Python-13b-Gewichts generieren:
llamafile
-m wizardcoder-python-13b-v1.0.Q8_0.gguf
--temp 0 -r ' }n ' -r ' ```n '
-e -p ' ```cnvoid *memcpy(void *dst, const void *src, size_t size) {n '
Hier ist ein ähnliches Beispiel, das stattdessen Mistral-7b-in-Strukturgewichte für die Prosazusammensetzung verwendet:
llamafile -ngl 9999
-m mistral-7b-instruct-v0.1.Q4_K_M.gguf
-p ' [INST]Write a story about llamas[/INST] '
Hier ist ein Beispiel dafür, wie Llamafile als interaktiver Chatbot verwendet werden kann, mit dem Sie in Trainingsdaten einbezogen werden können:
llamafile -m llama-65b-Q5_K.gguf -p '
The following is a conversation between a Researcher and their helpful AI assistant Digital Athena which is a large language model trained on the sum of human knowledge.
Researcher: Good morning.
Digital Athena: How can I help you today?
Researcher: ' --interactive --color --batch_size 1024 --ctx_size 4096
--keep -1 --temp 0 --mirostat 2 --in-prefix ' ' --interactive-first
--in-suffix ' Digital Athena: ' --reverse-prompt ' Researcher: '
Hier ist ein Beispiel dafür, wie Sie Lamafile verwenden können, um HTML -URLs zusammenzufassen:
(
echo ' [INST]Summarize the following text: '
links -codepage utf-8
-force-html
-width 500
-dump https://www.poetryfoundation.org/poems/48860/the-raven |
sed ' s/ */ /g '
echo ' [/INST] '
) | llamafile -ngl 9999
-m mistral-7b-instruct-v0.2.Q5_K_M.gguf
-f /dev/stdin
-c 0
--temp 0
-n 500
--no-display-prompt 2> /dev/null
So können Sie Lamafile verwenden, um ein JPG/PNG/GIF/BMP -Bild zu beschreiben:
llamafile -ngl 9999 --temp 0
--image ~ /Pictures/lemurs.jpg
-m llava-v1.5-7b-Q4_K.gguf
--mmproj llava-v1.5-7b-mmproj-Q4_0.gguf
-e -p ' ### User: What do you see?n### Assistant: '
--no-display-prompt 2> /dev/null
Es ist möglich, die BNF -Grammatik zu verwenden, um die Ausgabe durchzusetzen und in Ihrem Shell -Skript sicher zu verwenden. Die einfachste Grammatik wäre --grammar 'root ::= "yes" | "no"'
um das LLM zu zwingen, nur auf Standardausgabe zu drucken, entweder "yesn"
oder "non"
. Ein weiteres Beispiel ist, wenn Sie ein Skript schreiben möchten, um alle Ihre Bilddateien umzubenennen, können Sie sagen:
llamafile -ngl 9999 --temp 0
--image lemurs.jpg
-m llava-v1.5-7b-Q4_K.gguf
--mmproj llava-v1.5-7b-mmproj-Q4_0.gguf
--grammar ' root ::= [a-z]+ (" " [a-z]+)+ '
-e -p ' ### User: What do you see?n### Assistant: '
--no-display-prompt 2> /dev/null |
sed -e ' s/ /_/g ' -e ' s/$/.jpg/ '
a_baby_monkey_on_the_back_of_a_mother.jpg
Hier ist ein Beispiel für den integrierten HTTP-Server von llama.cpp. In diesem Beispiel wird LLAVA V1.5-7B verwendet, ein multimodales LLM, das mit der kürzlich geschlossenen Unterstützung von LLAMA.CPP für Bildeingaben funktioniert.
llamafile -ngl 9999
-m llava-v1.5-7b-Q8_0.gguf
--mmproj llava-v1.5-7b-mmproj-Q8_0.gguf
--host 0.0.0.0
Der obige Befehl startet eine Browser -Registerkarte auf Ihrem PC, um eine Weboberfläche anzuzeigen. Sie können mit Ihrem LLM chatten und Bilder dazu hochladen.
Wenn Sie einfach sagen können:
./llava.llamafile
... und lassen Sie es den Webserver ausführen, ohne Argumente angeben zu müssen, und dann können Sie sowohl die Gewichte als auch ein spezielles .args
innen einbetten, was die Standardargumente angibt. Erstellen wir zunächst eine Datei namens .args
, die diesen Inhalt enthält:
-m
llava-v1.5-7b-Q8_0.gguf
--mmproj
llava-v1.5-7b-mmproj-Q8_0.gguf
--host
0.0.0.0
-ngl
9999
...
Wie wir oben sehen können, gibt es ein Argument pro Zeile. Das ...
Argument gibt optional an, wo zusätzliche CLI -Argumente vom Benutzer eingefügt werden sollen. Als nächstes fügen wir sowohl die Gewichte als auch die Argumentdatei zur ausführbaren Datei hinzu:
cp /usr/local/bin/llamafile llava.llamafile
zipalign -j0
llava.llamafile
llava-v1.5-7b-Q8_0.gguf
llava-v1.5-7b-mmproj-Q8_0.gguf
.args
./llava.llamafile
Glückwunsch. Sie haben gerade Ihre eigene LLM -ausführbare Datei gemacht, die leicht mit Ihren Freunden zu teilen ist.
Eine gute Möglichkeit, einen Lamafile mit Ihren Freunden zu teilen, besteht darin, es auf umarmtes Gesicht zu veröffentlichen. Wenn Sie dies tun, wird empfohlen, dass Sie in Ihrem Umarmungsgesichts -Commit -Botschaft erwähnen, welche Git -Revision oder veröffentlichte Version von Llamafile Sie beim Aufbau Ihres Lamafile verwendet haben. Auf diese Weise kann jeder online die Herkunft seiner ausführbaren Inhalte überprüfen. Wenn Sie Änderungen am Quellcode von LLAMA.CPP oder Cosmopolitan vorgenommen haben, müssen Sie in der Apache 2.0 -Lizenz erklären, was sich geändert hat. Eine Möglichkeit, dies zu tun, besteht darin, eine Mitteilung in Ihrem Lamafile mit zipalign
einzubetten, die die Änderungen beschreibt, und sie in Ihrem umarmenden Gesichtsausschuss erwähnen.
Es gibt eine manuelle Seite für jede der Lamafile -Programme, die beim Ausführen sudo make install
installiert sind. Die Befehlshandbücher sind auch Typen als PDF -Dateien, die Sie von unserer Seite mit Github -Releases herunterladen können. Zuletzt zeigen die meisten Befehle diese Informationen an, wenn Sie das Flag --help
-Flag übergeben.
In diesem Abschnitt wird die Frage beantwortet : "Ich habe bereits ein Modell lokal von Anwendung X heruntergeladen. Kann ich sie mit llamafile verwenden?" . Die allgemeine Antwort lautet "Ja, solange diese Modelle lokal im GGUF -Format gespeichert sind", aber ihre Implementierung kann je nach Anwendung mehr oder weniger hackig sein. Es folgen ein paar Beispiele (getestet auf einem Mac).
LM Studio speichert heruntergeladene Modelle in ~/.cache/lm-studio/models
in Unterverzeichnissen mit demselben Namen der Modelle (nach account_name/model_name
Format von Suggingface) mit demselben Dateinamen, den Sie beim Herunterladen der Datei gesehen haben.
Wenn Sie also die llama-2-7b.Q2_K.gguf
-Datei für TheBloke/Llama-2-7B-GGUF
heruntergeladen haben, können Sie Lamafile wie folgt ausführen:
cd ~/.cache/lm-studio/models/TheBloke/Llama-2-7B-GGUF
llamafile -m llama-2-7b.Q2_K.gguf
Wenn Sie ein neues Modell mit Ollama herunterladen, wird alle seine Metadaten in einer Manifest -Datei unter ~/.ollama/models/manifests/registry.ollama.ai/library/
gespeichert. Der Name des Verzeichnisses und des Manifestdateins sind der Modellname, der von ollama list
zurückgegeben wird. Zum Beispiel wird für llama3:latest
die Manifest -Datei .ollama/models/manifests/registry.ollama.ai/library/llama3/latest
heißt.
Die Manifestkartierung jeder Datei, die sich auf das Modell (z. B. GGUF -Gewichte, Lizenz, Eingabeaufforderung usw.) zu einem SHA256 -Digest bezieht. Die Digest, die dem Element entspricht, dessen mediaType
application/vnd.ollama.image.model
ist, bezieht sich auf die GGUF -Datei des Modells.
Jedes SHA256-Digest wird auch als Dateiname im Verzeichnis ~/.ollama/models/blobs
verwendet (wenn Sie in diesem Verzeichnis nur diese SHA256-* Dateinamen sehen). Dies bedeutet, dass Sie Lamafile direkt ausführen können, indem Sie den SHA256 -Digest als Model -Dateiname bestehen. Wenn also das llama3:latest
GGUF-Datei Digest sha256-00e1317cbf74d901080d7100f57580ba8dd8de57203072dc6f668324ba545f29
ist, können Sie Llamafile wie folgt ausführen:
cd ~/.ollama/models/blobs
llamafile -m sha256-00e1317cbf74d901080d7100f57580ba8dd8de57203072dc6f668324ba545f29
Hier ist ein prägnanter Überblick über die Tricks, mit denen wir das fetteste ausführbare Format aller Zeiten erstellt haben. Die lange Geschichte ist Lamafile ist ein Shell -Skript, das sich selbst startet und in die Eingrenzung eingebetteter Gewichte in Millisekunden führt, ohne dass kopiert oder installiert werden muss. Was das möglich macht, ist mmap (). Sowohl das ausführbare Lama.CPP und die Gewichte werden auf das Shell -Skript verkettet. Anschließend wird ein winziges Lader -Programm vom Shell -Skript extrahiert, das die ausführbare Datei in den Speicher ordnet. Die ausführbare Datei llama.cpp öffnet dann das Shell -Skript erneut als Datei und ruft MMAP () erneut auf, um die Gewichte in den Speicher zu ziehen und sie sowohl für die CPU als auch für die GPU direkt zugänglich zu machen.
Der Trick, Gewichte in lama.cpp ausführbare Gewichte einzubetten, besteht darin, sicherzustellen, dass die lokale Datei an einer Seitengrenze ausgerichtet ist. Auf diese Weise können wir unter der Annahme, dass die ZIP -Datei unkomprimiert ist, sobald sie MMAP () 'D in den Speicher ist, wie Apple Metal direkt an GPUs übergeben, von denen die Daten die Seitengröße ausgerichtet sind. Da kein vorhandenes Zip -Archiving -Tool über ein Ausrichtungsflag verfügt, mussten wir etwa 500 Codezeilen schreiben, um die Zip -Dateien selbst einzufügen. Sobald jedoch jedes vorhandene ZIP -Programm sie lesen kann, sofern sie ZIP64 unterstützen. Dies macht die Gewichte viel leichter zugänglich als sie sonst gewesen wären, wenn wir unser eigenes Dateiformat für verkettete Dateien erfunden hätten.
Auf Intel und AMD -Mikroprozessoren verbringt Lama.cpp die meiste Zeit in den Matmul -Quants, die normalerweise dreimal für SSSE3, AVX und AVX2 geschrieben sind. Llamafile zieht jede dieser Funktionen in eine separate Datei aus, die mehrfach #include
ED mit variieren __attribute__((__target__("arch")))
Funktionattribute. Anschließend wird eine Wrapper -Funktion hinzugefügt, bei der Cosmopolitan X86_HAVE(FOO)
-Funktion verwendet wird, um die entsprechende Implementierung zu liefern.
Llamafile löst die Architektur -Portabilität durch Bauen von LLAMA.CPP zweimal: einmal für AMD64 und erneut für ARM64. Es wickelt sie dann mit einem Shell -Skript mit einem MZ -Präfix ein. Unter Windows wird es als native Binärdatum ausgeführt. Unter Linux extrahiert es eine kleine 8-KB-ausführbare Datei mit dem Namen APE Loader ${TMPDIR:-${HOME:-.}}/.ape
, der die binären Teile des Shell-Skripts in den Speicher zuordnen. Es ist möglich, diesen Prozess zu vermeiden, indem das assimilate
-Programm ausgeführt wird, das im cosmocc
-Compiler enthalten ist. Das assimilate
-Programm verwandelt das ausführbare Shell -Skript in das native ausführbare Format der Hostplattform. Dies garantiert einen Fallback -Pfad für traditionelle Freisetzungsprozesse, wenn er benötigt wird.
Cosmopolitan LIBC verwendet eine statische Verknüpfung, da dies der einzige Weg ist, um die gleiche ausführbare Datei zu erhalten, um auf sechs Osen auszuführen. Dies ist eine Herausforderung für lama.cpp, da es nicht möglich ist, die GPU -Unterstützung statisch zu verknüpfen. Die Art und Weise, wie wir dies lösen, durch Überprüfen, ob ein Compiler auf dem Hostsystem installiert ist. Für Apple wäre das Xcode, und für andere Plattformen wäre das nvcc
. LLAMA.CPP verfügt über eine einzige Datei-Implementierung jedes GPU-Moduls mit dem Namen ggml-metal.m
(objektiv C) und ggml-cuda.cu
(nvidia c). Llamafile bettet diese Quelldateien in das ZIP -Archiv ein und bittet den Plattform -Compiler, sie zur Laufzeit zu erstellen und auf die native GPU -Mikroarchitektur abzielt. Wenn es funktioniert, ist es mit der Plattform C Library dlopen () implementiert. Siehe llamafile/cuda.c und llamafile/metall.c.
Um die plattformspezifische DLOPen () -Funktion zu verwenden, müssen wir den plattformspezifischen Compiler bitten, eine kleine ausführbare Datei zu erstellen, die diese Schnittstellen enthüllt. Auf ELF -Plattformen ordnet Cosmopolitan LIBC diesen Helfer zusammen mit dem Elf -Interpreter der Plattform in den Speicher zu. Die Plattform C -Bibliothek kümmert sich dann um die Verknüpfung aller GPU -Bibliotheken und führt dann das Helfer -Programm aus, das LongJMP () in Cosmopolitan zurückbleibt. Das ausführbare Programm befindet sich jetzt in einem seltsamen Hybridzustand, in dem zwei separate C -Bibliotheken vorhanden sind, die unterschiedliche Abis haben. Beispielsweise funktioniert der lokale Speicher des Threads in jedem Betriebssystem unterschiedlich, und Programme stürzen zum Absturz, wenn das TLS -Register nicht auf den entsprechenden Speicher hinweist. Die Art und Weise, wie Cosmopolitan LIBC löst, ist, dass bei AMD SSE zur Neukompilierung der ausführbaren Datei zur Laufzeit verwendet wird, um %fs
-Register in %gs
zu wechseln, was eine Millisekunde dauert. Auf dem Arm verwendet COSMO das x28
-Register für TLS, das beim Kompilieren von GPU -Modulen durch das Übergeben des FLAGE -ffixed-x28
sichergestellt werden kann. Zuletzt verwendet Llamafile das Attribut __ms_abi__
, damit die Funktionszeiger zwischen der Anwendung und den GPU -Modulen über die Windows Calling Convention entsprechen. Erstaunlicherweise unterstützt jeder von uns getestete Compiler, einschließlich NVCC unter Linux und sogar Objective-C auf MacOS Als separate Datei für Windows neu kompiliert. Weitere Informationen finden Sie unter Cosmopolitan/dlopen.c.
Das Beispiel, das lamafiles oben bereitgestellt wurde, sollte nicht als Vermerke oder Empfehlungen bestimmter Modelle, Lizenzen oder Datensätze seitens von Mozilla interpretiert werden.
Llamafile fügt Lama.Cpp Pledge () und SecComp -Sandboxing hinzu. Dies ist standardmäßig aktiviert. Es kann ausgeschaltet werden, indem die Flagge --unsecure
Flagge bestanden hat. Sandboxing wird derzeit nur unter Linux und OpenBSD auf Systemen ohne GPUs unterstützt. Auf anderen Plattformen wird einfach eine Warnung protokolliert.
Unser Sicherheitsansatz hat diese Vorteile:
Nach dem Start kann Ihr HTTP -Server überhaupt nicht auf das Dateisystem zugreifen. Dies ist gut, da dies bedeutet, dass wenn jemand einen Fehler auf dem Lama.CPP -Server entdeckt, viel weniger wahrscheinlich ist, dass er auf vertrauliche Informationen auf Ihrem Computer zugreifen oder Änderungen an der Konfiguration vornehmen kann. Auf Linux können wir die Dinge noch weiter sandkasten. Der einzige netzwerkbezogene Systemaufruf des HTTP -Servers darf nach dem Start verwenden, ist Accept (). Dies schränkt die Fähigkeit eines Angreifers weiter ein, Informationen zu peeltrieren, falls Ihr HTTP -Server kompromittiert wird.
Der Hauptbefehl für CLI kann überhaupt nicht auf das Netzwerk zugreifen. Dies wird vom Kernel des Betriebssystems durchgesetzt. Es kann auch nicht in das Dateisystem schreiben. Dadurch ist Ihr Computer sicher, wenn ein Fehler im GGUF -Dateiformat jemals entdeckt wird, mit dem ein Angreifer böswillige Gewichtsdateien erstellt und online veröffentlichen kann. Die einzige Ausnahme von dieser Regel ist, wenn Sie das Flag --prompt-cache
Flag übergeben, ohne auch anzugeben --prompt-cache-ro
. In diesem Fall muss die Sicherheit derzeit geschwächt werden, um cpath
und wpath
-Zugriff zu ermöglichen. Der Netzwerkzugriff bleibt jedoch verboten.
Daher kann Ihr Lamafile sich vor der Außenwelt schützen, aber das bedeutet nicht, dass Sie vor Llamafile geschützt sind. Sandboxen ist selbst auferlegt. Wenn Sie Ihr Llamafile von einer nicht vertrauenswürdigen Quelle erhalten haben, hätte sein Autor sie einfach so modifiziert haben, dass sie dies nicht tun. In diesem Fall können Sie die nicht vertrauenswürdige Lamafile in einem anderen Sandkasten wie einer virtuellen Maschine ausführen, um sicherzustellen, dass sich es sich verhält, wie Sie es erwarten.
Während das Lamafile-Projekt Apache 2.0-Lizenzierung ist, sind unsere Änderungen an llama.cpp unter MIT (genau wie das Lama.CPP-Projekt selbst) lizenziert, um in Zukunft kompatibel und breitbar zu bleiben, falls dies gewünscht werden sollte.
Das Lamafile -Logo auf dieser Seite wurde mit Unterstützung von Dall · e 3 erzeugt.