llamafile을 사용하면 단일 파일로 LLM을 배포하고 실행할 수 있습니다. (발표 블로그 게시물)
우리의 목표는 개발자와 최종 사용자 모두가 개방형 LLM에 훨씬 더 액세스 할 수 있도록하는 것입니다. 우리는 LLAMA.CPP와 Cosmopolitan LIBC를 하나의 프레임 워크로 결합하여 LLM의 모든 복잡성을 단일 파일 실행 파일 ( "llamafile"이라고 함)으로하여 대부분의 컴퓨터에서 로컬로 실행되는 설치없이.
Llamafile은 Mozilla Builders 프로젝트입니다.
직접 시도하는 가장 쉬운 방법은 Llava 모델 (라이센스 : Llama 2, OpenAi)을 위해 Llamafile 예제를 다운로드하는 것입니다. Llava는 단순한 채팅 이상을 수행 할 수있는 새로운 LLM입니다. 이미지를 업로드하고 그에 대한 질문을 할 수도 있습니다. llamafile을 사용하면이 모든 것이 현지에서 발생합니다. 데이터는 컴퓨터를 떠나지 않습니다.
llava-v1.5-7b-q4.llamafile (4.29GB)을 다운로드하십시오.
컴퓨터의 터미널을 엽니 다.
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을 종료하십시오.
문제가 있습니까? 아래의 "gotchas"섹션을 참조하십시오.
llamafile이 시작되면 http://127.0.0.1:8080/에서 웹 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과 대화하도록 앱을 설치할 수 있어야합니다. 이 예제에서는 OpenAI의 클라이언트 소프트웨어를 설치하기 위해 pip3 install openai
실행한다고 가정합니다. 그들의 패키지는 OpenAI API 인터페이스 주변의 간단한 파이썬 래퍼이며 모든 서버에서 구현할 수 있습니다.
#!/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 )
위의 코드는 다음과 같은 파이썬 객체를 반환합니다.
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 | 다른 quants |
---|---|---|---|---|
Llama 3.2 3B 지시 | 2.62GB | 라마 3.2 | llama-3.2-3b-instruct.q6_k.llamafile | HF Repo를 참조하십시오 |
llama 3.2 1b 지시 | 1.11 GB | 라마 3.2 | llama-3.2-1b-instruct.q6_k.llamafile | HF Repo를 참조하십시오 |
Gemma 2 2B 지시 | 2.32GB | 젬마 2 | 젬마 -2-2b-it.q6_k.llamafile | HF Repo를 참조하십시오 |
Gemma 2 9B 지시 | 7.76 GB | 젬마 2 | 젬마 -2-9B-IT.q6_k.llamafile | HF Repo를 참조하십시오 |
Gemma 2 27b 지시 | 22.5GB | 젬마 2 | 젬마 -2-27b-it.q6_k.llamafile | HF Repo를 참조하십시오 |
llava 1.5 | 3.97 GB | 라마 2 | llava-v1.5-7b-q4.llamafile | HF Repo를 참조하십시오 |
Tinyllama-1.1b | 2.05GB | 아파치 2.0 | Tinyllama-1.1B-Chat-V1.0.f16.llamafile | HF Repo를 참조하십시오 |
Mistral-7B- 비축 | 3.85GB | 아파치 2.0 | mistral-7b-instruct-v0.2.q4_0.llamafile | HF Repo를 참조하십시오 |
PHI-3-MINI-4K-비 구조 | 7.67 GB | 아파치 2.0 | PHI-3-MINI-4K-Instruct.f16.llamafile | HF Repo를 참조하십시오 |
Mixtral-8x7b- 비축 | 30.03 GB | 아파치 2.0 | mixtral-8x7b-instruct-v0.1.q5_k_m.llamafile | HF Repo를 참조하십시오 |
WizardCoder-Python-34B | 22.23GB | 라마 2 | WizardCoder-Python-34B-V1.0.Q5_K_M.LlamaFile | HF Repo를 참조하십시오 |
WizardCoder-Python-13B | 7.33 GB | 라마 2 | WizardCoder-Python-13B.llamafile | HF Repo를 참조하십시오 |
LLAMA-3- 강조 -70B | 37.25GB | llama3 | 메타 롤라마 -3-70b-비 구역 Q4_0.llamafile | HF Repo를 참조하십시오 |
LLAMA-3- 강조 -8b | 5.37 GB | llama3 | Meta-Llama-3-8B-Instruct.q5_k_m.llamafile | HF Repo를 참조하십시오 |
로켓 -3B | 1.89GB | CC-BY-SA-4.0 | 로켓 -3B.Q5_K_M.LLAMAFILE | HF Repo를 참조하십시오 |
olmo-7b | 5.68GB | 아파치 2.0 | olmo-7b-0424.q6_k.llamafile | HF Repo를 참조하십시오 |
텍스트 임베딩 모델 | ||||
e5-mistral-7b-비 구조 | 5.16 GB | MIT | E5-MISTRAL-7B-Instruct-Q5_K_M.LlamaFile | HF Repo를 참조하십시오 |
MXBAI- 엠 베드-래지 -V1 | 0.7GB | 아파치 2.0 | mxbai- 엠 베르지 -V1-f16.llamafile | HF Repo를 참조하십시오 |
다음은 Mistral Command-line llamafile의 예입니다.
./mistral-7b-instruct-v0.2.Q5_K_M.llamafile --temp 0.7 -p ' [INST]Write a story about llamas[/INST] '
다음은 WizardCoder-Python Command-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는 Windows의 최대 실행 파일 크기가 4GB이며 이러한 모든 예제가 그 크기를 초과하기 때문에이 예제 LlamaFiles를 많이 사용할 수 없습니다. (llava llamafile은 크기 제한의 30MB 수줍음이기 때문에 Windows에서 작동합니다.) 그러나 심장을 잃지 마십시오 : llamafile은 외부 무게를 사용할 수 있습니다. 이것은이 문서의 뒷부분에 설명되어 있습니다.
문제가 있습니까? 아래의 "gotchas"섹션을 참조하십시오.
llamafile은 자신의 컴퓨터에서 실행할 수있는 실행 파일 LLM입니다. 주어진 오픈 LLM의 가중치와 컴퓨터에서 해당 모델을 실제로 실행하는 데 필요한 모든 것이 포함되어 있습니다. 설치하거나 구성 할 것이 없습니다 (이 문서의 후속 섹션에서 논의 된 몇 가지 경고 포함).
이것은 모두 Llama.cpp와 Cosmopolitan LIBC를 결합하여 유용한 기능을 제공함으로써 달성됩니다.
llamafiles는 여러 CPU 미세 구조에서 실행할 수 있습니다. 우리는 LLAMA.CPP에 런타임 디스패치를 추가하여 새로운 인텔 시스템이 이전 컴퓨터에 대한 지원을 할 수없는 최신 CPU 기능을 사용할 수 있도록했습니다.
llamafiles는 여러 CPU 아키텍처에서 실행할 수 있습니다. 우리는 AMD64 및 ARM64 빌드를 적절한 스크립트를 시작하는 쉘 스크립트로 연결하여 그렇게합니다. 당사의 파일 형식은 Win32 및 대부분의 Unix 쉘과 호환됩니다. 또한 필요할 때마다 플랫폼 네이티브 형식으로 쉽게 변환 할 수 있습니다.
llamafiles는 6 개의 OS (MacOS, Windows, Linux, FreeBSD, OpenBSD 및 NetBSD)에서 실행할 수 있습니다. 자신만의 llama 파일을 만드는 경우 Linux 스타일의 도구 체인을 사용하여 코드를 한 번만 빌드하면됩니다. 우리가 제공하는 GCC 기반 컴파일러 자체는 실제로 휴대용 실행 파일이므로 개발을 위해 가장 선호하는 편안함에서 6 개의 OS에 대한 소프트웨어를 모두 구축 할 수 있습니다.
LLM의 무게는 llamafile 내에 내장 될 수 있습니다. GGML 라이브러리에 PKZIP에 대한 지원을 추가했습니다. 이를 통해 자체 추출 아카이브와 유사하게 압축되지 않은 가중치를 메모리에 직접 매핑 할 수 있습니다. 이를 통해 온라인으로 배포 된 양자형 가중치는 LLAMA.CPP 소프트웨어의 호환 가능한 버전으로 접두사를 만들 수 있으므로 원래 관찰 된 동작을 무기한으로 재현 할 수 있습니다.
마지막으로,이 프로젝트에 포함 된 도구를 사용하면 원하는 호환 모델 가중치를 사용하여 자신만의 llamafiles를 만들 수 있습니다. 그런 다음이 llamafiles를 다른 사람들에게 배포 할 수 있습니다. 다른 사람들에게 어떤 종류의 컴퓨터에 관계없이 쉽게 사용할 수 있습니다.
우리의 예제 llamafiles에는 무게가 내장되어 있지만 Llamafile을 그렇게 사용할 필요는 없습니다. 대신 릴리스 페이지에서 llamafile 소프트웨어 (무게 포함없이) 만 다운로드 할 수 있습니다. 그런 다음 손에 가질 수있는 외부 무게와 함께 사용할 수 있습니다. 외부 가중치는 Windows의 4GB 실행 파일 크기 제한에서 작업 할 수 있기 때문에 Windows 사용자에게 특히 유용합니다.
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 프로세스가 즉시 죽임을당하는 경우 크라우드 스트라이크가 있는지 확인한 다음 화이트리스트를 요청하십시오.
Apple Silicon이있는 MacOS에서는 llamafile을 위해 Xcode 명령 줄 도구를 설치하여 자체적으로 부트 스트랩을 할 수 있어야합니다.
zsh를 사용하고 llamafile을 실행하는 데 어려움이있는 경우 sh -c ./llamafile
이라고 말하십시오. 이것은 ZSH 5.9+에서 고정 된 버그 때문입니다. 파이썬 subprocess
, 오래된 버전의 물고기 등의 경우도 마찬가지입니다.
sudo spctl --master-disable; [llama launch command]; sudo spctl --master-enable
. --master-disable
것은 모든 점검을 비활성화하기 때문에 라마를 종료 한 후 다시 켜야합니다. 일부 Linux 시스템에서는 run-detectors
또는 와인과 관련된 오류가 발생할 수 있습니다. 이것은 binfmt_misc
등록 때문입니다. Llamafile이 사용하는 APE 파일 형식에 대한 추가 등록을 추가하여이를 고칠 수 있습니다.
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에서 filename에 .exe
추가하여 llamafile의 이름을 바꿔야 할 수도 있습니다.
또한 위에서 언급했듯이 Windows는 실행 파일에 대해 최대 파일 크기 제한 4GB입니다. 위의 LLAVA 서버 실행 파일은 해당 한도의 30MB 수줍음이므로 Windows에서 작동하지만 WizardCoder 13B와 같은 더 큰 모델을 사용하면 가중치를 별도의 파일에 저장해야합니다. 위에 예제가 제공됩니다. "외부 무게와 함께 llamafile 사용"을 참조하십시오.
WSL에는 가능한 많은 gotchas가 있습니다. 그것들을 완전히 해결하는 데 도움이되는 한 가지는 다음과 같습니다.
[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 Kernel 버전 15.6+가 지원 되어야 하지만 현재 테스트 할 방법이 없습니다.
llamafile은 다음 CPU를 지원합니다.
AMD64 마이크로 프로세서에는 AVX가 있어야합니다. 그렇지 않으면 llamafile은 오류를 인쇄하고 실행을 거부합니다. 즉, 인텔 CPU가있는 경우 인텔 코어 또는 최신 (2006 년경)이어야하며 AMD CPU가있는 경우 K8 또는 새로운 (2003 년경) 여야합니다. AVX512, AVX2, FMA, F16C 및 VNNI에 대한 지원은 최신 CPU가있는 경우 런타임에 조건부로 활성화됩니다. 예를 들어, Zen4는 BF16 llamafiles 속도를 높일 수있는 매우 우수한 AVX512를 가지고 있습니다.
ARM64 마이크로 프로세서에는 ARMV8A+가 있어야합니다. 이는 Apple Silicon에서 64 비트 라즈베리 PI에 이르기까지 모든 것이 작동한다는 것을 의미합니다.
llamafile은 다음 종류의 GPU를 지원합니다.
MacOS ARM64의 GPU는 설치 해야하는 Xcode 명령 줄 도구를 사용하여 작은 모듈을 컴파일하여 지원됩니다. 처음으로 llamafile을 실행할 때 발생하는 한 번의 비용입니다. llamafile에 의해 구축 된 DSO는 $TMPDIR/.llamafile
또는 $HOME/.llamafile
에 저장됩니다. 금속 GPU가있을 때 GPU에 오프로드가 기본적으로 활성화됩니다. 이는 llamafile이 CPU 추론을 수행하도록 강제로 -ngl 0
또는 --gpu disable
전달함으로써 비활성화 될 수 있습니다.
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에서 nvidia cuda를 활성화하고 WSL 내에서 llamafiles를 실행하여 WSL을 통해 CUDA를 사용할 수 있습니다. WSL을 사용하면 Windows에서 4GB보다 큰 llamafiles를 실행할 수있는 추가 이점이 있습니다.
Linux에서는 NVIDIA 사용자가 CUDA SDK (Shell Script Installer를 사용하여 이상적으로 사용)를 설치해야하며 ROCM 사용자는 HIP SDK를 설치해야합니다. 그들은 nvcc
또는 hipcc
가 경로에 있는지 확인하여 감지됩니다.
컴퓨터에 AMD GPU 와 NVIDIA GPU가있는 경우 --gpu amd
또는 --gpu nvidia
통과시켜 사용하려는 어떤 자격을 갖추어야 할 수도 있습니다.
GPU 지원을 어떤 이유로 든 편집하고 동적으로 연결할 수없는 경우 Llamafile은 CPU 추론으로 돌아갑니다.
llamafile에서 개발하려면 GNU make
Command (일부 시스템에서 gmake
라고 함), sha256sum
(그렇지 않으면 cc
구축하는 데 사용됩니다), wget
(또는 curl
) 및 https://cosmo.zip/에서 사용할 수있는 unzip
의 최신 버전이 필요합니다. 펍/코스모스/빈/. 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 비 구조 가중치를 사용하는 유사한 예입니다.
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 문법을 사용하여 출력을 시행하는 것이 예측 가능하고 쉘 스크립트에서 사용하기에 안전합니다. 가장 간단한 문법은 --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 서버를 실행하는 방법의 예입니다. 이 예제는 LLAMA.CPP의 최근 이미지 입력 지원 지원과 함께 작동하는 멀티 모달 LLM 인 LLAVA V1.5-7B를 사용합니다.
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
위의 명령은 개인 컴퓨터에서 브라우저 탭을 시작하여 웹 인터페이스를 표시합니다. LLM과 채팅하고 이미지를 업로드 할 수 있습니다.
당신이 말할 수 있다면 :
./llava.llamafile
... 그리고 인수를 지정하지 않고 웹 서버를 실행하도록하면 기본 인수를 지정하는 가중치와 특수 .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을 친구들과 공유하는 좋은 방법 중 하나는 포옹 얼굴에 게시하는 것입니다. 그렇게한다면, Hugging Face에서 Llamafile을 만들 때 사용한 Llamafile 버전의 Git 개정판 또는 릴리스 버전에 대해 언급하는 것이 좋습니다. 이렇게하면 온라인 온라인 모든 사람이 실행 가능한 콘텐츠의 출처를 확인할 수 있습니다. LLAMA.CPP 또는 Cosmopolitan 소스 코드를 변경 한 경우 Apache 2.0 라이센스를 사용하면 변경 사항을 설명해야합니다. 당신이 할 수있는 한 가지 방법은 변경 사항을 설명하는 zipalign
사용하여 llamafile에 통지를 내리고 포옹 얼굴 커밋에 언급하는 것입니다.
sudo make install
실행할 때 설치된 각 llamafile 프로그램에 대한 수동 페이지가 있습니다. 명령 매뉴얼은 GitHub 릴리스 페이지에서 다운로드 할 수있는 PDF 파일로서 조판입니다. 마지막으로, 대부분의 명령은 --help
플래그를 전달할 때 해당 정보를 표시합니다.
이 섹션에서는 "응용 프로그램 X가 로컬로 다운로드 한 모델이 이미 있습니다. llamafile과 함께 사용할 수 있습니까?" . 일반적인 대답은 "예, 이러한 모델이 GGUF 형식으로 로컬로 저장되어있는 한"이지만 응용 프로그램에 따라 구현이 다소 해킹 될 수 있습니다. 몇 가지 예 (Mac에서 테스트)가 따릅니다.
LM Studio는 파일을 다운로드하기로 선택한 것과 동일한 파일 이름을 사용하여 모델과 동일한 모델 (Huggingface의 account_name/model_name
형식에 따른 다음)의 하위 디렉토리에서 ~/.cache/lm-studio/models
에서 모델을 다운로드했습니다.
따라서 TheBloke/Llama-2-7B-GGUF
용 llama-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
의 경우, Manifest 파일은 .ollama/models/manifests/registry.ollama.ai/library/llama3/latest
로 명명됩니다.
매니페스트는 모델 (예 : GGUF 가중치, 라이센스, 프롬프트 템플릿 등)과 관련된 각 파일을 SHA256 다이제스트에 매핑합니다. mediaType
가 application/vnd.ollama.image.model
인 요소에 해당하는 다이제스트는 Model의 GGUF 파일을 참조하는 것입니다.
각 SHA256 다이제스트는 ~/.ollama/models/blobs
디렉토리의 파일 이름으로도 사용됩니다 (해당 디렉토리를 살펴보면 SHA256-* Filename 만 볼 수 있음). 즉, SHA256 다이제스트를 모델 파일 이름으로 전달하여 Llamafile을 직접 실행할 수 있습니다. 따라서 llama3:latest
GGUF 파일 다이제스트는 sha256-00e1317cbf74d901080d7100f57580ba8dd8de57203072dc6f668324ba545f29
입니다.
cd ~/.ollama/models/blobs
llamafile -m sha256-00e1317cbf74d901080d7100f57580ba8dd8de57203072dc6f668324ba545f29
다음은 가장 뚱뚱한 실행 형식을 만드는 데 사용한 트릭에 대한 간결한 개요입니다. 짧은 이야기는 llamafile입니다. Llamafile은 스스로를 시작하고 복사하거나 설치할 필요없이 밀리 초의 임베디드 가중치에 대한 추론을 실행하는 쉘 스크립트입니다. 이를 가능하게하는 것은 mmap ()입니다. llama.cpp 실행 파일과 가중치는 모두 쉘 스크립트에 연결됩니다. 그런 다음 작은 로더 프로그램을 쉘 스크립트로 추출하여 실행 파일을 메모리에 매핑합니다. LLAMA.CPP 실행 파일은 파일로 쉘 스크립트를 다시 엽니 다. 그리고 MMAP ()을 다시 호출하여 가중치를 메모리로 끌어 당겨 CPU와 GPU에 직접 액세스 할 수있게한다.
llama.cpp 실행 파일 내부에 가중치를 포함시키는 요령은 로컬 파일이 페이지 크기 경계에 정렬되도록하는 것입니다. 이렇게하면 zip 파일이 압축되지 않았다고 가정하면 MMAP () ''D 메모리에 메모리에 표시되면 Apple Metal과 같은 GPU에 직접 포인터를 전달할 수 있습니다. 기존 Zip 아카이빙 도구에는 정렬 플래그가 없으므로 Zip 파일을 직접 삽입하기 위해 약 500 줄의 코드를 작성해야했습니다. 그러나 일단 거기에 있으면 모든 기존 지퍼 프로그램은 ZIP64를 지원하는 경우 읽을 수 있어야합니다. 이것은 우리가 연결된 파일에 대한 우리 자신의 파일 형식을 발명했다면 가중치에 더 쉽게 액세스 할 수있게합니다.
Intel 및 AMD 마이크로 프로세서에서 LLAMA.CPP는 대부분 SSSE3, AVX 및 AVX2에 대해 세 번 쓰여진 Matmul Quants에서 대부분의 시간을 보냅니다. llamafile은 이러한 각 함수를 여러 번 #인트를 여러 번 공개 할 수있는 별도의 파일로 끌어 당기고 __attribute__((__target__("arch")))
함수 속성을 사용하여 #include
를 여러 번 가져옵니다. 그런 다음 Cosmopolitan의 X86_HAVE(FOO)
기능을 사용하여 적절한 구현으로 런타임 디스패치를 사용하는 래퍼 함수가 추가됩니다.
Llamafile은 llama.cpp를 두 번 구축하여 아키텍처 포괄 성을 해결합니다. AMD64의 경우 1 회, ARM64의 경우 다시. 그런 다음 MZ Prefix가있는 쉘 스크립트로 랩핑합니다. Windows에서는 기본 바이너리로 실행됩니다. Linux에서는 Ape 로더라는 작은 8kb 실행 파일을 ${TMPDIR:-${HOME:-.}}/.ape
로 추출하여 쉘 스크립트의 이진 부분을 메모리에 매핑합니다. cosmocc
컴파일러에 포함 된 assimilate
프로그램을 실행 하여이 프로세스를 피할 수 있습니다. assimilate
프로그램이하는 일은 쉘 스크립트 실행 파일을 호스트 플랫폼의 기본 실행 파일 형식으로 바꾸는 것입니다. 이는 필요할 때 전통적인 릴리스 프로세스에 대한 폴백 경로가 존재 함을 보장합니다.
Cosmopolitan LIBC는 정적 링크를 사용합니다. 6 개의 OS에서 동일한 실행 파일을 실행할 수있는 유일한 방법이기 때문입니다. 이는 GPU 지원을 정적으로 연결할 수 없기 때문에 LLAMA.CPP에 도전을 제시합니다. 우리가 해결하는 방식은 컴파일러가 호스트 시스템에 설치되어 있는지 확인하는 것입니다. Apple의 경우 Xcode이고 다른 플랫폼의 경우 nvcc
입니다. LLAMA.CPP는 ggml-metal.m
(Objective C) 및 ggml-cuda.cu
(NVIDIA C)라는 각 GPU 모듈의 단일 파일 구현을 가지고 있습니다. llamafile은 Zip 아카이브에 해당 소스 파일을 포함시키고 플랫폼 컴파일러에게 런타임에이를 빌드하여 기본 GPU Microarchitecture를 대상으로합니다. 작동하면 플랫폼 C 라이브러리 Dlopen () 구현과 연결됩니다. llamafile/cuda.c 및 llamafile/metal.c를 참조하십시오.
플랫폼 별 dlopen () 함수를 사용하려면 플랫폼 별 컴파일러에게 이러한 인터페이스를 노출시키는 작은 실행 파일을 구축하도록 요청해야합니다. ELF 플랫폼에서 Cosmopolitan LIBC는이 헬퍼 실행 파일을 플랫폼의 ELF 통역사와 함께 메모리에 매핑합니다. 그런 다음 플랫폼 C 라이브러리는 모든 GPU 라이브러리를 연결 한 다음 Longjmp ()가 코스모 폴리탄으로 돌아가는 도우미 프로그램을 실행합니다. 실행 프로그램은 이제 다른 ABI를 갖는 두 개의 별도 C 라이브러리가 존재하는 이상한 하이브리드 상태에 있습니다. 예를 들어, 스레드 로컬 스토리지는 각 운영 체제마다 다르게 작동하며 TLS 레지스터가 적절한 메모리를 가리키지 않으면 프로그램이 중단됩니다. Cosmopolitan LIBC가 AMD를 해결하는 방식은 SSE를 사용하여 런타임에 실행 파일을 다시 컴파일하여 %fs
레지스터 액세스를 %gs
로 변경하여 밀리 초를 차지하는 것입니다. ARM에서 Cosmo는 GPU 모듈을 컴파일 할 때 -ffixed-x28
플래그를 전달하여 안전하게 만들 수있는 TLS에 x28
레지스터를 사용합니다. 마지막으로, llamafile은 __ms_abi__
속성을 사용하여 기능 포인터가 응용 프로그램과 GPU 모듈 사이에 전달되는 Windows 호출 규칙을 준수하도록합니다. 놀랍게도, Linux의 NVCC 및 MACOS의 Objective-C를 포함하여 테스트 한 모든 컴파일러는 Win32 스타일 기능을 컴파일하는 지원을 지원하므로 Llamafile이 Windows에서 실행될 때 Windows 드라이버와 대화 할 수 있도록 Windows 드라이버와 대화 할 수 있습니다. Windows의 별도 파일로 재 컴파일되었습니다. 자세한 내용은 Cosmopolitan/Dlopen.c를 참조하십시오.
위에서 제공 한 llamafiles의 예는 Mozilla 측의 특정 모델, 라이센스 또는 데이터 세트의 보증 또는 권장 사항으로 해석되어서는 안됩니다.
Llamafile은 Llama.cpp에 서약 () 및 Seccomp 샌드 박스를 추가합니다. 기본적으로 활성화됩니다. --unsecure
플래그를 전달하여 꺼질 수 있습니다. 샌드 박스는 현재 GPU가없는 시스템에서 Linux 및 OpenBSD에서만 지원됩니다. 다른 플랫폼에서는 단순히 경고를 기록합니다.
보안에 대한 우리의 접근 방식에는 이러한 이점이 있습니다.
시작 후 HTTP 서버는 파일 시스템에 전혀 액세스 할 수 없습니다. 누군가가 llama.cpp 서버에서 버그를 발견하면 컴퓨터에서 민감한 정보에 액세스하거나 구성을 변경할 수있을 가능성이 훨씬 적기 때문입니다. Linux에서는 더 많은 것을 샌드 박스 할 수 있습니다. HTTP 서버가 시작한 후 사용할 수있는 유일한 네트워킹 관련 시스템 호출은 accept ()입니다. 이는 HTTP 서버가 손상된 경우 정보를 추방하는 공격자의 능력을 추가로 제한합니다.
메인 CLI 명령은 네트워크에 전혀 액세스 할 수 없습니다. 이것은 운영 체제 커널에 의해 시행됩니다. 또한 파일 시스템에 쓸 수 없습니다. 이는 공격자가 악성 가중치 파일을 만들고 온라인으로 게시 할 수 있도록 GGUF 파일 형식으로 버그가 발견되는 경우 컴퓨터를 안전하게 유지합니다. 이 규칙의 유일한 예외는 --prompt-cache-ro
지정하지 않고 --prompt-cache
플래그를 통과하는 것입니다. 이 경우 cpath
및 wpath
액세스를 허용하기 위해 현재 보안이 약화되어야하지만 네트워크 액세스는 금지되어 있습니다.
그러므로 당신의 llamafile은 외부 세계로부터 스스로를 보호 할 수 있지만, 그렇다고해서 llamafile로부터 보호받는 것은 아닙니다. 샌드 박스는 자체 부과되었습니다. 신뢰할 수없는 출처에서 llamafile을 얻었다면 저자는 단순히 그렇게하지 않도록 단순히 수정했을 수 있습니다. 이 경우 가상 머신과 같은 다른 샌드 박스 내부에서 신뢰할 수없는 llamafile을 실행하여 기대하는 방식을 확인할 수 있습니다.
llamafile 프로젝트는 Apache 2.0-licensed이지만 Llama.cpp에 대한 우리의 변경 사항은 MIT (LLAMA.CPP 프로젝트 자체와 마찬가지로)에 따라 라이센스가 부여되어 미래에 호환적이고 업스트 트림 가능합니다.
이 페이지의 llamafile 로고는 Dall · e 3의 도움으로 생성되었습니다.