دوز مباشرة للمحتوى الرئيسي
دروس فالذكاء الاصطناعي

شغّل Qwen3.8 Flash Next فوق DGX Spark واحد باستعمال TensorFold

تعلّم كيفاش تثبّت وتشغّل وتختبر وتحسّن Qwen3.8 Flash Next فوق NVIDIA DGX Spark واحد. هاد الشرح كيغطي سكريبتات النشر ديال TensorFold، وطلبات الدردشة المتوافقة مع OpenAI، وإدخال الصور والفيديو، وإعدادات الاستدلال، وضبط الذاكرة، والمراقبة، واختبارات الأداء.

شغّل Qwen3.8 Flash Next فوق DGX Spark واحد باستعمال TensorFold

نظرة عامة

كيشغّل هاد المشروع Qwen3.8 Flash Next من NVIDIA DGX Spark وحدة، عبر API متوافق مع OpenAI. كيستعمل TensorFold v0.3.6.3، وcheckpoint بصيغة MLX و4-bit فيه رأس تخمين MTP، ومجموعة ديال التعديلات المصممة باش تسرّع معالجة الـprompt بلا ما تبدّل النص المولّد.

الإعداد الافتراضي كيدعم خمسة طلبات متزامنة، وكل طلب عندو نافذة السياق الكاملة ديال الموديل، اللي فيها 262,144 token. وكيحمّل حتى vision tower ديال الموديل على CUDA، وهادشي كيخلي رسائل الدردشة تقدر تحتوي على تصاور وفيديوهات.

  • معرّف الموديل فـAPI: Qwen3.8-Flash-Next
  • نقطة النهاية الافتراضية: http://<spark-address>:8888/v1
  • الـstreams المتوازية: 5
  • السياق لكل stream: 262,144 token
  • مجموع مخزون KV: 1,310,720 token
  • ذاكرة KV المؤقتة: int8 افتراضياً
  • أنماط الإدخال: النص، التصاور، والفيديوهات

المزايا الرئيسية

استدلال متزامن بسياق طويل

TensorFold كيعطي لكل stream cache كامل ديال السياق بوحدو. فالإعدادات الافتراضية، كل واحد من خمسة streams كياخذ نافذة prompt والجواب ديالها فيها 262,144 token. ومخزون KV بصيغة int8 الناتج كياخذ تقريباً 23.4 GiB.

خدمة متوافقة مع OpenAI

السيرفر كيوفّر نقاط نهاية بحال /v1/models و/v1/chat/completions. الزبناء المتوافقين مع OpenAI يقدرو يتاصلو غير بتبديل عنوان الأساس واختيار معرّف الموديل Qwen3.8-Flash-Next.

الـprompts متعددة الوسائط

رسائل المستخدم تقدر تحتوي على أجزاء محتوى من نوع image_url وvideo_url بالطريقة ديال OpenAI. صيغ التصاور المدعومة كتشمل JPEG وPNG وWebP. الفيديوهات تقدر تكون بصيغة MP4 أو WebM أو MOV أو MKV، أو أي صيغة أخرى يقدر FFmpeg يفكّ ترميزها.

معالجة معدّلة للـprompts

تعديلات TensorFold المرفقة كتضيف القراءة الاستباقية من SSD، وقراءات أصلية متعددة الخيوط، وتحسين اختيار كتل sparse attention، وchunks قابلة للضبط للـprompt، ونسخ التخمينات، وعدّادات حية للـtokens، ودعم الرؤية فـFlash Next. حسب القياسات ديال المستودع، معالجة الـprompt أسرع تقريباً بـ1.7 مرة من النسخة غير المعدّلة اللي تقارنت معاها، بينما الأجوبة النصية اللي تختبرات بقات مطابقة للبايتات.

متطلبات النظام

وجد الـhost قبل ما تنسخ المستودع:

  • NVIDIA DGX Spark أو أي نظام آخر GB10 فيه 128 GB ديال الذاكرة الموحدة.
  • حوالي 115 GiB ديال الذاكرة الحرة عند تشغيل الإعداد الافتراضي.
  • Docker مع NVIDIA container runtime.
  • حساب مستخدم منتمي لمجموعة docker.
  • حوالي 160 GB ديال المساحة الحرة فالقرص فالنظام الجديد.
  • اختياري: أداة Hugging Face hf CLI باش تكون التنزيلات القابلة للاستئناف أسرع.
  • اختياري: token ديال Hugging Face فـ~/.cache/huggingface/token أو فمتغير البيئة HF_TOKEN.

النشر الافتراضي مخصص لـDGX Spark ما خدام عليه حتى شي حمل آخر. فأنظمة الذاكرة الموحدة، إلا سالات الذاكرة ممكن الجهاز يتجمّد عوض ما يعطي خطأ عادي ديال التخصيص.

التثبيت والتشغيل الأول

1. نسخ المستودع

git clone https://github.com/MiaAI-Lab/Qwen3.8-Flash-Next-Single-DGX-Spark-TensorFold.git
cd Qwen3.8-Flash-Next-Single-DGX-Spark-TensorFold

2. تشغيل السيرفر

./start.sh

فالتشغيل الأول كيتدار الإعداد كامل. كيسحب صورة الحاوية الجاهزة إلا كانت متوفرة، وكينزّل checkpoint اللي الحجم ديالو تقريباً 106 GiB، وكيحقّق منو، وكيكمبايل CUDA kernels لـGB10. صورة الحاوية الجاهزة حجمها تقريباً 11 GB، بينما checkpoint كياخذ حوالي 114 GB فـcache ديال Hugging Face.

أثناء الإقلاع، السكريبت كيعرض تقدّم الإعداد، وسجلات السيرفر، وتقدّم تحميل الأوزان، وتقديرات الذاكرة. من بعد كيدير smoke test. التشغيل الناجح كيسالي برسالة كتقول إن Qwen3.8-Flash-Next خدام فالبورت 8888.

فالتشغيلات اللاحقة، الأعمال اللي كملات كتتخطّى، وكيحتاج تحميل الأوزان تقريباً 2.5 دقيقة، حسب README.

3. التحضير بلا تشغيل

إلا بغيتي تنزّل وتبني كلشي من قبل، شغّل:

scripts/prepare.sh

باش تعاود تبني صورة الحاوية من الصفر:

scripts/prepare.sh --rebuild

سكريبت التحضير كيتحقق من Docker، وNVIDIA runtime، والمساحة فالقرص. من بعد كيجيب أو كيبني صورة TensorFold، وكينزّل checkpoint فـcache ديال Hugging Face، وكيتحقق من الموديل باستعمال tensorfold info.

الاستعمال الأساسي ديال API

التحقق من الموديل المتاح

curl -s http://<spark-address>:8888/v1/models

بدّل <spark-address> باسم المضيف أو بعنوان IP ديال DGX Spark. إلا كنت كتستعملو من Spark نفسو، تقدر تستعمل 127.0.0.1.

إرسال طلب إكمال دردشة

curl -s http://<spark-address>:8888/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "Qwen3.8-Flash-Next",
    "messages": [
      {
        "role": "user",
        "content": "كتب دالة Fibonacci بلغة Python."
      }
    ],
    "max_tokens": 1000
  }'

الموديل كيفكّر قبل ما يجاوب افتراضياً، والتفكير ديالو كيتحسب من الحد المسموح به ديال tokens فالاستجابة. عيّن max_tokens بقيمة كافية باش تستوعب التفكير والجواب النهائي بجوج. التفكير كيرجع فـreasoning_content، بينما الجواب النهائي كيبان فـcontent.

ربط زبون متوافق مع OpenAI

ضبط الزبون بهاد القيم:

  • عنوان الأساس: http://<spark-address>:8888/v1
  • الموديل: Qwen3.8-Flash-Next

الواجهة البرمجية كتدعم البثّ، واستدعاءات الأدوات المقيّدة بالأنواع، ومحتوى الاستدلال، وإدخال الصور، وإدخال الفيديو. معاملات الأدوات بحال المصفوفات كترجع باستعمال أنواع JSON المطابقة ديالها.

إرسال الصور

افتراضياً، خاص الوسائط تتوفّر على شكل عناوين URL ديال البيانات. المثال التالي فـ shell كيحوّل صورة JPEG لترميز وكيطلب من النموذج يوصفها:

IMG=$(base64 -w0 photo.jpg)
curl -s http://<spark-address>:8888/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "Qwen3.8-Flash-Next",
    "messages": [{
      "role": "user",
      "content": [
        {
          "type": "image_url",
          "image_url": {
            "url": "data:image/jpeg;base64,'"$IMG"'"
          }
        },
        {
          "type": "text",
          "text": "What is in this picture?"
        }
      ]
    }],
    "max_tokens": 2000
  }'

الطلب الواحد يقدر يحتوي حتى لأربع صور. كل صورة تقدر توصل حتى لـ 10 MB، والحدّ الإجمالي هو 20 MB. الصور كاملة تقدر تستعمل حتى لـ 4,096 token. إلا عيّنت "detail": "low" كتتحدّ الصورة فـ 256 token.

إرسال الفيديوهات

الفيديوهات كتستعمل جزء محتوى من نوع video_url:

{
  "type": "video_url",
  "video_url": {
    "url": "data:video/mp4;base64,..."
  }
}

كل طلب يقدر يحتوي حتى لجوج فيديوهات. الفيديو الواحد يقدر يوصل حتى لـ 64 MB، بحدّ إجمالي للطلب قدره 96 MB وما يصل حتى لساعة وحدة من اللقطات. افتراضياً، الخادم كياخذ جوج إطارات فالثانية، بحدّ أقصى 256 إطار موزّعة على الفيديو، وكيتيح حتى لـ 16,384 token ديال الفيديو فكل طلب.

المطالبات ديال الصور والفيديو ما كتحتافظش بها إعادة استعمال البادئة. الطلبات النصية العادية ما كتتأثرش بتفعيل الرؤية.

السماح بعناوين URL عامة للوسائط عبر HTTPS

عناوين URL ديال البيانات هي الافتراضية. باش تخلي الخادم يجلب عناوين URL عامة للصور والفيديو عبر HTTPS، عاود شغّلو بهاد الأمر:

VISION_URLS=1 ./start.sh restart

فعّل الجلب عن بُعد غير إلا كان مناسباً لأمان النشر ديالك وسياسة الشبكة ديالك.

التشغيل فالوضع النصي فقط

عطّل برج الرؤية باش تخدم بالنص فقط:

VISION=0 ./start.sh restart

الوضع النصي فقط ما كيحمّلش برج الرؤية اللي حجمو 0.84 GiB، وكيستعمل مجموعات مطالبات من 4,096 صف عوض القيمة الافتراضية ديال 2,048 صف مع تفعيل الرؤية.

تدبير الخادم

استعمل سكريبتات التغليف ديال المستودع للعمليات المعتادة:

./start.sh restart
./stop.sh
docker logs -f qwen38-flash-next-tf
curl -s http://<spark-address>:8888/health
  • ./start.sh restart كيتحقق من الإعدادات والوسائط قبل ما يعوّض الخادم اللي خدام.
  • ./stop.sh كيوقف الحاوية وكيحرّر ذاكرة GPU. الطلبات النشيطة كتتقطع.
  • docker logs -f كيتبع سجل خادم TensorFold.
  • /health كيعرض الحالة ديال الانشغال ومجاميع token الحالية.

إلا كان الخادم خدام من قبل، فـ ./start.sh بلا وسائط كيخليه كما هو. بالنسبة لمدير عمليات بحال systemd، استعمل وضع المقدّمة:

FOREGROUND=1 ./start.sh

تهيئة السياق والتوازي ودقّة KV

الإعدادات الافتراضية مخزّنة فـ scripts/config.sh. بدّلها بمتغيّرات البيئة أو مرّر خيارات TensorFold من بعد start.sh.

تقليل التوازي باش تزيد المساحة المتاحة

PARALLEL=4 ./start.sh restart

أربعة تدفقات int8 كيوفّرو مجمّع KV فيه 1,048,576 token، ومعاهم تقدير مُعلن عند بدء التشغيل قدره تقريباً 97.7 GiB.

استعمال نافذة سياق أقصر

./start.sh restart --context 131072

المعاملات الإضافية ديال سطر الأوامر كتدوز لـ tensorfold serve من بعد الإعدادات الافتراضية، وبهذا كتكون عندها الأولوية. شغّل ./start.sh --help باش تشوف الخيارات المتاحة.

اختيار نوع آخر لذاكرة KV المؤقتة

KV_DTYPE كيقبل bf16 أو int8 أو int4:

PARALLEL=6 KV_DTYPE=int4 ./start.sh restart

الـ README كيشير إلى أن int4 كيبدّل المخرجات شوية وما كيوفّرش قياساً للجودة. استعمل int8 إلا بغيتي التوازن الافتراضي ديال المشروع. استعمل bf16 إلا كانت ذاكرة KV بالدقّة الكاملة أهم عندك من عدد التدفقات.

فهم الحماية عند بدء التشغيل

TensorFold كيحسب الميزانية انطلاقاً من الذاكرة المتاحة ناقص احتياطي للمضيف كيساوي عُشر RAM. إلا ما ناسباتش التهيئة المطلوبة، كيترفض بدء التشغيل قبل تحميل الأوزان، والخطأ كيحدّد نافذة سياق خاصها تناسب.

التحكم فالتفكير وأخذ العينات

القيم الافتراضية لأخذ العينات فـ وضع التفكير هي temperature 1.0، وtop-p 0.95، وtop-k 20. الطلبات تقدر تبدّل temperature وtop_p وtop_k وseed. القيمة 0 فـ temperature كتفعّل فكّ الترميز الجشع.

تعطيل التفكير فطلب واحد

{
  "model": "Qwen3.8-Flash-Next",
  "messages": [
    {"role": "user", "content": "Answer in one sentence."}
  ],
  "chat_template_kwargs": {
    "enable_thinking": false
  },
  "max_tokens": 200
}

تحديد مجهود الاستدلال

{
  "chat_template_kwargs": {
    "reasoning_effort": "low"
  }
}

القالب كيقبل حتى "xhigh". إلا ما تحدّدش مجهود الاستدلال، القالب كيستعمل القيمة الافتراضية المتوسطة ديالو. الحقل العلوي reasoning_effort بأسلوب OpenAI كيتجاهل، لذلك حطّو داخل chat_template_kwargs.

نصائح متقدمة للأداء

الاحتفاظ بجداول n-gram على SSD

الإعداد الافتراضي PLE_ON_SSD=1 كيخلّي 29.8 GiB من جداول n-gram على SSD عوض ما يحطّها فالذاكرة الموحّدة. هاد الشي كيوفّر الذاكرة لذاكرة KV المؤقتة. لذلك، التخزين المحلي السريع مهم فالإعداد الافتراضي.

ضبط حجم مجموعات المطالبات بحذر

ملي كتكون الرؤية مفعّلة، TENSORFOLD_PREFILL_ROWS كيتضبط تلقائياً على 2048 باش يخلي بلاصة لبرج الرؤية. فالنمط ديال النصوص بوحدها، القيمة الافتراضية هي 4096. كايقول README باللي 4,096 صف يقدرو يحسّنو معالجة الـprompt تقريباً بـ2–5% مع prompts فيهم تقريباً 3,000 token، ولكن كيحتاجو حوالي 0.94 GiB زايدة فالذاكرة.

TENSORFOLD_PREFILL_ROWS=4096 ./start.sh restart

طلّع هاد القيمة غير إلا كانت الذاكرة المتاحة كافية.

التحكم فـMTP ونسخ المسودات

إعداد MTP الافتراضي كينتج فالأقصى ست مسودات فكل دورة، وكيحبس السلسلة قبل ما تهبط ثقة المسودة لأقل من 60%. تحسين نسخ المسودة كيتفعّل بـTENSORFOLD_MTP_COPY=1 وكيحتاج على الأقل جوج ديال التدفقات المتوازية. هاد الإعداد مخصّص باش يحسّن الردود اللي كتنقل ولا كتعدّل نص سابق من الـprompt.

طلب فكّ الترميز المرجعي التسلسلي

باش تتجاوز إنشاء المسودة فطلب معيّن وتستعمل المسار المرجعي ديال TensorFold، اللي كيعالج token بواحدو، زِد:

{
  "draft": false
}

هاد الشي مفيد ملي كتبغي تقارن بين فكّ الترميز التخميني والمرجع التسلسلي.

فرض التحضير أو تخطّيه

PREPARE=1 ./start.sh restart
PREPARE=0 ./start.sh restart
PULL=0 scripts/prepare.sh
  • PREPARE=1 كيفرض التحقق من التحضير قبل إعادة التشغيل.
  • PREPARE=0 كيتخطّى التحضير.
  • PULL=0 كيبني الصورة محلياً بلا ما يحاول يستعمل صورة السجل الجاهزة.

من بعد ما تبدّل الملفات فـpatches/، عاود بنِ الصورة باش تدخل هاد الترقيعات فـTensorFold.

التحقق وقياس الأداء

المستودع فيه أدوات كتتاصل بسيرفر خدام. عنوان API الافتراضي ديالها هو http://127.0.0.1:8888.

tools/bench.py local-test
tools/needle.py
tools/toolcheck.py
tools/visioncheck.py
  • tools/bench.py كيقيس أحجام مختلفة ديال الـprompt وكيجري اختبار قصير لفكّ الترميز.
  • tools/needle.py كيخبي عبارة سرية فـprompt فيه تقريباً 195,000 token وكيحقق واش تْسترجعات.
  • tools/toolcheck.py كيتحقق واش معامل أداة قيمتو array كيرجع على شكل JSON array.
  • tools/visioncheck.py كيرسل صورة مولّدة فيها دائرة حمرا ومربّع زرق، ومن بعد كيتحقق واش بجوج تْتعرّفو.

باش تختبر من جهاز آخر، عيّن API_URL:

API_URL=http://<spark-address>:8888 tools/bench.py remote-test

الأداء المتوقع

المستودع كيعطي نتائج فكّ الترميز التالية على DGX Spark واحد باستعمال تخزين KV بـint8، وجداول n-gram مدعومة بـSSD، وإنشاء المسودات بـMTP:

  • طلب واحد: 62.4 token فالثانية، مع 152 ms حتى لأول token.
  • جوج طلبات: 90.5 token فالثانية كمجموع.
  • ربعة طلبات: 106.7 token فالثانية كمجموع.
  • خمسة طلبات: 119.3 token فالثانية كمجموع، أو 27.0 token فالثانية لكل طلب.

سرعة الـprefill المعلنة كتتراوح تقريباً من 2,503 token فالثانية مع prompt فيه 8,229 token، حتى 2,200 token فالثانية مع prompt فيه 131,110 token. هاد الأرقام هي قياسات ديال المشروع وماشي ضمانات، وقد تختلف حسب الإعدادات، وبنية الـprompt، والمدخلات الإعلامية، والتخزين، والذاكرة المتاحة.

الخلاصة

هاد المستودع كيجمع الموديل، ووقت تشغيل TensorFold، والإعداد الخاص بـCUDA، وترقيعات الأداء، والسكريبتات التشغيلية اللازمة باش تخدم Qwen3.8 Flash Next على DGX Spark واحد. بدا بالإعداد الافتراضي ديال int8 وخمسة ديال التدفقات، وتحقق من الخدمة عبر API المتوافق مع OpenAI، ومن بعد عدّل التوازي، وحجم السياق، والرؤية، ودقة KV حسب طريقة الخدمة ديالك والذاكرة المتاحة.