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的帮助下生成的。