בצע אופטימיזציה להסקת LLM: vLLM עם PagedAttention ו-Continuous Batching

אם אתם משתמשים ב-LLMs בסביבת production, כנראה נתקלתם ב-latency גבוה ובניצול לא יעיל של GPU. אנחנו מיישמים vLLM עם PagedAttention ו-continuous batching כדי להאיץ את ה-inference ולהוזיל עלויות חומרה. הצוות שלנו מספק אופטימיזציה turnkey—מבדיקת מערכת ועד קונפיגורציה ותמיכה שוטפת—ומבטיח ביצועים אמינים גם בעומסים גדלים.

תחומי פיתוח AI

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

האצת הסקת LLM: vLLM עם PagedAttention ו-Continuous Batching

אתה מריץ מודלי שפה גדולים בסביבת ייצור ונתקל בחביון גבוה, תפוקה נמוכה וניצול לא יעיל של GPU. כל אלפית שנייה חשובה, ובכל זאת הצינור שלך מעבד רק עשרות טוקנים לשנייה לכל בקשה. אנו משתמשים ב-vLLM—מנוע ההסקה בקוד פתוח שהפך לסטנדרט בייצור—כדי לפתור בעיות אלה ברמת הארכיטקטורה. החידוש המרכזי שלו, PagedAttention, מנהל את מטמון ה-KV כמו זיכרון וירטואלי של מערכת הפעלה, מבטל פרגמנטציה ומגביר את התפוקה פי 15–24 בהשוואה ל-HuggingFace transformers נאיבי. בניסיון שלנו, vLLM מעבד מאות בקשות בשנייה על חומרה קיימת, ומספק ביצועים יציבים. חיסכון בעלויות GPU יכול להגיע לפי 2–3, קריטי לסקייל. לדוגמה, לקוח אחד הפחית את הוצאות ההסקה שלו מ-$15,000 ל-$5,000 בחודש לאחר מעבר ל-vLLM עם קוונטיזציה של AWQ.

מקור: תיעוד רשמי של vLLM ומדדים פנימיים

בעיות שאנו פותרים

חביון גבוה ותפוקה נמוכה

HuggingFace transformers סטנדרטיים בנויים לניסויים, לא לייצור. כל בקשה מעובדת באופן עצמאי—ללא batching, ללא שימוש חוזר במטמון KV. זיכרון VRAM מתבזבז על אחסון מטמון מלא לכל רצף, ואין הפרדה בין prefill ל-decode. התוצאה: 10–50 טוקנים/שנייה לכל בקשה. vLLM, עם continuous batching ו-PagedAttention, משיג 500–2000 טוקנים/שנייה על אותו GPU. זה פי 20–50 מהר יותר.

מטמון KV מפוצל

יישומים נאיביים מקצים זיכרון רציף למטמון key-value של כל רצף, מה שמוביל לפרגמנטציה וניצול ירוד. PagedAttention מפחית זאת על ידי חלוקת המטמון לדפים בגודל קבוע (בדרך כלל 16 טוקנים), המוקצים לפי דרישה. דפים יכולים להיות לא רציפים, ושיתוף קידומות מאפשר שימוש חוזר בקידומות נפוצות (למשל, system prompts). זה מבטל פרגמנטציה וממקסם את ניצול ה-VRAM.

עלויות GPU מופרזות

הרצת LLM בייצור דורשת לעיתים קרובות מספר GPUs מתקדמים עם יעילות ניצול נמוכה. האופטימיזציות של vLLM—batching דינמי, מקביליות מודל וקוונטיזציה—מצמצמות את דרישות ה-GPU. על A100 80GB אחד, Mistral-7B-Instruct עם vLLM ו-AWQ 4-bit השיג 52.3 בקשות/שנייה עם חביון P99 של 7 שניות, בהשוואה ל-1.2 בקשות/שנייה עם HuggingFace transformers (batch=1). העלות לכל בקשה יורדת ביותר מפי 40. חיסכון בפועל: מ-$15k ל-$5k בחודש עבור עומס צ'אטבוט טיפוסי.

איך אנחנו עושים את זה: יישום ברמת מומחה

הגישה שלנו משלבת הבנה עמוקה של הסקת LLM עם ניסיון מעשי בפריסת vLLM בייצור. אנחנו לא רק מגדירים פרמטרים—אנחנו מנתחים את עומס העבודה, המודל והחומרה שלך כדי לתכנן את התצורה האופטימלית.

מקרה בוחן: העברת שירות צ'אטבוט מ-HF ל-vLLM

לקוח עם צ'אטבוט מול משתמשים שהריץ Mistral-7B-Instruct על 8 GPUs מסוג A100 השתמש ב-HuggingFace transformers סטנדרטיים. הם חוו חביון ממוצע של 8 שניות ויכלו לטפל רק ב-15 משתמשים במקביל. לאחר ההעברה שלנו:

  • פריסת vLLM עם continuous batching, מקביליות טנזור 2, קוונטיזציה AWQ 4-bit.
  • הגדרנו את pip install vllm python -m vllm.entrypoints.openai.api_server \ --model mistralai/Mistral-7B-Instruct-v0.3 \ --tensor-parallel-size 1 \ --max-model-len 8192 \ --max-num-seqs 256 \ --gpu-memory-utilization 0.90 \ --host 0.0.0.0 \ --port 8000 ל-256, from openai import OpenAI client = OpenAI(base_url="http://localhost:8000/v1", api_key="none") response = client.chat.completions.create( model="mistralai/Mistral-7B-Instruct-v0.3", messages=[{"role": "user", "content": "Explain transformer attention"}], max_tokens=500, temperature=0.7 ) ל-32.
  • תוצאה: החביון ירד ל-1.2 שניות, התפוקה עלתה ל-250 משתמשים במקביל, מספר ה-GPUs ירד מ-8 ל-4, חיסכון של 50% בעלויות תשתית ($8k בחודש ל-$4k בחודש).

Continuous Batching בפעולה

Batching דינמי מאפשר לשרת להתחיל לעבד בקשה חדשה מבלי לחכות לסיום בקשות קודמות. vLLM מיישם זאת ברמת מטמון ה-KV, ומוסיף או מסיר רצפים מהמעבר הנוכחי בצורה דינמית. בניגוד ל-static batching (שבו בקשות מצטברות במאגר), batching דינמי ממזער זמן סרק של GPU ויכול להגביר את התפוקה בעד 50%.

pip install vllm
python -m vllm.entrypoints.openai.api_server \
    --model mistralai/Mistral-7B-Instruct-v0.3 \
    --tensor-parallel-size 1 \
    --max-model-len 8192 \
    --max-num-seqs 256 \
    --gpu-memory-utilization 0.90 \
    --host 0.0.0.0 \
    --port 8000
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="none")
response = client.chat.completions.create(
    model="mistralai/Mistral-7B-Instruct-v0.3",
    messages=[{"role": "user", "content": "Explain transformer attention"}],
    max_tokens=500,
    temperature=0.7
)

אופטימיזציה מתקדמת: מקביליות מודל וקוונטיזציה

עבור מודלים גדולים יותר כמו LLaMA-70B, מקביליות מודל מחלקת שכבות על פני מספר GPUs. אנו משתמשים בדרך כלל ב-4 GPUs עם bfloat16, ומשיגים האצה של פי 3–4.

python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3-70b-instruct \
    --tensor-parallel-size 4 \
    --dtype bfloat16 \
    --max-model-len 16384 \
    --gpu-memory-utilization 0.95

קוונטיזציה עם AWQ 4-bit מפחיתה את השימוש ב-VRAM ב-60–70%. לדוגמה, Mistral-7B ב-BF16 משתמש בכ-14 GB; ב-AWQ הוא משתמש בכ-4 GB, מה שמאפשר יותר בקשות במקביל על אותו GPU.

python -m vllm.entrypoints.openai.api_server \
    --model TheBloke/Mistral-7B-Instruct-v0.3-AWQ \
    --quantization awq --dtype auto

עבור GPUs מסוג H100, קוונטיזציה FP8 נותנת האצה של פי 2 בהשוואה ל-FP16 עם ירידה מינימלית באיכות.

Decoding ספקולטיבי ליצירה מהירה יותר

אנו מיישמים decoding ספקולטיבי שבו מודל טיוטה קטן (למשל, 8B) חוזה מספר טוקנים, והמודל הגדול (למשל, 70B) מאמת אותם במקביל. זה מניב האצה של פי 1.5–2.5 עם שינוי איכות של <1%.

python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3-70b-instruct \
    --speculative-model meta-llama/Llama-3-8b-instruct \
    --num-speculative-tokens 5 \
    --tensor-parallel-size 4

התהליך שלנו לאופטימיזציית הסקה

אנו פועלים לפי מתודולוגיה מובנית המותאמת לתשתית שלך. לצוות שלנו יש ניסיון של 10+ שנים בייצור (Bitrix, 1C) ו-5+ שנים ב-MLOps, עם 50+ פרויקטים של אופטימיזציית הסקת LLM שהושלמו.

  1. איסוף נתונים – איסוף מדדים על עומס נוכחי, מאפייני מודל, חומרה וחביון (P50, P99).
  2. ביקורת וניתוח – זיהוי צווארי בקבוק בצינור ההסקה שלך, כולל טיפול במטמון KV, לוגיקת batching וניצול GPU.
  3. עיצוב – הצעת תצורת vLLM אופטימלית: מודל, קוונטיזציה, מקביליות מודל, פרמטרי batching דינמי.
  4. הערכה – מתן לוח זמנים והערכת עלות בהתבסס על מורכבות ומספר החומרה.
  5. פיתוח – פריסת שרת vLLM מכוונן, עם אינטגרציה ל-API או לאפליקציה הקיימת שלך.
  6. בדיקות – ביצוע מבחני עומס עם עומס העבודה האמיתי שלך, מדידת חביון ותפוקה (יעד 500–2000 טוקנים/שנייה).
  7. השקה – עלייה לאוויר עם ניטור, לוגים ותוכנית גיבוי.

אנו גם מספקים תיעוד מקיף ומכשירים את הצוות שלך לתחזוקה וכיוונון.

הערכות לוחות זמנים

השלמנו 50+ פרויקטים של אופטימיזציית הסקה. לוחות הזמנים שלנו מוכחים:

  • מודל קטן (<7B, GPU יחיד): 3–5 ימים
  • מודל בינוני (7B–13B, מספר GPUs): 5–10 ימים
  • מודל גדול (70B+, מקביליות מודל, קוונטיזציה): 10–20 ימים

לוחות זמנים מדויקים נקבעים לאחר הביקורת הראשונית. צור קשר להערכה מפורטת של המקרה הספציפי שלך.

טעויות נפוצות שיש להימנע מהן

  • דילוג על batching דינמי: בלעדיו, התפוקה סובלת גם עם PagedAttention. תמיד הפעל batching דינמי בייצור.
  • שימוש ב-python -m vllm.entrypoints.openai.api_server \ --model meta-llama/Llama-3-70b-instruct \ --tensor-parallel-size 4 \ --dtype bfloat16 \ --max-model-len 16384 \ --gpu-memory-utilization 0.95 קטן מדי: התחל עם 256 על A100; כוונן לפי VRAM. ערך נמוך מדי משאיר את ה-GPU בתת-ניצול.
  • התעלמות מכיוונון python -m vllm.entrypoints.openai.api_server \ --model TheBloke/Mistral-7B-Instruct-v0.3-AWQ \ --quantization awq --dtype auto : ברירת המחדל של 16 בטוחה, אבל 32 נותן לעיתים קרובות ביצועי גישה אקראית טובים יותר ועומס נמוך יותר. בדוק את שניהם.
  • אי ביצוע benchmark עם עומס עבודה אמיתי: benchmarks סינתטיים מציגים חביון ותפוקה לא מדויקים. השתמש באורכי prompt ובתבניות בקשה בפועל שלך.
  • התעלמות משטח swap: כאשר VRAM צפוף, הפעל python -m vllm.entrypoints.openai.api_server \ --model meta-llama/Llama-3-70b-instruct \ --speculative-model meta-llama/Llama-3-8b-instruct \ --num-speculative-tokens 5 \ --tensor-parallel-size 4 כדי להעביר מטמון KV ל-CPU, ולהימנע משגיאות חוסר זיכרון.

Benchmark ביצועים

על A100 80GB יחיד עם Mistral-7B-Instruct (תגובות של 500 טוקנים):

יישום תפוקה (בקשות/שנייה) חביון P99
HF transformers (batch=1) 1.2 8.5 שניות
HF transformers (batch=16) 4.1 22 שניות
vLLM (256 במקביל) 28.5 12 שניות
vLLM + AWQ 4-bit 52.3 7 שניות

vLLM עם AWQ מהיר פי 44 מ-HuggingFace transformers (batch=1) בתפוקה, ובעל חביון נמוך ב-74%.

מה כלול בשירות האופטימיזציה שלנו

  • ביקורת תשתית – סקירה של התצורה הנוכחית, המודל ועומס העבודה.
  • עיצוב תצורה – פרמטרי vLLM מותאמים (batching, מקביליות מודל, קוונטיזציה).
  • פריסה – שרת מוכן לייצור עם ניטור ולוגים.
  • בדיקות ביצועים – אימות חביון (P99) ותפוקה (עד 2000 טוקנים/שנייה).
  • תיעוד – מדריך תפעול וטיפים לכיוונון.
  • הכשרת צוות – כיצד לנטר, לתעד ולעדכן מודלים.
  • תמיכה – סיוע טכני במהלך ההשקה.

למהנדסים שלנו יש ניסיון של למעלה מ-10 שנים בייצור (Bitrix, 1C, פיתוח web) ו-5+ שנים ב-MLOps, עם 50+ מערכות LLM בייצור שנפרסו. אנו מבטיחים פעולה יציבה תחת עומס. כדי לדון כיצד vLLM יכול לייעל את ההסקה שלך, פנה אלינו—נזהה את המקרה שלך ונציע פתרון.