vLLM Blogتاريخ نشر المصدر

دعم Flint على vLLM من اليوم 0

يدعم vLLM فلينت من Recursive اعتبارًا من اليوم 0. تعمل كلتا نقطتي التفتيش NVFP4 وBF16 على وحدة معالجة رسومات واحدة، ويفك ترميز الطلب الواحد بمعدل حوالي 500 رمز/ثانية على GB200 واحد، حتى مع سياق من 100K رمز.

يدعم vLLM فلينت من Recursive اعتبارًا من اليوم 0. تعمل كلتا نقطتي التفتيش NVFP4 وBF16 على وحدة معالجة رسومات واحدة، ويفك ترميز الطلب الواحد بمعدل حوالي 500 رمز/ثانية على GB200 واحد، حتى مع سياق من 100K رمز.

Flint هو نموذج MoE بـ 40B معامل يفعّل حوالي 2.5B معامل فقط لكل رمز، مع انتباه النافذة المنزلقة في معظم الطبقات وسياق من 262K رمز. يأتي في نقطتي تفتيش منفصلتين: NVFP4 (مدرّب بوعي التكميم) وBF16.

البداية السريعة

صورة Docker من اليوم 0 vllm/vllm-openai:flint (x86_64 وarm64، CUDA 13.0) تتضمن دعم Flint مدمجًا:

# NVFP4 checkpoint (GGUF): config and tokenizer come from the BF16 repo
docker run --gpus all --ipc=host -p 8000:8000 \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  vllm/vllm-openai:flint \
  RecursiveSI/flint-nvfp4-gguf \
  --hf-config-path RecursiveSI/flint --tokenizer RecursiveSI/flint \
  --enable-auto-tool-choice --tool-call-parser glm47 \
  --reasoning-parser glm47 --exclude-tools-when-tool-choice-none
 
# BF16 checkpoint
docker run --gpus all --ipc=host -p 8000:8000 \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  vllm/vllm-openai:flint \
  RecursiveSI/flint \
  --enable-auto-tool-choice --tool-call-parser glm47 \
  --reasoning-parser glm47 --exclude-tools-when-tool-choice-none

يتم حاليًا دمج دعم Flint في vLLM (#62938). مع نسخة من vLLM تتضمنه، قدّم النموذج بالطريقة نفسها:

# NVFP4 checkpoint (GGUF): config and tokenizer come from the BF16 repo
vllm serve RecursiveSI/flint-nvfp4-gguf \
  --hf-config-path RecursiveSI/flint --tokenizer RecursiveSI/flint \
  --enable-auto-tool-choice --tool-call-parser glm47 \
  --reasoning-parser glm47 --exclude-tools-when-tool-choice-none
 
# BF16 checkpoint
vllm serve RecursiveSI/flint \
  --enable-auto-tool-choice --tool-call-parser glm47 \
  --reasoning-parser glm47 --exclude-tools-when-tool-choice-none

بنية النموذج

Flint هو نموذج MoE بتنسيق pre-norm من 49 طبقة بحجم مخفي 2048. ما يميزه هو قلة الجزء الذي ينظر إلى السياق الكامل.

الشكل 1: حزمة طبقات Flint وطبقتاه الفرعيتان. يشير اللون الذهبي إلى ما يختلف عن MoE قياسي بتنسيق pre-norm. افتحه بالشاشة الكاملة.

  • انتباه محلي في معظمه. 35 طبقة تنتبه إلى نافذة منزلقة من 513 رمزًا مع RoPE؛ والطبقات الـ 14 الأخرى تنتبه إلى السياق الكامل دون ترميز موضعي. فقط تلك الطبقات الـ 14 تحتفظ بـ KV للتسلسل كاملًا، لذا تكلّف الذاكرة المؤقتة 28 KiB لكل رمز.
  • مصادر انتباه (sinks) متعلّمةوGQA مع 32 رأس استعلام و4 رؤوس KV، وRMSNorm لكل رأس للـ Q/K.
  • 256 خبيرًا، مع sigmoid وtop-6، بالإضافة إلى خبير مشترك. الطبقتان 0 و1 تستخدمان MLP كثيفة بدلًا من ذلك.

نقطة تفتيش NVFP4 هي ملف GGUF تُعد كتلُه بتنسيق NVFP4 من NVIDIA بترتيب بايتات مختلف. يعيد vLLM تجميعها دون فقدان عند التحميل ويشغّلها weight-only (W4A16)، مع تفعيلات وذاكرة KV مؤقتة بتنسيق BF16، كما يفعل التطبيق المرجعي من Recursive. تتبع كل نواة Flint في هذا التطبيق نقاط التقريب المرجعية، وتطابقه الدقة على GSM8K وGPQA-Diamond وlong-context MRCR ومجموعة استدعاء الأدوات.

التحسينات

كانت أولى تطبيقاتنا، المبنية من طبقات vLLM القياسية، بطيئة عند أحجام الدفعات الصغيرة: كانت خطوة فك الترميز تشغّل 1,096 نواة، كثير منها مضبوط لدفعات أكبر بكثير. استبدلناها بنوى خاصة بـ Flint تغييرًا واحدًا في كل مرة، ونتحقق من كل تغيير مقابل التطبيق المرجعي.

الشكل 2: كتمقُدّيم النموذج على GB200 واحد بعد كل تغيير، لفك ترميز بدفعة 1 عند سياق 100K وتمهيد (prefill) بـ 8,192 رمزًا. بدّل بين نقطتي التفتيش، أو اعرض الجدول لكل الأشكال. افتحه بالشاشة الكاملة.

  • دمج معيار Q/K وRoPE وكتابة ذاكرة KV المؤقتة في نواة واحدة (−8%): نواة واحدة بدلًا من ثلاث.
  • نوى MoE للدفعات الصغيرة (−27%): عمليات GEMV للموجّه والخبراء التي تقرأ أوزان الخبراء المُحدَّدين فقط. وهي أيضًا أكبر مكسب في مرحلة prefill.
  • GEMV كثيف بدفعات صغيرة (بنسبة −25%) على نفس أوزان NVFP4 المعبأة المستخدمة مع نواة الدفعات الكبيرة.
  • أنوية Norm وSiLU (−10%) التي تتبع تقريب المرجع.
  • فكّ رموز الانتباه (−5%) مع المصارف والنوافذ المنزلقة، في CuTe DSL.
  • مسار فك الترميز منخفض زمن الاستجابة (−14%)، كما هو موضح أدناه.

لغاية 8 طلبات، يشغّل مسار زمن الاستجابة المنخفض كل طبقة MoE كسبع نوى: تطبيع Q/K وRoPE والتوجيه ودمج الخبراء تُدمج في نوى GEMV المجاورة. تُطلق كل نواة بإطلاق تابع برمجي، فتقوم بتحميل أوزانها بينما النواة السابقة لا تزال تعمل.

الشكل 3: النوى السبع لطبقة MoE واحدة على مسار فك الترميز منخفض زمن الاستجابة.

في المجموع، انخفض فك ترميز NVFP4 من 4.81 إلى 1.78 ms (بمعامل 2.7×)، وفك ترميز BF16 من 3.53 إلى 2.34 ms (بمعامل 1.5×)، والمعالجة التمهيدية لـ 8K رمزاً من 207 إلى 145 ms (بمعامل 1.4×). تشغّل التمريرة الأمامية الآن 346 نواة بدلاً من 1,096. عند الخدمة من طرف إلى طرف، يستغرق فك الترميز بحجم الدفعة 1 عند سياق 100K رمز 2.06 ms لكل رمز (نحو 485 رمزاً/ثانية)، وهو التمريرة الأمامية مع رأس LM وأخذ العينات.

ملاحظات الاستخدام

  • يُصدر Flint استدعاءات أدوات وكتل تفكير بأسلوب GLM-4.7، ومن ثمّ فإن glm47 المحللات. --exclude-tools-when-tool-choice-none يحذف تعريفات الأدوات من المطالبة عندما tool_choice هو "none"، بما يطابق المرجع.
  • إعدادات أخذ العينات الافتراضية هي temperature 1.0 وtop-p 0.95 وtop-k 20. يُحتسب الاستدلال ضمن max_tokens، لذا اسمح بـ 32K على الأقل للمسائل الصعبة.
  • نوى Flint تستهدف وحدة معالجة رسومات Blackwell واحدة (TP=1، ذاكرة تخزين مؤقت BF16 KV)؛ أما التكوينات الأخرى فتعود إلى الطبقات القياسية في vLLM.
المصدر الأصلي

vLLM Blog

ملاحظات المحتوى

النشر الأصلي والحقوق تعود إلى المصدر.

ترجمة آلية · يُرجى الرجوع إلى الأصل