تعاونت Intel وHugging Face لإظهار القيمة الواقعية للترقية إلى أحدث إصدارات Google
C4 الجهاز الظاهري (VM) الذي يعمل على معالجات Intel® Xeon® 6 (التي تحمل الاسم الرمزي Granite Rapids (GNR)). أردنا على وجه التحديد قياس التحسينات في أداء إنشاء النص لنموذج اللغة الكبير OpenAI GPT OSS (LLM). لقد ظهرت النتائج، وهي مثيرة للإعجاب، مما يدل على أ 1.7x تحسين التكلفة الإجمالية للملكية (TCO) مقارنة بالجيل السابق من Google C3 مثيلات VM. سحابة جوجل C4 أدى مثيل VM أيضًا إلى:
- 1.4x إلى 1.7x إنتاجية TPOT/vCPU/دولار
- انخفاض سعر الساعة الواحدة
C3جهاز افتراضي
مقدمة
GPT OSS هو اسم شائع لنموذج مزيج الخبراء مفتوح المصدر (MoE) الصادر عن OpenAI. نموذج وزارة التربية والتعليم هو عبارة عن بنية شبكة عصبية عميقة تستخدم شبكات فرعية “خبيرة” متخصصة و”شبكة بوابة” لتحديد الخبراء الذين سيتم استخدامهم لمدخلات معينة. تسمح لك نماذج MoE بتوسيع سعة النموذج الخاص بك بكفاءة دون زيادة تكاليف الحوسبة بشكل خطي. كما أنها تسمح بالتخصص، حيث يتعلم “الخبراء” المختلفون مهارات مختلفة، مما يسمح لهم بالتكيف مع توزيعات البيانات المتنوعة.
حتى مع المعلمات الكبيرة جدًا، يتم تنشيط مجموعة فرعية صغيرة فقط من الخبراء لكل رمز مميز، مما يجعل استنتاج وحدة المعالجة المركزية قابلاً للتطبيق.
تعاونت Intel وHugging Face لدمج تحسين تنفيذ الخبراء (PR #40304) للتخلص من العمليات الحسابية الزائدة حيث يقوم كل خبير بمعالجة جميع الرموز المميزة للمحولات. يوجه هذا التحسين كل خبير إلى العمل فقط على الرموز المميزة التي يتم توجيهه إليها، مما يؤدي إلى إزالة نفايات FLOPs وتحسين الاستخدام.
النطاق المرجعي والأجهزة
لقد قمنا بتقييم GPT OSS ضمن عبء عمل توليد متكرر ومتحكم فيه لعزل الاختلافات المعمارية (GCP C4 الأجهزة الافتراضية على معالجات Intel Xeon 6 (GNR) مقابل GCP C3 الأجهزة الافتراضية على معالجات Intel Xeon من الجيل الرابع (SPR)) وكفاءة تنفيذ MoE. وينصب التركيز على فك تشفير الحالة الثابتة (زمن الاستجابة لكل رمز مميز) والإنتاجية المعيارية من طرف إلى طرف مع زيادة حجم الدُفعة مع الحفاظ على أطوال التسلسل ثابتة. تستخدم جميع عمليات التشغيل ذاكرة تخزين مؤقت KV ثابتة وانتباه SDPA للحتمية.
ملخص التكوين
- الموديل: أونسلوث/gpt-oss-120b-BF16
- الدقة: bfloat16
- المهمة: توليد النص
- طول الإدخال: 1024 رمزًا (مبطن على اليسار)
- طول الإخراج: 1024 رمزًا
- أحجام الدفعة: 1، 2، 4، 8، 16، 32، 64
- الميزات الممكّنة:
- مخبأ KV ثابت
- اهتمام SDPA بالخلفية
- المقاييس المبلغ عنها:
- الإنتاجية (إجمالي الرموز المميزة التي تم إنشاؤها في الثانية المجمعة على الدفعة)
الأجهزة تحت الاختبار
| مثال | بنيان | وحدات المعالجة المركزية الافتراضية |
|---|---|---|
C3 |
معالج Intel Xeon من الجيل الرابع (SPR) | 172 |
C4 |
معالج إنتل زيون 6 (GNR) | 144 |
إنشاء مثيل
C3
يزور Google Cloud Console وانقر علىcreate a VMتحت مشروعك اتبع الخطوات أدناه لإنشاء ملف 176 vCPU مثال.
- يختار
C3فيMachine configurationوحدد نوع الجهاز كـc3-standard-176. تحتاج أيضًا إلى ضبطCPU platformوتشغيلall-core turboلجعل الأداء أكثر استقرارًا:

- تكوين نظام التشغيل وعلامة التبويب التخزين على النحو التالي:

- احتفظ بالتكوينات الأخرى كإعداد افتراضي
- انقر
Createزر
C4
يزور Google Cloud Console وانقر علىcreate a VMتحت مشروعك اتبع الخطوات التالية لإنشاء 144 vCPU مثال.
- يختار
C4فيMachine configurationعلامة التبويب وحدد نوع الجهاز كـc4-standard-144. يمكنك أيضًا ضبطCPU platformوقم بتشغيل التوربو الشامل لجعل الأداء أكثر استقرارًا:

- قم بتكوين علامة تبويب نظام التشغيل والتخزين كما نحتاج إلى C3.
- احتفظ بالتكوينات الأخرى كإعداد افتراضي
- انقر
Createزر
قم بإعداد البيئة
قم بتسجيل الدخول إلى المثيل باستخدام SSH ثم قم بتثبيت عامل الإرساء. اتبع الخطوات أدناه لإعداد البيئة بسهولة. من أجل إمكانية التكرار، نقوم بإدراج الإصدارات والالتزامات التي نستخدمها في الأوامر.
$ git clone https://github.com/huggingface/transformers.git$ cd transformers/$ git checkout 26b65fb5168f324277b85c558ef8209bfceae1fe$ cd docker/transformers-intel-cpu/$ sudo docker build . -t <your_docker_image_tag>$ sudo docker run -it --rm --privileged -v /home/<your_home_folder>:/workspace <your_docker_image_tag> /bin/bash
نحن الآن في الحاوية، قم بالخطوات التالية.
$ pip install git+https://github.com/huggingface/transformers.git@26b65fb5168f324277b85c558ef8209bfceae1fe$ pip install torch==2.8.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
الإجراء المعياري
لكل حجم دفعة نحن
- أنشئ مجموعة ذات طول ثابت ومبطنة على اليسار مكونة من 1024 رمزًا مميزًا.
- قم بإجراء جولة إحماء واحدة.
- تعيين
max_new_tokens=1024وقياس الكمون الإجمالي، ثم الحصول على .
يجري numactl -l python benchmark.py للرموز التالية.
import os
import time
import torch
from datasets import load_dataset
from transformers import AutoModelForCausalLM, AutoTokenizer
INPUT_TOKENS = 1024
OUTPUT_TOKENS = 1024
def get_inputs(tokenizer, batch_size):
dataset = load_dataset("ola13/small-the_pile", split="train")
tokenizer.padding_side = "left"
selected_texts = []
for sample in dataset:
input_ids = tokenizer(sample["text"], return_tensors="pt").input_ids
if len(selected_texts) == 0 and input_ids.shape[-1] >= INPUT_TOKENS:
selected_texts.append(sample["text"])
elif len(selected_texts) > 0:
selected_texts.append(sample["text"])
if len(selected_texts) == batch_size:
break
return tokenizer(selected_texts, max_length=INPUT_TOKENS, padding="max_length", truncation=True, return_tensors="pt")
def run_generate(model, inputs, generation_config):
inputs["generation_config"] = generation_config
model.generate(**inputs)
pre = time.time()
model.generate(**inputs)
latency = (time.time() - pre)
return latency
def benchmark(model, tokenizer, batch_size, generation_config):
inputs = get_inputs(tokenizer, batch_size)
generation_config.max_new_tokens = 1
generation_config.min_new_tokens = 1
prefill_latency = run_generate(model, inputs, generation_config)
generation_config.max_new_tokens = OUTPUT_TOKENS
generation_config.min_new_tokens = OUTPUT_TOKENS
total_latency = run_generate(model, inputs, generation_config)
decoding_latency = (total_latency - prefill_latency) / (OUTPUT_TOKENS - 1)
throughput = OUTPUT_TOKENS * batch_size / total_latency
return prefill_latency, decoding_latency, throughput
if __name__ == "__main__":
model_id = "unsloth/gpt-oss-120b-BF16"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model_kwargs = {"dtype": torch.bfloat16}
model = AutoModelForCausalLM.from_pretrained(model_id, **model_kwargs)
model.config._attn_implementation="sdpa"
generation_config = model.generation_config
generation_config.do_sample = False
generation_config.cache_implementation="static"
for batch_size in [1, 2, 4, 8, 16, 32, 64]:
print(f"---------- Run generation with batch size = {batch_size} ----------", flush=True)
prefill_latency, decoding_latency, throughput = benchmark(model, tokenizer, batch_size, generation_config)
print(f"throughput = {throughput}", flush=True)
نتائج
الإنتاجية الطبيعية لكل وحدة معالجة مركزية افتراضية (vCPU).
عبر أحجام الدفعات التي تصل إلى 64، يعمل بمعالج Intel Xeon 6 C4 يتفوق باستمرار C3 مع إنتاجية 1.4x إلى 1.7x لكل وحدة معالجة مركزية افتراضية. الصيغة هي:
\text{تطبيع\_الإنتاجية\_per\_vCPU} = \frac{\text{الإنتاجية\_C4} / \text{vCPUs\_C4}} {\text{الإنتاجية\_C3} / \text{vCPUs\_C3}}
التكلفة والتكلفة الإجمالية للملكية
بحجم الدفعة 64 C4 يوفر 1.7× إنتاجية كل وحدة معالجة مركزية افتراضية C3; مع التكافؤ القريب في السعر لكل وحدة معالجة مركزية افتراضية (تتدرج التكلفة في الساعة خطيًا مع عدد وحدات المعالجة المركزية الافتراضية)، فإن هذا يؤدي إلى ميزة إجمالية للملكية قدرها 1.7× (C3 سيتطلب 1.7× الإنفاق لنفس حجم الرمز المميز الذي تم إنشاؤه).
نسبة إنتاجية كل وحدة معالجة مركزية افتراضية:
\frac{\text{الإنتاجية\_C4} / \text{vCPUs\_C4}}{\text{الإنتاجية\_C3} / \text{vCPUs\_C3}} = 1.7 \Rightarrow \frac{\text{TCO\_C3}}{\text{TCO\_C4}} \approx 1.7
خاتمة
جوجل كلاود C4 توفر الأجهزة الافتراضية التي تعمل بمعالجات Intel Xeon 6 (GNR) مكاسب مذهلة في الأداء وكفاءة أفضل من حيث التكلفة لاستدلال كبير لوزارة التعليم مقارنة بالجيل السابق من Google Cloud C3 VM (مدعوم بمعالجات Intel Xeon من الجيل الرابع). بالنسبة لاستدلال GPT OSS MoE، لاحظنا الجمع بين إنتاجية أعلى وزمن وصول أقل وتكلفة أقل. تؤكد هذه النتائج أنه بفضل تحسينات إطار العمل المستهدفة من Intel وHugging Face، يمكن تقديم نماذج MoE الكبيرة بكفاءة على وحدات المعالجة المركزية للأغراض العامة من الجيل التالي.