نظرة عامة
كيشغّل هاد المشروع 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
hfCLI باش تكون التنزيلات القابلة للاستئناف أسرع. - اختياري: 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-TensorFold2. تشغيل السيرفر
./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.shPREPARE=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.pytools/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 حسب طريقة الخدمة ديالك والذاكرة المتاحة.
