Llamafile可讓您使用一個文件分發和運行LLM。 (公告博客文章)
我們的目標是使開發人員和最終用戶更容易訪問開放式LLM。我們是通過將Llama.CPP與Cosmopolitan Libc結合到一個框架中來做到這一點,該框架將LLMS的所有復雜性崩潰為單文件可執行文件(稱為“ Llamafile”),該可執行文件在大多數計算機上本地運行,沒有安裝。
Llamafile是Mozilla Builders項目。
自行嘗試的最簡單方法是下載我們的llamafile for Llava型號(許可證:Llama 2,OpenAI)。 Llava是一個新的LLM,不僅可以聊天,還可以做更多的事情。您還可以上傳圖像並詢問有關它們的問題。與Llamafile一起,這一切都在當地發生。沒有數據離開您的計算機。
下載llava-v1.5-7b-q4.llamafile(4.29 GB)。
打開計算機的終端。
如果您使用MacOS,Linux或BSD,則需要授予計算機的權限才能執行此新文件。 (您只需要一次這樣做。)
chmod +x llava-v1.5-7b-q4.llamafile
如果您在Windows上,請在末尾添加“ .exe”來重命名文件。
運行Llamafile。例如:
./llava-v1.5-7b-q4.llamafile
您的瀏覽器應自動打開並顯示聊天界面。 (如果沒有,只需打開瀏覽器並將其指向http:// localhost:8080)
聊天后,返回終端並點擊Control-C
以關閉Llamafile。
遇到麻煩?請參閱下面的“陷阱”部分。
當啟動LlamaFile時,除了在http://127.0.0.1:8080/舉辦Web UI聊天服務器外,還提供了OpenAI API兼容聊天完成點。它旨在以完全在本地運行的方式支持最常見的OpenAI API用例。我們還將其擴展到包括Llama.CPP的特定功能(例如Mirostat),也可以使用。有關可用哪些字段和端點的更多詳細信息,請參閱OpenAI文檔和Llamafile Server Readme。
使用API開始使用的最簡單方法是將以下捲曲命令複製到您的終端中。
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()
'
打印的響應看起來如下:
{
"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
}
}
如果您已經使用openai
Python軟件包開發了軟件(由OpenAi發布),則可以通過對base_url
和api_key
進行一些更改來移植應用程序與LlamaFile交談。此示例假設您已運行pip3 install openai
來安裝OpenAI的客戶端軟件,這是本示例所要求的。他們的軟件包只是圍繞OpenAI API接口的簡單python包裝器,可以由任何服務器實現。
#!/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 )
以上代碼將返回這樣的python對象:
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 )
我們還為其他型號提供了示例Llamafiles,因此您可以輕鬆地使用不同類型的LLM的Llamafile。
模型 | 尺寸 | 執照 | Llamafile | 其他念品 |
---|---|---|---|---|
Llama 3.2 3B指示 | 2.62 GB | 美洲駝3.2 | Llama-3.2-3B-Instruct.Q6_K.LlamaFile | 請參閱HF回購 |
Llama 3.2 1B指示 | 1.11 GB | 美洲駝3.2 | Llama-3.2-1b-Instruct.q6_k.llamafile | 請參閱HF回購 |
Gemma 2 2b指示 | 2.32 GB | Gemma 2 | gemma-2-2b-it.q6_k.llamafile | 請參閱HF回購 |
Gemma 2 9b指示 | 7.76 GB | Gemma 2 | gemma-2-9b-it.q6_k.llamafile | 請參閱HF回購 |
Gemma 2 27b指示 | 22.5 GB | Gemma 2 | gemma-2-27b-it.q6_k.llamafile | 請參閱HF回購 |
llava 1.5 | 3.97 GB | 美洲駝2 | llava-v1.5-7b-q4.llamafile | 請參閱HF回購 |
Tinyllama-1.1b | 2.05 GB | Apache 2.0 | tinyllama-1.1b-chat-v1.0.f16.llamafile | 請參閱HF回購 |
MISTRAL-7B教學 | 3.85 GB | Apache 2.0 | mistral-7b-instruct-v0.2.q4_0.llamafile | 請參閱HF回購 |
PHI-3-MINI-4K教學 | 7.67 GB | Apache 2.0 | phi-3-Mini-4K-Instruct.f16.llamafile | 請參閱HF回購 |
混合-8x7b教學 | 30.03 GB | Apache 2.0 | mixtral-8x7b-instruct-v0.1.q5_k_m.llamafile | 請參閱HF回購 |
wizardcoder-python-34b | 22.23 GB | 美洲駝2 | wizardcoder-python-34b-v1.0.q5_k_m.llamafile | 請參閱HF回購 |
WizardCoder-Python-13b | 7.33 GB | 美洲駝2 | wizardcoder-python-13B.llamafile | 請參閱HF回購 |
Llama-3-Instruct-70B | 37.25 GB | Llama3 | meta-llama-3-70b-instruct.q4_0.llamafile | 請參閱HF回購 |
Llama-3-Instruct-8B | 5.37 GB | Llama3 | meta-llama-3-8b-instruct.q5_k_m.llamafile | 請參閱HF回購 |
火箭3B | 1.89 GB | cc-by-sa-4.0 | Rocket-3B.Q5_K_M.LlamaFile | 請參閱HF回購 |
Olmo-7b | 5.68 GB | Apache 2.0 | OLMO-7B-0424.Q6_K.LLAMAFILE | 請參閱HF回購 |
文本嵌入模型 | ||||
e5-組7B教學 | 5.16 GB | 麻省理工學院 | e5-Mistral-7b-instruct-q5_k_m.llamafile | 請參閱HF回購 |
MXBAI插入大型V1 | 0.7 GB | Apache 2.0 | mxbai-embed-large-v1-f16.llamafile | 請參閱HF回購 |
這是Mistral命令行Llamafile的一個示例:
./mistral-7b-instruct-v0.2.Q5_K_M.llamafile --temp 0.7 -p ' [INST]Write a story about llamas[/INST] '
這是WizardCoder-Python命令行Llamafile的一個例子:
./wizardcoder-python-13b.llamafile --temp 0 -e -r ' ```n ' -p ' ```cnvoid *memcpy_sse2(char *dst, const char *src, size_t size) {n '
這是Llava命令行Llamafile的一個例子:
./llava-v1.5-7b-q4.llamafile --temp 0.2 --image lemurs.jpg -e -p ' ### User: What do you see?n### Assistant: '
與以前一樣,MacOS,Linux和BSD用戶將需要使用“ CHMOD”命令將執行權限授予文件,然後再運行這些LlamaFiles。
不幸的是,Windows用戶無法使用其中的許多示例LlamaFiles,因為Windows的最大可執行文件大小為4GB,並且所有這些示例都超過了該大小。 (llava llamafile在窗戶上起作用,因為它比尺寸限制的30MB害羞。)但是不要丟失:llamafile允許您使用外部權重;這在稍後在本文檔中進行了描述。
遇到麻煩?請參閱下面的“陷阱”部分。
Llamafile是可以在自己的計算機上運行的可執行LLM。它包含給定開放LLM的權重,以及實際運行該模型在計算機上所需的一切。沒有任何可以安裝或配置的(有幾個警告,在本文檔的後續部分中進行了討論)。
這都是通過將Llama.cpp與Cosmopolitan Libc相結合的,它提供了一些有用的功能:
Llamafiles可以在多個CPU微體系中運行。我們將運行時調度添加到Llama.cpp,該cpp允許新的英特爾系統使用現代CPU功能,而無需交易對舊計算機的支持。
Llamafiles可以在多個CPU架構上運行。我們通過將AMD64和ARM64的串聯構建來構建,以啟動合適的腳本來做到這一點。我們的文件格式與Win32和大多數Unix殼兼容。在需要時,它也可以輕鬆地(由您或您的用戶)轉換為平臺本地格式。
Llamafiles可以在六個OS(MacOS,Windows,Linux,FreeBSD,OpenBSD和NetBSD)上運行。如果您製作自己的Llama文件,則只需使用Linux式工具鏈即可構建一次代碼。我們提供的基於GCC的編譯器本身實際上是可攜帶的可執行文件,因此您可以從最喜歡開發的任何一個舒適度中為所有六個OS構建軟件。
LLM的權重可以嵌入在Llamafile中。我們在GGML庫中增加了對PKZIP的支持。這使得未壓縮的權重被直接映射到內存中,類似於自我提取的存檔。它使在線分發的量化權重可以與llama.cpp軟件的兼容版本進行前綴,從而確保可以無限期地複制其最初觀察到的行為。
最後,借助此項目中包含的工具,您可以使用所需的任何兼容模型權重創建自己的Llamafiles。然後,您可以將這些Llamafiles分發給其他人,無論他們使用哪種計算機,他們都可以輕鬆地使用他們。
即使我們的示例Llamafiles具有內置的權重,您也不必以這種方式使用Llamafile。相反,您可以從我們的版本頁面中僅下載Llamafile軟件(不包括任何權重)。然後,您可以將其與您可能擁有的任何外部權重一起使用。外部權重對Windows用戶特別有用,因為它們使您能夠圍繞Windows的4GB可執行文件大小限制工作。
對於Windows用戶,這是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用戶可能需要更改./llamafile.exe
為.llamafile.exe
。
在任何平台上,如果您的Llamafile過程立即被殺死,請檢查您是否有CrowdStrike,然後要求將其列入白色。
在使用Apple Silicon的MacOS上,您需要安裝Xcode命令行工具以使Llamafile能夠自行引導。
如果您使用ZSH並且難以運行Llamafile,請嘗試說sh -c ./llamafile
。這是由於ZSH 5.9+中修復的錯誤。 Python子subprocess
,舊版本的魚類等也是如此。
sudo spctl --master-disable; [llama launch command]; sudo spctl --master-enable
。這是因為--master-disable
禁用所有檢查,因此退出美洲駝後,您需要將其重新打開。在某些Linux系統上,您可能會遇到與run-detectors
或葡萄酒有關的錯誤。這是由於binfmt_misc
註冊。您可以通過為ape文件格式添加其他註冊來解決該問題:Llamafile用途:
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 "
如上所述,在Windows上,您可能需要通過將.exe
添加到文件名中來重命名LlamaFile。
同樣如上所述,Windows的最大文件尺寸限制為4GB,可固定物。 LLAVA服務器上面可執行文件僅限於該限制的30MB,因此它可以在Windows上使用,但是藉助WizardCoder 13B(例如WizardCoder 13B),您需要將權重存儲在單獨的文件中。上面提供了一個示例;請參閱“使用具有外部重量的Llamafile”。
在WSL上,有很多可能的陷阱。有助於完全解決他們的一件事是:
[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
將其放入/etc/systemd/system/cosmo-binfmt.service
中。
然後運行sudo systemctl enable cosmo-binfmt
。
有助於遇到問題的WSL用戶的另一件事是禁用Win32 Interop功能:
sudo sh -c " echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop "
如果獲得通過CLI禁用Interop的Permission Denied
,則可以通過在/etc/wsl.conf
中添加以下內容永久禁用。
[interop]
enabled=false
Llamafile支持以下操作系統,這些操作系統需要最低庫存安裝:
在Windows上,Llamafile作為本機便攜式可執行文件運行。在Unix系統上,LlamaFile將名為ape
的小型加載程序程序提取為$TMPDIR/.llamafile
或~/.ape-1.9
該程序用於將模型映射到內存中。
[1]應支持Darwin內核版本15.6+,但目前我們無法對此進行測試。
Llamafile支持以下CPU:
AMD64微處理器必須具有AVX。否則,Llamafile將打印錯誤並拒絕運行。這意味著,如果您擁有Intel CPU,則需要是Intel Core或更新的(大約2006+),並且如果您有AMD CPU,則需要是K8或更新(大約2003年)。如果您擁有較新的CPU,則對AVX512,AVX2,FMA,F16C和VNNI的支持將在運行時啟用。例如,ZEN4具有非常好的AVX512,可以加快BF16 Llamafiles。
ARM64微處理器必須具有ARMV8A+。這意味著從蘋果矽到64位的覆盆子PI,只要您的權重適合記憶,所有內容都將起作用。
Llamafile支持以下類型的GPU:
MacOS ARM64上的GPU通過使用Xcode命令行工具編譯小模塊來支持,該工具需要安裝。這是您第一次運行Llamafile時發生的一次費用。 Llamafile構建的DSO存儲在$TMPDIR/.llamafile
或$HOME/.llamafile
中。默認情況下,當存在金屬GPU時,將啟用到GPU。可以通過傳遞-ngl 0
或--gpu disable
迫使Llamafile執行CPU推理來禁用這。
NVIDIA和AMD圖形卡的所有者需要傳遞-ngl 999
標誌,以實現最大的卸載。如果存在多個GPU,則默認情況下將將工作均勻分配,因此您可以加載較大的模型。在AMD Radeon系統上可能會破壞多個GPU支持。如果這種情況發生在您身上,請使用export HIP_VISIBLE_DEVICES=0
迫使llamafile僅使用第一個GPU。
鼓勵Windows用戶使用我們的釋放二進製文件,因為它們包含用於NVIDIA和AMD圖形卡的預構建的DLL,這僅取決於正在安裝的圖形驅動程序。如果Llamafile檢測到安裝了NVIDIA的CUDA SDK或AMD的ROCM HIP SDK,則LlamaFile將嘗試構建使用Cublas或Rocblas的更快的DLL。為了使LlamaFile成功構建Cublas模塊,需要在X64 MSVC命令提示符下運行。您可以通過WSL通過WSL使用CUDA,在WSL上啟用NVIDIA CUDA並在WSL內部運行Llamafiles。使用WSL具有使您在Windows上運行大於4GB的LlamaFiles的額外好處。
在Linux上,NVIDIA用戶將需要安裝CUDA SDK(理想情況下使用Shell腳本安裝程序),ROCM用戶需要安裝HIP SDK。通過尋找nvcc
或hipcc
是否在路徑上,可以檢測到它們。
如果您的機器中同時具有AMD GPU和NVIDIA GPU,則可能需要通過通過--gpu amd
或--gpu nvidia
來限定要使用的gpu。
如果由於任何原因都無法彙編GPU支持並動態鏈接,Llamafile將落後於CPU推斷。
在Llamafile上開發需要現代版本的GNU make
Command(在某些系統上稱為gmake
), sha256sum
(否則將使用cc
來構建它), wget
(或curl
),並在https://cosmo.zip/上提供unzip
Pub/Cosmos/bin/。 Windows用戶也需要Cosmos Bash Shell。
make -j8
sudo make install PREFIX=/usr/local
以下是如何使用wizardcoder-python-13b權重來使用llama.cpp命令行接口為libc函數生成代碼的示例:
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 '
這是一個類似的例子,相反,將Mistral-7b-Instruct權重作為散文組成:
llamafile -ngl 9999
-m mistral-7b-instruct-v0.1.Q4_K_M.gguf
-p ' [INST]Write a story about llamas[/INST] '
這是如何將LlamaFile用作交互式聊天機器人的一個示例,該聊天機器人可以讓您查詢培訓數據中包含的知識:
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: '
這是一個示例,說明如何使用Llamafile總結HTML URL:
(
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
您可以使用Llamafile來描述JPG/PNG/GIF/BMP圖像:
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
可以使用BNF語法來強制執行輸出是可以預測的,並且可以安全地用於Shell腳本。最簡單的語法將是--grammar 'root ::= "yes" | "no"'
強迫LLM僅將標準輸出打印為"yesn"
或"non"
。另一個示例是,如果您想編寫腳本以重命名所有圖像文件,則可以說:
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
這是如何運行Llama.cpp內置的HTTP服務器的示例。此示例使用LLAVA V1.5-7B,這是一種多模式LLM,可與Llama.cpp最近添加的圖像輸入支持。
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
上面的命令將在您的個人計算機上啟動瀏覽器選項卡以顯示Web界面。它使您可以與LLM聊天並上傳圖像。
如果您想只說:
./llava.llamafile
...並讓它運行Web服務器而無需指定參數,然後您可以將權重和特殊.args
嵌入其中,其中指定默認參數。首先,讓我們創建一個名為.args
的文件,該文件具有此內容:
-m
llava-v1.5-7b-Q8_0.gguf
--mmproj
llava-v1.5-7b-mmproj-Q8_0.gguf
--host
0.0.0.0
-ngl
9999
...
如上所述,每行有一個參數。 ...
參數可選地指定要插入用戶傳遞的任何其他CLI參數的位置。接下來,我們將同時將權重和參數文件添加到可執行文件中:
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
恭喜。您剛剛製作了自己的LLM可執行文件,很容易與您的朋友分享。
與您的朋友分享Llamafile的一種好方法是將其發佈在擁抱的臉上。如果您這樣做,那麼建議您在擁抱的面孔中提及您在構建Llamafile時使用的llamafile版本或發布的版本。這樣,在線每個人都將能夠驗證其可執行內容的出處。如果您已更改Llama.cpp或Cosmopolitan源代碼,則Apache 2.0許可證需要您解釋什麼變化。您可以做到這一點的一種方法是使用zipalign
嵌入Llamafile中的通知,該通知描述了這些更改,並在擁抱的臉上提及它。
運行sudo make install
時,安裝了每個Llamafile程序的手冊頁面。命令手冊也作為PDF文件排版,您可以從我們的GitHub版本頁面下載。最後,大多數命令在傳遞--help
標誌時會顯示該信息。
本節回答了一個問題:“我已經有一個由應用程序x本地下載的模型,我可以與llamafile一起使用嗎?” 。一般的答案是“是的,只要這些模型以GGUF格式存儲”,但是根據應用程序,其實現或多或少可能是駭客的。下面有一些示例(在Mac上進行了測試)。
LM Studio商店以~/.cache/lm-studio/models
下載的模型,在具有相同名稱的模型名稱的子目錄中(遵循huggingface的account_name/model_name
格式),當您選擇下載文件時看到的同一文件名。
因此,如果您已下載了thebloke/ llama-2-7b.Q2_K.gguf
TheBloke/Llama-2-7B-GGUF
2-7B.Q2_K.GGUF文件,則可以按照以下方式運行llamafile:
cd ~/.cache/lm-studio/models/TheBloke/Llama-2-7B-GGUF
llamafile -m llama-2-7b.Q2_K.gguf
當您使用Ollama下載新模型時,其所有元數據將存儲在~/.ollama/models/manifests/registry.ollama.ai/library/
的清單文件中。目錄和清單文件名是ollama list
返回的模型名稱。例如,對於llama3:latest
清單文件將命名為.ollama/models/manifests/registry.ollama.ai/library/llama3/latest
。
清單將與模型相關的每個文件(例如GGGUF權重,許可證,提示模板等)映射到SHA256 Digest。與介體為application/vnd.ollama.image.model
的mediaType
相對應的摘要是指模型的GGEF文件的元素。
每種SHA256摘要也都用作~/.ollama/models/blobs
目錄中的文件名(如果您查看該目錄,則只會看到這些SHA256-*文件名)。這意味著您可以通過將SHA256 Digest作為模型文件名直接運行Llamafile。因此,如果例如llama3:latest
gguf文件摘要是sha256-00e1317cbf74d901080d7100f57580ba8dd8de57203072dc6f668324ba545f29
cd ~/.ollama/models/blobs
llamafile -m sha256-00e1317cbf74d901080d7100f57580ba8dd8de57203072dc6f668324ba545f29
這是我們用來創建有史以來最胖的可執行格式的技巧的簡潔概述。長話短說是Llamafile是一個Shell腳本,它可以啟動自己,並在毫秒中以毫秒為單位的嵌入重量進行推斷,而無需複製或安裝。這使得可能是mmap()。 Llama.cpp可執行文件和權重都串聯到Shell腳本上。然後通過Shell腳本提取一個小型加載程序程序,該程序將可執行文件映射到內存中。然後,Llama.cpp可執行文件然後再次打開shell腳本作為文件,然後再次調用mmap()將權重拉到內存中,並使CPU和GPU都可以直接訪問它們。
嵌入Llama.cpp可執行文件中的權重的訣竅是確保將本地文件對齊在頁面大小邊界上。這樣一來,假設ZIP文件是未壓縮的,一旦它是mmap()d進入內存,我們就可以將指針直接傳遞給GPU,例如Apple Metal,這要求將數據頁面大小對齊。由於沒有現有的ZIP歸檔工具具有對齊標誌,因此我們不得不編寫大約500行代碼以自己插入ZIP文件。但是,一旦到達那裡,每個現有的ZIP程序都應該能夠閱讀它們,只要它們支持Zip64。如果我們為串聯文件發明了自己的文件格式,這使權重比其他原本要容易得多。
在英特爾和AMD微處理器上,Llama.cpp大部分時間都花在矩陣量子上,這些時間通常是為SSSE3,AVX和AVX2寫的三次。 llamafile將這些功能中的每一個都拉到一個可以多次#include
ed的單獨文件中,而不同的__attribute__((__target__("arch")))
功能屬性。然後,添加了包裝器函數,該功能使用Cosmopolitan的X86_HAVE(FOO)
功能來運行時調度到適當的實現。
Llamafile通過構建Llama.CPP兩次來解決建築可移植性:一次用於AMD64,再次用於ARM64。然後,它用具有MZ前綴的Shell腳本包裹它們。在Windows上,它將作為本機二進制運行。在Linux上,它將將一個小的8KB可執行文件提取為${TMPDIR:-${HOME:-.}}/.ape
,將shell腳本的二進制部分映射到內存中。可以通過運行cosmocc
編譯器包含的assimilate
程序來避免此過程。 assimilate
程序的作用是將shell腳本可執行文件變成主機平台的本機可執行格式。這樣可以保證在需要時傳統發行過程中存在後備路徑。
Cosmopolitan Libc使用靜態鏈接,因為這是獲得六個OS運行的相同可執行文件的唯一方法。這給Llama.cpp帶來了一個挑戰,因為不可能靜態地鏈接GPU支持。我們解決的方法是檢查主機系統上是否安裝了編譯器。對於Apple來說,這是Xcode,對於其他平台,那就是nvcc
。 Llama.cpp具有每個GPU模塊的單個文件實現,稱為ggml-metal.m
(Objective C)和ggml-cuda.cu
(NVIDIA C)。 Llamafile將這些源文件嵌入ZIP檔案中,並要求平台編譯器在運行時構建它們,以針對本機GPU微體系結構。如果有效,則將其與平台C庫dlopen()實現相關。參見Llamafile/Cuda.c和Llamafile/Metal.C。
為了使用平台特定的dlopen()函數,我們需要要求平台特定的編譯器構建一個揭示這些接口的小型可執行文件。在Elf平台上,Cosmopolitan Libc與平台的Elf解釋器一起將此助手的執行力映射到內存中。然後,平台C庫會處理鏈接所有GPU庫,然後運行LongJMP()回到國際化的幫助程序。可執行程序現在處於一個怪異的混合狀態,其中存在兩個單獨的C庫,它們具有不同的ABIS。例如,線程本地存儲在每個操作系統上的工作方式有所不同,如果TLS寄存器不指向適當的內存,則程序將崩潰。 Cosmopolitan Libc在AMD上解決的方式是使用SSE在運行時重新編譯可執行文件以更改%fs
寄存器訪問的%gs
,從而佔用了毫秒。在手臂上,Cosmo使用x28
寄存器進行TLS,在編譯GPU模塊時,可以通過傳遞-ffixed-x28
標誌來安全。最後,LlamaFile使用__ms_abi__
屬性,以便在應用程序和GPU模塊之間傳遞的功能指針符合Windows調用約定。令人驚訝的是,我們測試過的每個編譯器,包括Linux上的NVCC,甚至是MacOS上的Objective-C,所有支持彙編Win32樣式功能,從而確保您的llamafile能夠在Windows驅動程序上運行,而無需成為Windows驅動程序時重新編譯為Windows的單獨文件。有關更多詳細信息,請參見Cosmopolitan/Dlopen.c。
上面提供的Llamafiles示例不應解釋為Mozilla的特定模型,許可或數據集的認可或建議。
Llamafile向Llama.cpp添加了Premed()和Seccomp沙盒。默認情況下啟用了這一點。可以通過傳遞--unsecure
標誌來關閉它。當前僅在沒有GPU的系統上的Linux和OpenBSD上支持沙箱。在其他平台上,它將簡單地記錄警告。
我們的安全方法具有這些好處:
啟動後,您的HTTP服務器根本無法訪問文件系統。這很好,因為這意味著如果有人在Llama.cpp服務器中發現一個錯誤,那麼他們就可以在計算機上訪問敏感信息或更改其配置的可能性要小得多。在Linux上,我們能夠進一步打磨東西。唯一與網絡相關的系統調用HTTP服務器啟動後將允許使用HTTP服務器,為()。如果您的HTTP服務器受到損害,這進一步限制了攻擊者剝落信息的能力。
主CLI命令根本無法訪問網絡。這是由操作系統內核執行的。它也無法寫入文件系統。如果曾經以GGGUF文件格式發現錯誤,則可以確保您的計算機安全,該錯誤使攻擊者可以製作惡意權重文件並在線發布。此規則的唯一例外是,如果您通過--prompt-cache
Flag而不指定--prompt-cache-ro
。在這種情況下,目前需要削弱安全性以允許cpath
和wpath
訪問,但是網絡訪問將仍然禁止。
因此,您的Llamafile能夠保護自己免受外界的侵害,但這並不意味著您不受Llamafile的保護。沙箱是自我強制的。如果您從不受信任的來源獲得了Llamafile,那麼它的作者本可以簡單地修改它以免這樣做。在這種情況下,您可以在另一個沙箱(例如虛擬機)內運行不受信任的Llamafile,以確保其行為自己的期望。
儘管Llamafile項目是Apache 2.0許可的,但我們對Llama.cpp的更改是在MIT下獲得許可的(就像Llama.CPP項目本身一樣),以便將來保持兼容和上游,如果需要的話。
此頁面上的Llamafile徽標是在Dall·E 3的幫助下生成的。