gekro
GitHub LinkedIn
Local LLM

مرحبًا Ollama: الاستدلال المحلي هو تأمينك المعماري

مدة القراءة: 6 د

هذه ترجمة آلية للنص الإنجليزي الأصلي. قد تضيع بعض الفروق الدقيقة، لذا تبقى النسخة الإنجليزية هي المرجع. اقرأ النص الأصلي بالإنجليزية

باختصار

تشغيل النماذج اللغوية على Raspberry Pi ليس مجرد هواية؛ إنه استراتيجية احتياطية لمرونة النظام.
الخصوصية هي الزاوية التسويقية للنماذج اللغوية المحلية، لكن المرونة هي الحقيقة الهندسية. أستخدم Together AI للأعمال الثقيلة، لكن عنقود Raspberry Pi لدي يشغّل نماذج Llama 3 مكمّمة عبر Ollama كاحتياط بلا تكلفة. يتناول هذا المقال النماذج ومستويات التكميم المحددة التي تعمل فعلًا على عتاد ARM دون أن تذيب اللوحة.

في المرة الأولى التي انقطع فيها الإنترنت لدي أثناء جلسة بناء متأخرة من الليل وكان لا يزال لدي نسخة Llama 3 محلية تجيب عن الأسئلة من جهاز Raspberry Pi الخاص بي، أدركت أننا بلغنا نقطة تحول. لم نعد نعتمد على اتصال دائم بمركز بيانات بمليارات الدولارات لمهام الاستدلال الأساسية. في مختبر Gekro، Ollama هو وثيقة التأمين المعمارية التي تُبقي وكلائي يعملون أثناء انقطاع أحد المزوّدين.

لم أبدأ من هناك لأسباب نبيلة. كان الدافع الفضول والتكلفة. أردت أن تعمل الأشياء باستمرار حتى أواصل التعلم، وكان الوصول إلى النماذج التي أردتها مقفلًا خلف إنفاق لم أرغب في الالتزام به. جهاز Pi يعمل بهدوء مقابل ثمن الكهرباء يحل الأمرين. أبطأ، نعم. لكنه يعمل.

البنية

إعدادي ليس جهازًا واحدًا؛ إنه سلسلة استدلال موزعة. أعطي الأولوية لـ Together AI للاستدلال السحابي عالي التعقيد، لكن “الجهاز العصبي” للمختبر يرتكز على عنقود من ثلاث عقد Raspberry Pi 5 (16GB لكل منها) يشغّل Ollama.

النموذجالحجممستوى التكميماستخدام الذاكرةالرموز/ثانية (Pi 5 16GB)أفضل حالة استخدام
Llama-3-8B4.7GBQ4_K_M~5.2GB4-6 t/sالاستدلال العام
Phi-3-Mini2.3GBQ4_0~2.8GB12-15 t/sالتصنيف السريع
Mistral-7B4.1GBQ4_0~4.5GB3-4 t/sاستخدام الأدوات / استدعاء الدوال

الترتيب أهم من العتاد. تأتي النماذج المجانية على OpenRouter أولًا، ويقع Pi في الوسط، ويكون OpenRouter المدفوع الملاذ الأخير. وهذا الموضع الأوسط ليس للزينة. عندما لا تتوفر الطبقة المجانية، وهو ما يحدث بما يكفي ليُلاحَظ، فإن Pi هو من يجيب. لقد أبقاني فعلًا أعمل في أيام كان البديل فيها هو الدفع.

استغرق الوصول إلى ذلك عدة جولات من التجربة والخطأ. ظللت أبدّل النماذج بحثًا عن النموذج المناسب، وكان الدرس في كل مرة هو نفسه: عندما كان النموذج الكبير بطيئًا جدًا، كان الحل عدد معاملات أقل وتكميمًا أشد، لا مزيدًا من الصبر.

في معمارية ARM64، يكون عرض نطاق الذاكرة هو عنق الزجاجة. ومع 16GB لكل عقدة، لدي متسع لتشغيل نماذج أكبر من أجهزة Pi النموذجية بذاكرة 8GB التي تراها على الإنترنت. وجدت أن التكميم بـ 4 بتات (Q4) هو النقطة المثلى: أي أقل من ذلك يفقد النموذج “حسه السليم”، وأي أعلى يقتطع من موارد النظام دون مكاسب ملموسة في الجودة.

البناء

إعداد Ollama على Linux (بما في ذلك WSL2 وRaspberry Pi OS) سطر واحد، لكن الهندسة الحقيقية تكمن في كيفية تغليفه.

1. التثبيت بلا واجهة

أشغّل عنقود Pi بلا واجهة رسومية. فقط SSH وخدمة systemd.

# Install Ollama on Linux/Pi
curl -fsSL https://ollama.com/install.sh | sh

# Serve Ollama on all network interfaces (required for cluster access)
sudo systemctl edit ollama.service

أضف متغير البيئة هذا إلى ملف الخدمة للسماح بالاستدعاءات الخارجية من محطة عملك الرئيسية:

[Service]
Environment="OLLAMA_HOST=0.0.0.0"

2. الهيكل الأساسي للتجريد

لا تستخدم واجهة Ollama الخام مباشرة في تجاربك. استخدم عميلًا يدرك الاحتياط. هذه نسخة مبسطة من المنطق الذي أستخدمه في المختبر كله.

import ollama
import logging

class LocalBrain:
    def __init__(self, model="llama3:8b"):
        self.model = model
        self.logger = logging.getLogger("GekroLocal")

    def inference(self, prompt: str) -> str:
        try:
            self.logger.info(f"Running local inference on {self.model}...")
            response = ollama.chat(model=self.model, messages=[
                {'role': 'user', 'content': prompt},
            ])
            return response['message']['content']
        except Exception as e:
            self.logger.error(f"Local inference failed: {e}")
            return "ERROR: Brain Offline"

# Running a quantized test on the Pi
if __name__ == "__main__":
    brain = LocalBrain(model="phi3:mini")
    print(brain.inference("What is the current state of the Raspberry Pi cluster?"))

اللوحة تخبرك أنها تعمل

يمكنك أن تسمع جهاز Pi وهو يفكر. جهازي كان يسخن، وتدور المروحة بسرعة، وبجلوسي بجانبه كنت أعرف أنه في منتصف موجّه دون النظر إلى الطرفية. الاختناق الحراري ليس سطرًا مجردًا في ورقة المواصفات بهذا الحجم؛ إنه ضجيج على مكتبك. خطط لتدفق الهواء قبل أي شيء آخر.

ملاحظة WSL2

إذا كنت تجرب هذا في WSL2 على Windows، فلدى Ollama الآن مثبّت أصلي لـ Windows يستفيد من وحدة GPU من NVIDIA. شغّل تطبيق Windows، ثم اضبط OLLAMA_HOST=172.x.x.x (عنوان IP لمحول Ethernet في Windows) داخل WSL2 للوصول إلى قوة وحدة GPU تلك من بيئة Linux.

المفاضلات

Raspberry Pi ليس H100. إذا حاولت تشغيل نموذج Llama 3-70B على Pi، فلن يكون بطيئًا فحسب؛ بل سينهي OOM killer العملية. وإذا كان التبديل (swap) مفعّلًا على بطاقة SD رخيصة، فقد يؤدي التخبط وحده إلى إتلاف نظام الملفات لديك.

أكبر إخفاق واجهته كان الاختناق الحراري. أثناء مهمة معالجة دفعية ثقيلة، بلغت حرارة Pi 5 الدرجة 85°C وانخفضت سرعة الاستدلال إلى 0.5 رمز في الثانية. في بيئة المختبر، التبريد النشط (تحية لعلبة Argon ONE) ليس اختياريًا للنماذج اللغوية المحلية؛ إنه إلزامي.

كذلك لا تتوقع “إبداعًا” بمستوى السحابة. النماذج المحلية المكمّمة ممتازة للاستخلاص والتلخيص والمنطق الأساسي. وهي سيئة في الفروق الدقيقة أو التخطيط الاستراتيجي عالي المستوى.

إلى أين يتجه هذا

أجرّب حاليًا التوجيه بأولوية التزامن: استخدام عقد Pi الثلاث كلها لمعالجة طلبات استدلال متوازية بدلًا من تقسيم نموذج واحد بينها. الهدف هو “دماغ سيادي” حقيقي لا يعمل كاحتياطي فحسب، بل كنظير محلي للنماذج السحابية قادر على التعامل مع عدة وكلاء يستدلون في وقت واحد.

Rohit Burani

بقلم

Rohit Burani

مهندس ذكاء اصطناعي يبني أنظمة محلية أولًا وبنية تحتية مستضافة ذاتيًا وأدوات مستقلة من المختبر.