تشغيل خادم llama.cpp على VPS عبر systemd
ابنِ llama-server من وسم مثبت، وقدّم نماذج GGUF عبر API متوافق مع OpenAI، مع ربطه بـ localhost وتشغيله عبر systemd وحدود واضحة للذاكرة.
ما الذي ستبنيه
يعني تشغيل خادم llama.cpp على VPS استخدام ملف ثنائي واحد، llama-server، يحمّل ملف نموذج GGUF واحداً ويجيب عن طلبات HTTP عبر API متوافق مع OpenAI. وجّه أي عميل OpenAI إلى http://127.0.0.1:8080/v1 وسيعمل. أما تثبيت البرنامج فهو الجزء السهل.
أما بقية العمل فتتعلق بالتشغيل: ثبّت إصداراً محدداً، وأبقِ المنفذ على localhost، واكتب وحدة systemd، وحدد ما سيحدث عندما تنفد ذاكرة الخادم. يغطي هذا الدليل هذه الجوانب. إذا لم تكن قد قررت بعد بين الخيارين الواضحين، فاقرأ أولاً المفاضلة بين Ollama وllama.cpp، لأن هذا هو الدليل العملي الذي يتعمد ذلك المقال تركه دون تغطية.
اختر وسم إصدار وسجّله
يضع llama.cpp وسم إصدار لكل عملية دمج تقريباً، لذلك تكون الوسوم أرقام البناء. ويُعد b10488 أحدث وسم حتى 18 August 2026. لا يوجد فرع مستقر طويل الأمد، وهذا يعني أن «الأحدث» يتغير باستمرار، وأن الإصدار الذي اختبرته هو الإصدار الوحيد الذي يمكنك دعمه. اختر وسماً، وسجّله، واستخدم السلسلة نفسها في عملية النسخ، واسم الملف التنفيذي، وملاحظاتك.
تتضمن كل وسم أيضاً أرشيفات مبنية مسبقاً. بالنسبة إلى VPS بمعمارية x86 ويعمل بالـCPU فقط، يكون الأرشيف هو llama-b10488-bin-ubuntu-x64.tar.gz، ويوجد أرشيف arm64 بجانبه إذا كنت تستخدم VPS بمعمارية ARM بدلاً من x86.
curl -LO https://github.com/ggml-org/llama.cpp/releases/download/b10488/llama-b10488-bin-ubuntu-x64.tar.gz
tar tf llama-b10488-bin-ubuntu-x64.tar.gz | headاعرض محتويات الأرشيف قبل فكّه، حتى تعرف مكان وضع الملفات. ترتبط هذه الملفات التنفيذية بمكتبة C الخاصة بصورة النظام التي بُنيت فيها، لذلك تفشل عند بدء التشغيل على توزيعة أقدم، وتظهر رسالة خطأ تذكر إصدار GLIBC_ غير المثبّت. يستغرق البناء من المصدر بضع دقائق على VPS صغير، ويزيل هذه الفئة كاملة من المشكلات، ولذلك نستخدم هذا المسار أدناه.
بناء llama-server من وسم محدد
sudo apt update
sudo apt install -y build-essential cmake git libssl-dev
git clone --depth 1 --branch b10488 https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_EXAMPLES=OFF
cmake --build build --config Release -t llama-server -j 2يؤدي --branch b10488 على --depth 1 إلى سحب هذا الوسم دون أي شيء آخر، لذلك لا يتغير الإصدار أثناء العمل.
يهم libssl-dev لأن الخيار LLAMA_OPENSSL مفعّل افتراضياً. يتيح ذلك للملف التنفيذي تنزيل النماذج عبر HTTPS لاحقاً. يفشلَت خطوة configure من دون هذه الترويسات.
يوفّر -DBUILD_SHARED_LIBS=OFF ملفاً تنفيذياً مستقلاً بالكامل. يضع البناء الافتراضي المكتبات المشتركة بجانب الملف التنفيذي، لذلك يفشل نسخ الملف التنفيذي وحده إلى /usr/local/bin مع error while loading shared libraries: libllama.so.
يبني -t llama-server هدف الخادم فقط. يترجم البناء الافتراضي أيضاً الأدوات الأخرى والاختبارات. على VPS ذي نواتين، يستغرق ذلك عدة دقائق إضافية لترجمة ملفات لن تشغّلها.
اختيار -j 2 مقصود. تحتفظ كل مهمة ترجمة متوازية بمجموعة عمل خاصة بها. لذلك ينتهي -j $(nproc) على خطة صغيرة بحدوث c++: fatal error: Killed signal terminated program cc1plus، حيث يوقف قاتل نفاد الذاكرة في النواة المترجم. خفّض عدد المهام، أو أضف swap أثناء البناء.
قد ترغب في تغيير راية واحدة: تكون GGML_NATIVE مفعّلة افتراضياً، لذلك يستهدف المترجم CPU المحدد الذي ينفّذ عملية البناء. هذا هو الخيار المناسب عندما تبني البرنامج على الجهاز الذي سيشغّله. إذا بنيت البرنامج مرة واحدة ثم نسخت الملف التنفيذي إلى مضيف مختلف، فأضف -DGGML_NATIVE=OFF، لأن الملف التنفيذي الذي يستخدم تعليمات لا يدعمها CPU الآخر يتوقف مع Illegal instruction (core dumped) عند أول عملية استدلال.
ثبّته باسم يتضمن الوسم.
./build/bin/llama-server --version
sudo install -m 755 build/bin/llama-server /usr/local/bin/llama-server-b10488
sudo ln -sfn /usr/local/bin/llama-server-b10488 /usr/local/bin/llama-serverيطبع --version رقم البناء وcommit. يجب أن يطابق الوسم الذي سحبته. إذا لم يطابقه، فقد بنيت إصداراً آخر. يتيح الاحتفاظ بالرقم في اسم الملف وتوجيه symlink إليه تنفيذ الترقية عبر ln -sfn واحد ثم إعادة تشغيل واحدة. ويكون التراجع باستخدام الأمر نفسه مع الرقم القديم.
احصل على نموذج GGUF وتحقق من مساحة القرص أولاً
تنسيق GGUF هو تنسيق الملف الواحد الذي يحمّله llama.cpp. يحتوي الملف الواحد على الأوزان وtokeniser والبيانات الوصفية، لذلك لا تحتاج إلى تثبيت أي شيء آخر. تشير اللاحقة في اسم الملف إلى quantisation، أي الدقة التي تُخزَّن بها الأوزان: Q4_K_M هي مزيج بدقة 4-bit، وQ8_0 بدقة 8-bit، وf16 هو الملف غير المكمَّم بدقة نصفية.
أنشئ حساب خدمة ودليلاً للنموذج قبل تنزيل أي شيء.
sudo useradd --system --home /srv/llama --create-home --shell /usr/sbin/nologin llama
sudo install -d -o llama -g llama /srv/models
df -h /srvيمكن للخادم تنزيل نموذج بنفسه باستخدام -hf، وهذه أسرع طريقة للتأكد من أن عملية البناء تعمل.
sudo -u llama env LLAMA_CACHE=/srv/models /usr/local/bin/llama-server \
-hf ggml-org/gemma-3-1b-it-GGUF:Q4_K_M --host 127.0.0.1 --port 8080يحدّد LLAMA_CACHE دليل التنزيل. بدونه، يُحفظ الملف في ~/.cache/llama.cpp ضمن حساب المستخدم الذي نفّذ الأمر، وهذا ليس المكان المناسب لخدمة ستجعل مجلدها الرئيسي غير قابل للقراءة قريباً. نفّذ ls -lh /srv/models بعد ذلك، لأن اسم الملف المخزّن مؤقتاً يُشتق من اسم المستودع وليس من اسم الملف البسيط.
بالنسبة إلى الخدمة، نزّل النموذج إلى مسار اخترته، حتى يحتوي ملف الوحدة على مسار ثابت يشير إليه.
sudo -u llama curl -L --output-dir /srv/models -O \
https://huggingface.co/ggml-org/gemma-3-1b-it-GGUF/resolve/main/gemma-3-1b-it-Q4_K_M.ggufمساحة القرص هي أول قيد يواجهه معظم المستخدمين. هذه هي أحجام الملفات المنشورة لنموذجين، بعد التحقق منها في 18 August 2026.
The data behind this chart
[
{
"label": "gemma-3-1b-it Q4_K_M",
"size_gb": 0.81
},
{
"label": "gemma-3-1b-it Q8_0",
"size_gb": 1.07
},
{
"label": "gemma-3-1b-it f16",
"size_gb": 2.01
},
{
"label": "gpt-oss-20b MXFP4",
"size_gb": 12.11
}
]حجم ملف 4-bit لنموذج 1B هو 0.81 GB. أما النموذج نفسه من دون quantisation فحجمه 2.01 GB، لذا يغيّر اختيار التنسيق الحجم بأكثر من الضعف. يبلغ حجم نموذج 20B باستخدام MXFP4 مقدار 12.11 GB، وهذا لا يتسع له القرص في كثير من الخطط المبدئية، كما يجب بعد ذلك تحميله إلى الذاكرة. إذا كنت تستهدف عائلة محددة، توضّح عملية تحديد الحجم نفسها لنماذج GLM مدى سرعة تجاوز النموذج الأكبر لقدرة VPS من حيث التكلفة، بينما يلائمها نموذج أصغر من العائلة نفسها.
تحقق من df -h قبل كل تنزيل. إذا امتلأ نظام الملفات الجذري أثناء نقل حجمه 12 GB، فسيتعطّل كل ما يحتاج إلى الكتابة، بما في ذلك journal.
شغّله مرة واحدة يدوياً، وتحقق منه
sudo -u llama /usr/local/bin/llama-server \
--model /srv/models/gemma-3-1b-it-Q4_K_M.gguf \
--host 127.0.0.1 --port 8080 \
--ctx-size 4096 --parallel 1 --threads 2 --no-webuiفي جلسة ثانية، اسأل الخادم عما إذا كان جاهزاً.
curl -s http://127.0.0.1:8080/healthأثناء تحميل الملف، تحصل على HTTP 503 ويكون نص الاستجابة كما يلي:
{"error":{"code":503,"message":"Loading model","type":"unavailable_error"}}عندما يصبح جاهزاً، يكون نص الاستجابة هو {"status": "ok" }. بعد ذلك أرسل طلباً فعلياً.
curl -s http://127.0.0.1:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"local","messages":[{"role":"user","content":"Say hello in five words."}]}'يُعد كائن JSON الذي يحتوي على مصفوفة choices دليلاً على أن الخادم يعمل. يوجد الحقل model لأن عملاء OpenAI يرسلونه دائماً. حمّل هذا الخادم نموذجاً واحداً فقط، لذلك لا تُستخدم هذه القيمة لتحديد أي شيء.
واجهة API المتوافقة مع OpenAI، وما يوجد أيضاً على المنفذ
POST /v1/chat/completions وPOST /v1/completions وPOST /v1/embeddings هي المسارات المتوافقة مع OpenAI، بينما يعرض GET /v1/models النموذج المحمّل. يفحص GET /health الجاهزية الموضحة أعلاه، ويُرجع GET /props الإعدادات الحالية للخادم، ويعرض GET /metrics عدادات Prometheus عند بدء التشغيل باستخدام --metrics.
يمكنك استخدام أي SDK متوافق مع OpenAI بعد ضبط عنوان URL الأساسي على http://127.0.0.1:8080/v1 وتمرير سلسلة غير فارغة كمفتاح API. لن يتحقق أي مكوّن من هذا المفتاح إلى أن تضبط --api-key بنفسك.
لا تعتمد على ادعاء أي شخص بشأن معدل المعالجة عند وضع أرقام خطتك. تعتمد سرعة الاستدلال على CPU على عدد الأنوية وعرض نطاق الذاكرة والخوادم الأخرى التي تشاركها المضيف نفسه، لذلك قِس عدد الرموز في الثانية على خادمك واعتمد النتيجة الفعلية. يظهر وقت المعالجة المسلوب بسبب خادم مجاور يستهلك الموارد هنا على شكل سرعة توليد تتغير من ساعة إلى أخرى.
أبقِه على 127.0.0.1 وضع proxy أمامه
يكون --host مضبوطاً افتراضياً على 127.0.0.1، لذلك يتعذر الوصول إلى الخادم من الخارج إلى أن تغيّر ذلك. اتركه كما هو. لا يوفّر llama-server نموذج مستخدمين، أو حدّاً لمعدل الطلبات، أو سجل تدقيق مفيداً. أما عنصر التحكم المضمّن الوحيد فهو --api-key، الذي يقارن سلسلة نصية واحدة. يمثّل منفذ الاستدلال المفتوح قدرة حوسبة مجانية لأي شخص يعثر عليه. وينطبق الخطأ نفسه على Ollama أيضاً: ينطبق تأمين واجهة برمجة نموذج مستضاف ذاتياً هنا حرفياً.
أنهِ TLS (أمان طبقة النقل) في nginx، ثم وجّه الطلبات إلى منفذ loopback.
server {
listen 443 ssl;
server_name llm.example.com;
location /v1/ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off;
proxy_read_timeout 600s;
}
}مطلوب proxy_buffering off للبث. عند تفعيل التخزين المؤقت، يحتفظ nginx بأحداث الخادم المرسلة (SSE) إلى أن تكتمل الاستجابة. لذلك ينتظر العميل بصمت، ثم يتلقى الإجابة كاملة دفعة واحدة. يغطي proxy_read_timeout 600s عمليات التوليد الطويلة، لأن القيمة الافتراضية البالغة 60 ثانية تحول الإجابة البطيئة إلى 504 Gateway Time-out. احصل على الشهادة باستخدام Certbot وLet's Encrypt مع nginx.
وحدة systemd
اكتب /etc/systemd/system/llama-server.service.
[Unit]
Description=llama.cpp server
After=network-online.target
Wants=network-online.target
[Service]
User=llama
Group=llama
Environment=LLAMA_ARG_MODEL=/srv/models/gemma-3-1b-it-Q4_K_M.gguf
Environment=LLAMA_ARG_HOST=127.0.0.1
Environment=LLAMA_ARG_PORT=8080
Environment=LLAMA_ARG_CTX_SIZE=4096
Environment=LLAMA_ARG_N_PARALLEL=1
Environment=LLAMA_ARG_THREADS=2
ExecStart=/usr/local/bin/llama-server --no-webui
Restart=on-failure
RestartSec=5
TimeoutStopSec=30
MemoryHigh=3G
MemoryMax=3500M
OOMPolicy=stop
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
[Install]
WantedBy=multi-user.targetتوجد الإعدادات في أسطر Environment= لأن llama-server يقرأ متغيرات LLAMA_ARG_* لمعظم الخيارات، كما تتجاوز وسيطة سطر الأوامر المتغير المطابق لها. يوفّر ذلك مكاناً واحداً لتغيير حجم السياق، ويحافظ على قِصر ExecStart بما يكفي لقراءته سريعاً.
يجعل ProtectSystem=strict نظام الملفات بأكمله للقراءة فقط بالنسبة إلى هذه الوحدة، وهذا مناسب لأن الخادم يقرأ النموذج فقط. أضف ReadWritePaths=/srv/models إذا أردت أن تنزّل الخدمة نفسها النماذج باستخدام -hf. يخفي ProtectHome=yes كلاً من /home و/root، وهذا هو السبب الثاني للاحتفاظ بالنماذج في /srv: عند تفعيل ProtectHome، لا يكون المسار الافتراضي ~/.cache/llama.cpp مرئياً للعملية إطلاقاً.
sudo systemctl daemon-reload
sudo systemctl enable --now llama-server
systemctl status llama-server
curl -s http://127.0.0.1:8080/health
journalctl -u llama-server -n 50 --no-pagerتمثل enable --now الجزء الذي يتجاوزه كثيرون. من دون enable، تتوقف الخدمة بعد إعادة التشغيل التالية. إذا أردت جدولة مهام مرتبطة بالخدمة، مثل التحقق ليلاً من إصدار جديد، فإن خدمة systemd مع مؤقت هي الآلية المناسبة لذلك.
حدّد ما يحدث عند نفاد الذاكرة قبل حدوثه
استخدام الذاكرة له جزآن، ويتصرف كل منهما بشكل مختلف عند فرض حد. يكون ملف النموذج معيّناً في الذاكرة افتراضياً، لذلك تكون صفحاته مدعومة بملف: يمكن للنواة إسقاطها وقراءتها مجدداً من القرص. أما ذاكرة KV cache، وهي الحالة الخاصة بكل رمز التي يحتفظ بها الخادم لكل محادثة نشطة، فهي ذاكرة مجهولة. لا يمكن إسقاطها، ولذلك تكون هي السبب في إنهاء العملية.
لهذا تؤدي الحدود الموجودة في الوحدة وظيفتين مختلفتين. MemoryHigh=3G حدّ ناعم: عندما يتجاوزه الاستخدام، تضع النواة cgroup تحت ضغط استعادة الذاكرة، فتُطرَد صفحات النموذج المعيّنة في الذاكرة وتُقرأ مجدداً من القرص عند معالجة الرمز التالي. تستمر الخدمة في العمل، لكنها تصبح أبطأ. MemoryMax=3500M حدّ صارم: عندما يتجاوزه الاستخدام، تُنهى العملية، ويذكر journal ذلك بوضوح.
llama-server.service: A process of this unit has been killed by the OOM killer.اضبط --ctx-size بنفسك. القيمة الافتراضية هي 0، وهذا يعني حجم السياق الذي دُرِّب عليه النموذج. في نموذج حديث ذي سياق طويل، يؤدي ذلك إلى تخصيص ذاكرة KV cache كبيرة جداً عند بدء التشغيل. ثم تتوقف الخدمة قبل أن تستقبل طلباً واحداً. يضاعف --parallel التكلفة نفسها، لأن كل slot يحتفظ بحالة محادثته الخاصة، لذلك اتركه مضبوطاً على 1 إلى أن تتأكد من حاجتك إلى التزامن.
عند استخدام Restart=on-failure تعود الخدمة بعد إنهائها. إذا أُنهيت عند كل بدء تشغيل، يتوقف systemd عن المحاولة، ويطبع systemctl status القيمة start request repeated too quickly. هذا هو السلوك الصحيح: حلقة إعادة تشغيل تعيد قراءة ملف حجمه 12 GB كل خمس ثوانٍ أسوأ من انقطاع الخدمة. أصلح الحد أو حجم السياق، ثم امسح الحالة باستخدام sudo systemctl reset-failed llama-server.
راقب القيمة الفعلية باستخدام systemctl show llama-server -p MemoryCurrent أثناء تشغيل طلب. يشرح تقييد ذاكرة العملية ووحدة المعالجة المركزية باستخدام systemd هذه التوجيهات بمزيد من التفصيل.
تجنب swap في هذا النوع من أعباء العمل. يحوّل النموذج الذي أُخرجت صفحاته إلى swap كل رمز إلى قراءات من القرص عند إزاحات عشوائية. يحقق تعيين ملف النموذج في الذاكرة التأثير نفسه مع ضرر أقل، لأن النواة تقرأ الصفحات التي تحتاج إليها مباشرة من الملف.
متى يكون Ollama الخيار الأفضل
هذه نقطة مفصلية. اختر llama-server عندما تريد عملية واحدة مع خيارات تحددها أنت، وإصداراً تثبّته، وملفاً تختاره، بحيث لا يتغير شيء من دون علمك لأن لا شيء آخر قيد التشغيل.
اختر Ollama عندما تريد إدارة النماذج: تنزيل النماذج بالاسم، والاحتفاظ بعدة نماذج على القرص، وإيقاف تحميل نموذج خامل، والترقية باستخدام أمر واحد بدلاً من إعادة البناء. هذا عمل فعلي كنت ستحتاج إلى كتابة نصوص برمجية لتنفيذه بنفسك. تشغيل Ollama على VPS ينفذ المهمة نفسها مع إجراء المقايضة في الاتجاه الآخر. يوفّر كلا الخيارين API متوافقاً مع OpenAI، لذلك يظل رمز العميل صالحاً عند التبديل في أي من الاتجاهين.
ترقية إصدار مُثبّت
استبدل bNNNNN بالوسم الذي تريد الانتقال إليه.
cd llama.cpp
git fetch --tags
git checkout bNNNNN
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_EXAMPLES=OFF
cmake --build build --config Release -t llama-server -j 2
sudo install -m 755 build/bin/llama-server /usr/local/bin/llama-server-bNNNNN
sudo ln -sfn /usr/local/bin/llama-server-bNNNNN /usr/local/bin/llama-server
sudo systemctl restart llama-serverيبقى الملف الثنائي القديم على القرص، لذلك لا تحتاج إلى التراجع إلا إلى ln -sfn للعودة إلى llama-server-b10488 ثم إعادة تشغيل واحدة. اقرأ ملاحظات الإصدار قبل الانتقال. ملفات GGUF مرتبطة بالإصدارات، وتستمر الملفات القديمة في التحميل، لكن أسماء الخيارات تتغير أحياناً: أصبح --mlock و--no-mmap مهجورين بالفعل لصالح --load-mode، ويفشل ملف الوحدة الذي يمرر خياراً محذوفاً عند بدء التشغيل، مع ظهور رسالة تفيد بوجود وسيطة غير معروفة.
أوضاع الفشل والرسائل التي ستظهر لك
error while loading shared libraries: libllama.so بعد نسخ الملف التنفيذي إلى مكان ما. ينشئ البناء الافتراضي مكتبات مشتركة إلى جانبه. أعد البناء باستخدام -DBUILD_SHARED_LIBS=OFF، أو انسخ دليل build/bin بالكامل.
Illegal instruction (core dumped) عند بدء التشغيل أو عند الطلب الأول. جرى تجميع الملف التنفيذي مع تفعيل GGML_NATIVE لمعالج CPU مختلف عن المعالج الذي يشغّله. أعد البناء على هذا الجهاز، أو اضبطه باستخدام -DGGML_NATIVE=OFF.
c++: fatal error: Killed signal terminated program cc1plus أثناء البناء. أوقف النظام المترجم بسبب استهلاكه مقداراً كبيراً من الذاكرة. خفّض -j، أو أضف swap أثناء البناء ثم أزله بعد ذلك.
curl: (7) Failed to connect ... Connection refused من الكمبيوتر المحمول. هذا صحيح: تستمع الخادم على عنوان loopback الخاص بـVPS. اختبر من داخل VPS نفسه، أو افتح نفقاً باستخدام ssh -L 8080:127.0.0.1:8080 user@your-vps واستخدم http://127.0.0.1:8080 محلياً.
HTTP 503 مع "message":"Loading model" خلال الثواني أو الدقائق الأولى بعد إعادة التشغيل. تستغرق قراءة ملف حجمه عدة gigabytes وقتاً، ويبلغ systemd عن أن الوحدة نشطة بمجرد بدء العملية، قبل وقت طويل من تحميل النموذج في الذاكرة.
تتوقف الطلبات عن الاستجابة ثم تُرجع 504 Gateway Time-out. أنهى الـproxy الانتظار قبل اكتمال النموذج. ارفع proxy_read_timeout، وعطّل proxy_buffering لكي تصل الرموز إلى العميل فور إنتاجها.
تتذبذب الوحدة ثم تتوقف مع start request repeated too quickly. هناك شيء ينهيها عند كل بدء تشغيل. افحص journalctl -u llama-server بحثاً عن سطر OOM killer، ثم خفّض --ctx-size، أو خفّض --parallel، أو ارفع MemoryMax.
FAQ
هل أشغّل خادم llama.cpp أم Ollama على VPS الخاص بي؟
شغّل llama-server عندما تريد تثبيت إصدار محدد بدقة، وتمرير flags محددة، والاحتفاظ بنموذج واحد في ملف واحد من دون أن يحدّثه أي شيء في الخلفية. شغّل Ollama عندما تريد إدارة النماذج وترقيتها بأمر واحد، لأن سحب النماذج بالاسم، والاحتفاظ بعدة نماذج على القرص، وإلغاء تحميل النماذج الخاملة، كلها مهام ستضطر إلى برمجتها بنفسك. يوفّر كلاهما API متوافقاً مع OpenAI، لذلك لا يتغير كود العميل إذا بدّلت بينهما لاحقاً.
ما إصدار llama.cpp الذي ينبغي أن أثبّته؟
استخدم أي tag بنيته واختبرته فعلياً. ينشئ llama.cpp tag تقريباً مع كل merge، وتكون أسماؤها أرقام بناء مثل b10488، الذي كان الأحدث في 18 August 2026. لا يوجد فرع stable مستقل، لذلك يتغير "current" عدة مرات يومياً. نفّذ clone باستخدام --branch <tag>، وثبّت binary باسم يتضمن ذلك tag، ثم وجّه symlink إليه، بحيث يصبح الترقية والرجوع إلى الإصدار السابق أمراً واحداً لكل منهما.
ما مقدار RAM الذي يحتاج إليه llama-server؟
ابدأ من حجم ملف GGUF، ثم أضف KV cache، الذي يزداد مع --ctx-size ومع عدد خانات --parallel. لا تكفي الأرقام المنشورة بدلاً من قياس إعدادك الفعلي، لأن الحجم الإجمالي يعتمد على النموذج، وquantisation، وسياق الطلب الذي تسمح به. شغّل systemctl show llama-server -p MemoryCurrent أثناء وجود طلب قيد التنفيذ، واستخدم الرقم الذي يظهر لك.
لماذا يعيد /health الرمز 503 مع الرسالة "Loading model"؟
بدأت العملية، لكن ملف النموذج لم يُحمّل إلى الذاكرة بعد، لذلك يعيد الخادم {"error":{"code":503,"message":"Loading model","type":"unavailable_error"}}. هذا طبيعي بعد كل إعادة تشغيل، ويستمر بقدر الوقت اللازم لقراءة الملف. تصبح المشكلة فعلية فقط عندما يتعامل client أو proxy مع أول 503 باعتباره فشلاً نهائياً. نفّذ polling على /health حتى يعيد {"status": "ok" }.
هل يمكنني إتاحة llama-server مباشرة على الإنترنت؟
لا تربطه بالعنوان 0.0.0.0 ولا تفتح المنفذ. لا يوفّر حسابات أو rate limiting أو سجل طلبات مناسباً للتدقيق، والفحص المضمّن الوحيد هو --api-key، الذي يقارن string واحدة. أبقِ الربط الافتراضي 127.0.0.1، وضع nginx أمامه مع TLS، واضبط --api-key أيضاً، حتى لا يؤدي خطأ واحد في إعدادات proxy إلى إتاحة النموذج للجميع.