פרפלקסיטי משחררת את לילי: מנוע הסקה צר־תכלית לקוון 3.6 על אפל סיליקון

פרפלקסיטי (Perplexity) פרסמה אתמול את לילי (Lily), מנוע ההסקה המקומי שמפעיל את Hybrid Compute במוצר Perplexity Computer, והפכה אותו לקוד פתוח. לילי אינה ספרייה כללית: זו ריצה (runtime) בתהליך יחיד שמכוונת למודל אחד, Qwen3.6-35B-A3B, ולמשפחת חומרה אחת, אפל סיליקון. שכבת ראסט (Rust) טוענת את הצ'קפוינט ומנהלת את לולאת הייצור, API תואם OpenAI chat-completions מזרים טוקנים, וקרנלים (kernels) שפותחו ידנית ב-Metal מריצים את המודל. לא פייטורץ' (PyTorch) ולא MLX נמצאים בנתיב הביצוע; הצרות המכוונת היא טיעון הביצועים.
ארכיטקטורת המודל ושלוש צורות עומס
Qwen3.6-35B-A3B מחזיק 35 מיליארד פרמטרים ומפעיל כ-3 מיליארד לטוקן. נתב (router) מדרג 256 מומחים ובוחר שמונה, לצד מומחה משותף אחד שרואה כל טוקן. המודל משלב 10 שכבות קשב מלא עם Grouped-Query Attention (16 ראשי שאילתה, שני ראשי מפתח/ערך) ו-30 שכבות Gated DeltaNet, סכמה שיוצרת שלוש תבניות עומס שונות: קבוצות מומחים לא אחידות, קשב על מטמון KV צומח, והישנות (recurrence) בגודל קבוע. כל אחת מהתבניות דורשת תוכנית הרצה שונה, ולילי מממשת את שלושתן בקרנלים ייעודיים.
פריפיל (prefill): משקלים דחוסים, ניתוב על ה-GPU
הצ'קפוינט ב-4-ביט משתמש בקוונטיזציה אפינית קבוצתית: כל קבוצה של 64 משקלות חולקת סקייל (scale) והטיה (bias) ב-bfloat16, כך ש-70 ג'יגה של משקלות bfloat16 נדחסים ל-19.4 ג'יגה. פעולות טנזור של Metal 4 צורכות bfloat16, ולכן המשקלות צריכים להיבנות מחדש; לילי עושה זאת אריח (tile) אחד בכל פעולה בתוך ה-GEMM המקובץ, מחזיקה תוצאות בזיכרון קבוצת תהליכונים (threadgroup) וצוברת ב-FP32, כך שהמערך המורחב לעולם לא מגיע לזיכרון המאוחד. באבלציה של פרפלקסיטי, ההיתוך הזה הקפיץ פריפיל מקצה לקצה ב-77.4% בפרומפט של 512 טוקנים. השארת היסטוגרמת הניתוב, סריקת קידומות (prefix scan), פיזור (scatter) ומיפוי בלוקים בתוך מאגר פקודות GPU יחיד הוסיפה 89% באותו אורך, על ידי הסרת סנכרון CPU בכל שכבת MoE. מעבר מאריחי 16 שורות ל-32 עם ארבע סימודגרופות (simdgroups) תרם 13.2% ב-2K, וסריקת Gated DeltaNet תושבת־אוגרים (register-resident) הוסיפה 5.6%. כ-90% מזמן הפריפיל מושקע ב-GEMM של מומחים, ולכן פרומפטים ארצים רצים במקטעים חסומים כדי שהפעלות זמניות לא יתחרו על זיכרון עם משקלות ומטמון.
דיקוד (decode): מזעור בתים מועברים לטוקן
בדיקוד באצווה של 1 כמעט אין שימוש חוזר במשקלות, ורוחב הפס קובע את התקרה. צעד מוקלט אחד שיגר 795 קרנלים שיצרו 555 שלבים עוקבים; לילי רושמת תלויות אמיתיות במעבר Metal מקביל כך שקרנלים בלתי תלויים חופפים. הטוקן הנבחר נכתב ישירות לחריץ הקלט השמור ב-GPU של הצעד הבא, ומבטל הקפת CPU (round trip) לכל טוקן, וארבע שרשראות קרנלים מולחמות שומרות ערכי ביניים באוגרים. קריאות מטמון מאוחדות (coalesced) העלו רוחב פס מפתח מ-33.8 ל-47.9 ג'יגה־בייט לשנייה ורוחב פס ערך מ-42.0 ל-61.8 ג'יגה־בייט לשנייה. אריזת GQA, ארבעה ראשי שאילתה חולקים קבוצת תהליכונים אחת כך שכל שורת KV נטענת פעם אחת, שיפרה דיקוד ב-23.8% ב-32K. פריסת קשב בבלוקים קבועים ב-32K ומעלה הניבה 7.7% ב-32K, 27.4% ב-64K ו-40.2% ב-128K.
תוצאות מול MLX-LM על M5 Max
על מק M5 Max עם 40 ליבות ו-128 ג'יגה זיכרון, באצווה 1, עם אותם בתי צ'קפוינט 4-ביט, נמדדו עשרה אורכים מ-256 עד 128K טוקנים מול הנתיב המהיר ביותר של MLX-LM. לילי השיגה ממוצע של 4,156 טוקנים לשנייה בפריפיל לעומת 3,388 (פי 1.23) ו-170.0 טוקנים לשנייה בדיקוד לעומת 126.4 (פי 1.35). בפרומפט 4K עם הקשר 4K הגיעה ל-5,749.9 טוקנים לשנייה בפריפיל ו-186.6 בדיקוד. הדמו העצמאי זמין במאגר pplx-garden; נדרש מק עם 24 ג'יגה זיכרון מאוחד מינימום ו-32 ג'יגה לתוצאות מיטביות, על macOS 15 ומעלה.