يتيح لك LlamaFile توزيع وتشغيل LLMs بملف واحد. (مدونة الإعلان)
هدفنا هو جعل LLMs Open أكثر في متناول كل من المطورين والمستخدمين النهائيين. نحن نفعل ذلك من خلال الجمع بين llama.cpp مع Cosmopolitan Libc في إطار واحد ينهار كل تعقيد LLMs وصولاً إلى ملف واحد قابل للتنفيذ (يسمى "llamafile") الذي يعمل محليًا على معظم أجهزة الكمبيوتر ، مع عدم وجود تثبيت.
Llamafile هو مشروع Mozilla Builders.
أسهل طريقة لتجربتها بنفسك هي تنزيل مثالنا llamafile لنموذج Llava (الترخيص: Llama 2 ، Openai). Llava هي LLM جديدة يمكنها القيام بأكثر من مجرد الدردشة ؛ يمكنك أيضًا تحميل الصور وطرحها على أسئلة حولها. مع Llamafile ، كل هذا يحدث محليًا ؛ لا توجد بيانات تترك جهاز الكمبيوتر الخاص بك.
قم بتنزيل LLAVA-V1.5-7B-Q4.LAMAMFILE (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.
تواجه مشكلة؟ انظر قسم "gotchas" أدناه.
عند بدء تشغيل LlamaFile ، بالإضافة إلى استضافة خادم دردشة ويب واجهة المستخدم على الموقع http://127.0.0.1:8080/ ، يتم توفير نقطة نهاية للمدردات المتوافقة مع API Openai أيضًا. إنه مصمم لدعم حالات استخدام API الأكثر شيوعًا ، بطريقة تعمل محليًا تمامًا. لقد قمنا أيضًا بتوسيعها لتشمل ميزات محددة Llama.cpp (مثل Mirostat) التي يمكن استخدامها أيضًا. لمزيد من التفاصيل حول الحقول ونقاط النهاية المتاحة ، راجع كل من وثائق Openai و LlamaFile Server README.
إن أبسط طريقة للبدء في استخدام واجهة برمجة التطبيقات هي نسخ الأمر واللصق في أمر الضفيرة التالية في المحطة الخاصة بك.
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) ، فيجب أن تكون قادرًا على نقل تطبيقك للتحدث إلى LlamaFile بدلاً من ذلك ، من خلال إجراء بعض التغييرات على base_url
و api_key
. يفترض هذا المثال أنك تقوم بتشغيل pip3 install openai
لتثبيت برنامج عميل Openai ، وهو ما يتطلبه هذا المثال. حزمةهم هي مجرد غلاف Python بسيط حول واجهة 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 )
نحن نقدم أيضًا مثالًا على وجود طرز أخرى ، بحيث يمكنك بسهولة تجربة llamafile مع أنواع مختلفة من LLMs.
نموذج | مقاس | رخصة | لامافيل | Quants الأخرى |
---|---|---|---|---|
LLAMA 3.2 3B الإرشاد | 2.62 غيغابايت | لاما 3.2 | llama-3.2-3b-instruct.q6_k.llamafile | انظر HF repo |
LLAMA 3.2 1B الإرشاد | 1.11 غيغابايت | لاما 3.2 | llama-3.2-1b-instruct.q6_k.llamafile | انظر HF repo |
Gemma 2 2B الإرشاد | 2.32 غيغابايت | جيما 2 | gemma-2-2b-it.q6_k.llamafile | انظر HF repo |
Gemma 2 9b addruct | 7.76 جيجابايت | جيما 2 | gemma-2-9b-it.q6_k.llamafile | انظر HF repo |
Gemma 2 27b الإرشاد | 22.5 غيغابايت | جيما 2 | gemma-2-27b-it.q6_k.llamafile | انظر HF repo |
llava 1.5 | 3.97 غيغابايت | لاما 2 | llava-v1.5-7b-q4.llamafile | انظر HF repo |
Tinyllama-1.1b | 2.05 غيغابايت | Apache 2.0 | Tinyllama -1.1b-chat-v1.0.f16.llamafile | انظر HF repo |
MISTRAL-7B-instruct | 3.85 جيجابايت | Apache 2.0 | MISTRAL-7B-instruct-v0.2.q4_0.llamafile | انظر HF repo |
PHI-3-MINI-4K-instruct | 7.67 غيغابايت | Apache 2.0 | phi-3-mini-4k-instruct.f16.llamafile | انظر HF repo |
mixtral-8x7b-instruct | 30.03 غيغابايت | Apache 2.0 | mixtral-8x7b-instruct-v0.1.q5_k_m.llamafile | انظر HF repo |
WizardCoder-Python-34b | 22.23 جيجابايت | لاما 2 | WizardCoder-Python-34b-V1.0.q5_k_m.llamafile | انظر HF repo |
WizardCoder-Python-13B | 7.33 جيجابايت | لاما 2 | WizardCoder-Python-13B.llamafile | انظر HF repo |
Llama-3-instruct-70b | 37.25 جيجابايت | لاما 3 | meta-llama-3-70b-instruct.q4_0.llamafile | انظر HF repo |
Llama-3-instruct-8b | 5.37 جيجابايت | لاما 3 | meta-llama-3-8b-instruct.q5_k_m.llamafile | انظر HF repo |
صاروخ 3 ب | 1.89 جيجابايت | CC-BY-SA-4.0 | Rocket-3b.q5_k_m.llamafile | انظر HF repo |
olmo-7b | 5.68 جيجابايت | Apache 2.0 | olmo-7b-0424.q6_k.llamafile | انظر HF repo |
نماذج تضمين النص | ||||
E5-MISTRAL-7B-instruct | 5.16 غيغابايت | معهد ماساتشوستس للتكنولوجيا | e5-mistral-7b-instruct-q5_k_m.llamafile | انظر HF repo |
mxbai-embed-large-v1 | 0.7 غيغابايت | Apache 2.0 | mxbai-embed-large-v1-f16.llamafile | انظر HF repo |
فيما يلي مثال على خط الأوامر 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 لديها حجم ملف قابل للتنفيذ أقصى قدره 4 جيجابايت ، وكل هذه الأمثلة تتجاوز هذا الحجم. (يعمل Llava llamafile على Windows لأنه يخجل بحجم 30 ميجابايت من الحد.) لكن لا تفقد القلب: يتيح لك LlamaFile استخدام الأوزان الخارجية ؛ هذا موصوف لاحقًا في هذا المستند.
تواجه مشكلة؟ انظر قسم "gotchas" أدناه.
llamafile هو LLM قابل للتنفيذ يمكنك تشغيله على جهاز الكمبيوتر الخاص بك. أنه يحتوي على أوزان LLM مفتوحة معينة ، وكذلك كل ما هو مطلوب لتشغيل هذا النموذج فعليًا على جهاز الكمبيوتر الخاص بك. لا يوجد شيء لتثبيت أو تكوين (مع عدد قليل من التحذيرات ، التي تمت مناقشتها في الأقسام اللاحقة من هذا المستند).
يتم إنجاز كل هذا من خلال الجمع بين llama.cpp مع Cosmopolitan Libc ، والذي يوفر بعض القدرات المفيدة:
يمكن أن تعمل LlamaFiles على العمليات الدقيقة لمجتمعات وحدة المعالجة المركزية المتعددة. أضفنا وقت التشغيل إلى llama.cpp الذي يتيح أنظمة Intel الجديدة استخدام ميزات وحدة المعالجة المركزية الحديثة دون تداول دعم أجهزة الكمبيوتر القديمة.
يمكن أن تعمل LlamaFiles على هياكل وحدة المعالجة المركزية المتعددة. نحن نفعل ذلك عن طريق تسلسل AMD64 و ARM64 يبني مع نص Shell الذي يطلق النسل المناسب. تنسيق ملفنا متوافق مع Win32 ومعظم قذائف UNIX. يمكن أيضًا تحويلها بسهولة (إما أنت أو المستخدمين) إلى التنسيق الأصلي للنظام الأساسي ، كلما دعت مطلوبًا.
يمكن أن تعمل LlamaFiles على ستة أنظمة (MacOs ، Windows ، Linux ، Freebsd ، OpenBSD ، و Netbsd). إذا قمت بعمل ملفات Llama الخاصة بك ، فستحتاج فقط إلى إنشاء رمزك مرة واحدة ، باستخدام مخطط أدوات على طراز Linux. يعد برنامج التحويل البرمجي المستند إلى دول مجلس التعاون الخليجي الذي نقدمه بحد ذاته قابلة للتنفيذ بالفعل ، بحيث يمكنك إنشاء برنامجك لجميع أنظمة الستة من الراحة التي تفضلها أكثر من أجل التطوير.
يمكن تضمين أوزان LLM داخل Llamafile. أضفنا الدعم لـ PKZIP إلى مكتبة GGML. هذا يتيح تعيين الأوزان غير المضغوطة مباشرة في الذاكرة ، على غرار أرشيف الانفصال الذاتي. إنه يمكّن الأوزان الكمية الموزعة عبر الإنترنت من أن تكون مسبقة بنسخة متوافقة من برنامج 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
to .llamafile.exe
عند تشغيل الأمر أعلاه.
على أي منصة ، إذا قُتلت عملية LlamaFile على الفور ، فتحقق مما إذا كان لديك CrowdStrike ثم اطلب أن تكون موجودًا في القائمة البيضاء.
على جهاز MacOS باستخدام Silicon Apple ، يجب تثبيت أدوات سطر أوامر Xcode لـ LlamaFile لتتمكن من الحصول على محاذاة نفسها.
إذا كنت تستخدم 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
. يمكنك إصلاح ذلك عن طريق إضافة تسجيل إضافي لتنسيق ملف 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 "
كما ذكر أعلاه ، قد تحتاج إلى إعادة تسمية LlamaFile على Windows عن طريق إضافة .exe
إلى اسم الملف.
كما ذكر أعلاه ، يحتوي Windows أيضًا على حد أقصى لحجم الملف البالغ 4 جيجابايت للمباريات التنفيذية. خادم LLAVA قابل للتنفيذ أعلاه فقط 30 ميجابايت من هذا الحد ، لذلك سيعمل على Windows ، ولكن مع طرز أكبر مثل 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 "
في حالة الحصول على Permission Denied
من تعطيل interop من خلال CLI ، يمكن تعطيله بشكل دائم عن طريق إضافة ما يلي في /etc/wsl.conf
[interop]
enabled=false
يدعم LlamaFile أنظمة التشغيل التالية ، والتي تتطلب تثبيت الحد الأدنى للأسهم:
على Windows ، يعمل LlamaFile كصاحب محمول قابل للتنفيذ. على أنظمة UNIX ، يستخلص LlamaFile برنامج محمل صغير يسمى ape
إلى $TMPDIR/.llamafile
أو ~/.ape-1.9
[1] يجب دعم إصدارات Darwin kernel 15.6+ ، ولكن ليس لدينا حاليًا أي طريقة لاختبار ذلك.
يدعم LlamaFile وحدات المعالجة المركزية التالية:
يجب أن يكون لدى AMD64 المعالجات الدقيقة AVX. وإلا فإن LlamaFile سوف يطبع خطأ ويرفض التشغيل. هذا يعني أنه إذا كان لديك وحدة المعالجة المركزية Intel ، فيجب أن تكون Intel Core أو أحدث (حوالي 2006+) ، وإذا كان لديك وحدة المعالجة المركزية AMD ، فيجب أن تكون K8 أو أحدث (حوالي 2003+). يتم تمكين دعم AVX512 و AVX2 و FMA و F16C و VNNI في وقت التشغيل إذا كان لديك وحدة المعالجة المركزية الأحدث. على سبيل المثال ، يحتوي Zen4 على AVX512 جيد جدًا يمكنه تسريع BF16 llamafiles.
يجب أن يكون لدى Arm64 المعالجات الدقيقة ARMV8A+. هذا يعني أن كل شيء من سيليكون Apple إلى Raspberry PIs 64 بت سيعمل ، شريطة أن تناسب أوزارك الذاكرة.
يدعم LlamaFile الأنواع التالية من وحدات معالجة الرسومات:
يتم دعم GPU على MACOS ARM64 عن طريق تجميع وحدة صغيرة باستخدام أدوات سطر أوامر XCODE ، والتي تحتاج إلى تثبيت. هذه تكلفة لمرة واحدة تحدث في المرة الأولى التي تدير فيها llamafile. يتم تخزين DSO التي تم بناؤها بواسطة LlamaFile في $TMPDIR/.llamafile
أو $HOME/.llamafile
. يتم تمكين عملية التحميل إلى GPU افتراضيًا عند وجود وحدة معالجة الرسومات المعدنية. يمكن تعطيل ذلك عن طريق تمرير -ngl 0
أو --gpu disable
لإجبار LlamaFile على إجراء استنتاج وحدة المعالجة المركزية.
يحتاج أصحاب بطاقات رسومات NVIDIA و AMD إلى تمرير علامة -ngl 999
لتمكين أقصى تفريغ. إذا كانت وحدات معالجة الرسومات المتعددة موجودة ، فسيتم تقسيم العمل بالتساوي بينها بشكل افتراضي ، بحيث يمكنك تحميل نماذج أكبر. قد يتم كسر دعم GPU المتعدد على أنظمة AMD Radeon. إذا حدث ذلك لك ، فاستخدم export HIP_VISIBLE_DEVICES=0
الذي يجبر LLAMAFILE على استخدام وحدة معالجة الرسومات الأولى فقط.
يتم تشجيع مستخدمي Windows على استخدام ثنائيات الإصدار الخاصة بنا ، لأنها تحتوي على DLLs مسبقة الصنع لكل من بطاقات رسومات NVIDIA و AMD ، والتي تعتمد فقط على برنامج تشغيل الرسومات الذي يتم تثبيته. إذا اكتشف LlamaFile أنه يتم تثبيت CUDA SDK من NVIDIA أو AMD's ROCM HIP SDK ، فسيحاول LlamaFile بناء DLL أسرع يستخدم Cublas أو Rocblas. من أجل إنشاء LlamaFile بنجاح وحدة Cublas ، يجب تشغيله على موجه أوامر X64 MSVC. يمكنك استخدام CUDA عبر WSL عن طريق تمكين NVIDIA CUDA على WSL وتشغيل llamafiles الخاص بك داخل WSL. إن استخدام WSL له فائدة إضافية تتمثل في السماح لك بتشغيل LlamaFiles أكبر من 4 جيجابايت على Windows.
على Linux ، سيحتاج مستخدمو Nvidia إلى تثبيت CUDA SDK (بشكل مثالي باستخدام مثبت SHELL SCRIPT) ويحتاج مستخدمو ROCM إلى تثبيت SDK الورك. تم اكتشافها من خلال البحث لمعرفة ما إذا كانت nvcc
أو hipcc
على الطريق.
إذا كان لديك كلا من GPU AMD و GPU NVIDIA في جهازك ، فقد تحتاج إلى تأهيل أي واحد تريد استخدامه ، عن طريق تمرير إما --gpu amd
أو --gpu nvidia
.
في حالة عدم تعذر تجميع دعم GPU وربطه ديناميكيًا أثناء الطيران لأي سبب من الأسباب ، فإن LlamaFile ستعود إلى استنتاج وحدة المعالجة المركزية.
يتطلب التطوير على llamafile نسخة حديثة من GNU make
Command (تسمى gmake
على بعض الأنظمة) ، sha256sum
(وإلا سيتم استخدام cc
لبناءه) ، wget
(أو curl
) ، و unzip
متاح على https://cosmo.zip/ PUB/COSMOS/BIN/. يحتاج مستخدمو Windows إلى Cosmos Bash Shell أيضًا.
make -j8
sudo make install PREFIX=/usr/local
فيما يلي مثال على كيفية إنشاء رمز لوظيفة LIBC باستخدام واجهة سطر الأوامر llama.cpp ، باستخدام أوزان WizardCoder-Python-13B:
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-INSTRING لتكوين النثر:
llamafile -ngl 9999
-m mistral-7b-instruct-v0.1.Q4_K_M.gguf
-p ' [INST]Write a story about llamas[/INST] '
فيما يلي مثال على كيفية استخدام LlamaFile كخط chatbot التفاعلي يتيح لك الاستعلام عن المعرفة الواردة في بيانات التدريب:
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 لتلخيص عناوين URL HTML:
(
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
إليك مثال على كيفية تشغيل خادم HTTP المدمج في Llama.cpp. يستخدم هذا المثال 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
سيقوم الأمر أعلاه بتشغيل علامة تبويب متصفح على جهاز الكمبيوتر الشخصي لعرض واجهة ويب. يتيح لك الدردشة مع 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 مع أصدقائك هي نشرها على وجه المعانقة. إذا قمت بذلك ، فمن المستحسن أن تذكر في رسالة الوجه المعانقة الخاصة بك ، ما هي مراجعة GIT أو إصدار إصدار من llamafile الذي استخدمته عند بناء llamafile الخاص بك. وبهذه الطريقة ، سيتمكن الجميع عبر الإنترنت من التحقق من مصدر محتوىه القابل للتنفيذ. إذا قمت بإجراء تغييرات على llama.cpp أو رمز المصدر العالمي ، فإن ترخيص Apache 2.0 يتطلب منك شرح ما الذي تم تغييره. إحدى الطرق التي يمكنك من خلالها القيام بذلك هي تضمين إشعار في llamafile باستخدام zipalign
الذي يصف التغييرات ، وذكره في وجهك المعانقة.
هناك صفحة يدوية لكل من برامج LlamaFile المثبتة عند تشغيل sudo make install
. تعد أدلة الأوامر أيضًا نوعًا من ملفات PDF التي يمكنك تنزيلها من صفحة إصدارات GitHub الخاصة بنا. أخيرًا ، ستعرض معظم الأوامر هذه المعلومات عند تمرير علامة --help
.
يجيب هذا القسم على السؤال "لدي بالفعل نموذج تم تنزيله محليًا حسب التطبيق X ، هل يمكنني استخدامه مع LlamaFile؟" . الإجابة العامة هي "نعم ، طالما يتم تخزين هذه النماذج محليًا بتنسيق GGUF" ولكن يمكن أن يكون تنفيذها اختراقًا إلى حد ما حسب التطبيق. بعض الأمثلة (تم اختبارها على جهاز Mac).
تقوم LM Studio بتنزيل النماذج بتنسيق ~/.cache/lm-studio/models
، في الدلائل الفرعية مع نفس الاسم من النماذج (بعد تنسيق account_name/model_name
) ، مع نفس اسم الملف الذي رأيته عند اختيار تنزيل الملف.
لذا ، إذا قمت بتنزيل ملف llama-2-7b.Q2_K.gguf
لـ TheBloke/Llama-2-7B-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
.
يقوم البيان بتعيين كل ملف مرتبط بالنموذج (على سبيل المثال أوزان GGUF ، ترخيص ، قالب موجه ، إلخ) إلى Digest SHA256. الهضم المقابل للعنصر الذي يكون mediaType
هو application/vnd.ollama.image.model
هو واحد يشير إلى ملف GGUF للموديل.
يتم استخدام كل Digest SHA256 أيضًا كاسم ملف في دليل ~/.ollama/models/blobs
(إذا نظرت إلى هذا الدليل ، فسترى فقط أسماء الملفات SHA256-*). هذا يعني أنه يمكنك تشغيل LlamaFile مباشرة عن طريق تمرير Digest SHA256 كاسم ملف النموذج. لذلك ، على سبيل المثال ، llama3:latest
ملف GGUF هو sha256-00e1317cbf74d901080d7100f57580ba8dd8de57203072dc6f668324ba545f29
، يمكنك تشغيل Llamafile كمتابعة:
cd ~/.ollama/models/blobs
llamafile -m sha256-00e1317cbf74d901080d7100f57580ba8dd8de57203072dc6f668324ba545f29
فيما يلي نظرة عامة مختصرة على الحيل التي استخدمناها لإنشاء التنسيق القابل للتنفيذ على الإطلاق. القصة الطويلة القصيرة هي LlamaFile هو نص Shell الذي يطلق نفسه ويستفيد من الأوزان المدمجة بالميلي ثانية دون الحاجة إلى نسخ أو تثبيت. ما يجعل ذلك ممكنا هو mmap (). كل من llama.cpp قابلة للتنفيذ والأوزان متسلسلة على البرنامج النصي shell. ثم يتم استخراج برنامج Loader Tiny بواسطة البرنامج النصي Shell ، والذي يقوم بتخطيط القابل للتنفيذ في الذاكرة. يقوم Llama.cpp بالتنفيذ ثم يفتح البرنامج النصي Shell مرة أخرى كملف ، ويتصل MMAP () مرة أخرى بسحب الأوزان إلى الذاكرة وجعلها في متناول كل من وحدة المعالجة المركزية و GPU.
تتمثل الحيلة في تضمين الأوزان داخل Llama.cpp Executables التأكد من أن الملف المحلي محاذاة على حدود حجم الصفحة. وبهذه الطريقة ، بافتراض أن ملف zip غير مضغوط ، بمجرد أن يتم تشغيله في الذاكرة MMAP () ، يمكننا تمرير مؤشرات مباشرة إلى وحدات معالجة الرسومات مثل Apple Metal ، والتي تتطلب محاذاة حجم البيانات. نظرًا لعدم وجود أداة أرشفة مضغوطة حالية ، فقد اضطررنا إلى كتابة حوالي 500 سطر من التعليمات البرمجية لإدراج ملفات zip بأنفسنا. ومع ذلك ، بمجرد وجوده ، يجب أن يكون كل برنامج zip موجودًا قادرًا على قراءتها ، شريطة أن تدعم ZIP64. هذا يجعل الأوزان أكثر سهولة في الوصول إليها مما كانت عليه ، لو اخترنا تنسيق الملفات الخاصة بنا للملفات المتسلسلة.
على Intel و AMD Microprocessors ، تقضي Llama.cpp معظم وقتها في Quants Matmul ، والتي عادة ما يتم كتابتها ثلاث مرات لـ SSSE3 و AVX و AVX2. يسحب LlamaFile كل من هذه الوظائف إلى ملف منفصل يمكن أن يكون #include
عدة مرات ، مع وجود سمات وظيفة __attribute__((__target__("arch")))
. بعد ذلك ، تتم إضافة وظيفة الغلاف التي تستخدم ميزة X86_HAVE(FOO)
من Cosmopolitan لإرسال وقت التشغيل إلى التنفيذ المناسب.
Llamafile يحل قابلية نقل الهندسة المعمارية عن طريق بناء llama.cpp مرتين: مرة واحدة لـ AMD64 ومرة أخرى لـ ARM64. ثم يلفها باستخدام نص Shell الذي يحتوي على بادئة MZ. على Windows ، سيتم تشغيله باعتباره ثنائيًا أصليًا. على Linux ، سوف يستخرج قابلة للتنفيذ قابلة للتنفيذ 8 كيلو بايت تسمى ape loader إلى ${TMPDIR:-${HOME:-.}}/.ape
التي ستحسم الأجزاء الثنائية من البرنامج النصي shell في الذاكرة. من الممكن تجنب هذه العملية من خلال تشغيل برنامج assimilate
الذي يأتي مع برنامج التحويل البرمجي cosmocc
. ما يفعله برنامج assimilate
هو تحويل البرنامج النصي shell إلى التنسيق القابل للتنفيذ الأصلي لمنصة المضيف. هذا يضمن وجود مسار احتياطي لعمليات الإصدار التقليدية عند الحاجة.
يستخدم Cosmopolitan Libc الربط الثابت ، لأن هذه هي الطريقة الوحيدة للحصول على نفس المنافسة لتشغيلها على ستة أنظمة. يمثل هذا تحديًا لـ llama.cpp ، لأنه لا يمكن ربط دعم GPU بشكل ثابت. الطريقة التي نحلها هي التحقق مما إذا تم تثبيت برنامج التحويل البرمجي على نظام المضيف. بالنسبة إلى Apple ، سيكون ذلك Xcode ، وبالنسبة للمنصات الأخرى ، سيكون nvcc
. لدى Llama.cpp تطبيق ملف واحد لكل وحدة GPU ، المسماة ggml-metal.m
(الهدف C) و ggml-cuda.cu
(NVIDIA C). يقوم Llamafile بتضمين ملفات المصدر هذه داخل أرشيف ZIP ويطلب من برنامج التحويل البرمجي للمنصة أن يبنيها في وقت التشغيل ، واستهداف البنية الدقيقة GPU الأصلية. إذا نجحت ، فسيتم ربطها بتنفيذ Platform C Library Dlopen (). انظر llamafile/cuda.c و llamafile/metal.c.
من أجل استخدام وظيفة DLOPEN () الخاصة بالنظام الأساسي ، نحتاج إلى أن نطلب من برنامج التحويل البرمجي الخاص من النظام الأساسي بناء قابلة للتنفيذ صغيرة تكشف هذه الواجهات. على منصات ELF ، يقوم Cosmopolitan Libc بتعيين هذا المساعد القابل للتنفيذ في الذاكرة إلى جانب مترجم ELF للمنصة. ثم تهتم مكتبة Platform C بربط جميع مكتبات GPU ، ثم تدير برنامج Helper الذي يعود إلى LongJMP () إلى Cosmopolitan. أصبح البرنامج القابل للتنفيذ الآن في حالة هجينة غريبة حيث توجد مكتبتان منفصلتان C لها ABIs مختلفة. على سبيل المثال ، يعمل تخزين Thread المحلي بشكل مختلف على كل نظام تشغيل ، وستعطل البرامج إذا لم يشير سجل TLS إلى الذاكرة المناسبة. إن الطريقة التي يحل بها Cosmopolitan Libc أنه في AMD باستخدام SSE لإعادة ترجمة القابل للتنفيذ في وقت التشغيل لتغيير %fs
يسجل الوصول إلى %gs
التي تأخذ مللي ثانية. على ARM ، يستخدم Cosmo سجل x28
لـ TLS والذي يمكن جعله آمنًا عن طريق تمرير علامة -ffixed-x28
عند تجميع وحدات GPU. أخيرًا ، يستخدم LlamaFile سمة __ms_abi__
بحيث تتوافق مؤشرات الوظيفة بين التطبيقات ووحدات GPU مع اتفاقية استدعاء Windows. بشكل مثير للدهشة ، كل مترجم قمنا باختباره ، بما في ذلك NVCC على Linux وحتى Objective-C على MacOS ، جميعها تدعم وظائف نمط Win32 ، وبالتالي التأكد إعادة ترجمة كملف منفصل لنظام التشغيل Windows. انظر Cosmopolitan/dlopen.c لمزيد من التفاصيل.
لا ينبغي تفسير مثال LlamaFiles المذكور أعلاه على أنه موافقات أو توصيات لنماذج أو تراخيص أو مجموعات بيانات محددة من جانب Mozilla.
يضيف Llamafile تعهد () و Seccomp Sandboxing إلى llama.cpp. يتم تمكين هذا بشكل افتراضي. يمكن إيقاف تشغيله عن طريق تمرير العلم --unsecure
. يتم دعم Sandboxing حاليًا فقط على Linux و OpenBSD على أنظمة بدون وحدات معالجة الرسومات. على منصات أخرى ، سوف يقوم ببساطة بتسجيل تحذير.
نهجنا في الأمن له هذه الفوائد:
بعد بدء تشغيله ، لا يتمكن خادم HTTP من الوصول إلى نظام الملفات على الإطلاق. هذا أمر جيد ، لأنه يعني أنه إذا اكتشف شخص ما خطأ في خادم llama.cpp ، فمن غير المرجح أن يتمكنوا من الوصول إلى معلومات حساسة على جهازك أو إجراء تغييرات على تكوينه. على Linux ، نحن قادرون على رمل الأشياء إلى أبعد من ذلك ؛ إن النظام الوحيد المتعلق بالشبكات المتصل بالاستدعاء سيسمح لخادم HTTP بالاستخدام بعد البدء ، هو قبول (). هذا يحد من قدرة المهاجم على التخلص من المعلومات ، في حالة تعرض خادم HTTP الخاص بك للخطر.
لن يتمكن أمر CLI الرئيسي من الوصول إلى الشبكة على الإطلاق. يتم فرض هذا بواسطة kernel نظام التشغيل. كما أنه لن يكون قادرًا على الكتابة إلى نظام الملفات. هذا يبقي جهاز الكمبيوتر الخاص بك آمنًا في حالة اكتشاف الخلل في تنسيق ملف GGUF الذي يتيح للمهاجمين ملفات الأوزان الخبيثة ونشرها عبر الإنترنت. الاستثناء الوحيد لهذه القاعدة هو إذا قمت بتمرير علامة --prompt-cache
دون تحديد- --prompt-cache-ro
. في هذه الحالة ، يجب أن يضعف الأمان حاليًا للسماح للوصول إلى cpath
و wpath
، ولكن سيظل الوصول إلى الشبكة ممنوعًا.
لذلك فإن llamafile الخاص بك قادر على حماية نفسه ضد العالم الخارجي ، لكن هذا لا يعني أنك محمي من LlamaFile. الرمال هو فرض نفسه. إذا كنت قد حصلت على llamafile من مصدر غير موثوق به ، فيمكن أن يكون مؤلفها قد عدله ببساطة لعدم القيام بذلك. في هذه الحالة ، يمكنك تشغيل llamafile غير الموثوق به داخل صندوق رملي آخر ، مثل الجهاز الظاهري ، للتأكد من سلوكه كيف تتوقع.
في حين أن مشروع LlamaFile مرخص له Apache 2.0 ، فإن تغييراتنا على llama.cpp مرخصة بموجب معهد ماساتشوستس للتكنولوجيا (تمامًا مثل مشروع llama.cpp نفسه) حتى تظل متوافقة وقابلة للتطبيق في المستقبل ، إذا كان ذلك مطلوبًا.
تم إنشاء شعار LlamaFile في هذه الصفحة بمساعدة Dall · e 3.