TensorRT-LLM وتحسين GPU

ضبط أداء TensorRT-LLM

3 دقيقة للقراءة

يغطي هذا الدرس تقنيات ضبط الأداء المتقدمة لـ TensorRT-LLM لتعظيم الإنتاجية وتقليل زمن الاستجابة في النشر الإنتاجي.

مقاييس الأداء الرئيسية

┌─────────────────────────────────────────────────────────────┐
│                  لوحة مقاييس الأداء                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  مقاييس الإنتاجية          مقاييس زمن الاستجابة             │
│  ─────────────────          ────────────────                │
│  • الرموز/الثانية           • TTFT (وقت أول رمز)            │
│  • الطلبات/الثانية          • TPOT (وقت كل رمز خرج)         │
│  • استخدام GPU              • زمن P50/P95/P99               │
│                                                             │
│  مقاييس الموارد             مقاييس الجودة                   │
│  ────────────────           ───────────────                 │
│  • استخدام ذاكرة GPU        • معدل إصابة KV cache           │
│  • استخدام الدفعة           • معدل الاستباق                 │
│  • عمق قائمة الانتظار       • معدل انتهاء المهلة            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

تحسين حجم الدفعة

إيجاد حجم الدفعة الأمثل يوازن بين الإنتاجية وزمن الاستجابة:

from tensorrt_llm import LLM
from tensorrt_llm.builder import BuildConfig

# تحليل أحجام دفعات مختلفة
batch_configs = [
    {"max_batch_size": 32, "use_case": "low_latency"},
    {"max_batch_size": 128, "use_case": "balanced"},
    {"max_batch_size": 512, "use_case": "high_throughput"},
]

# التكوين الأمثل لأحمال العمل المتوازنة
build_config = BuildConfig(
    max_batch_size=128,
    max_num_tokens=8192,  # إجمالي الرموز عبر الدفعة

    # تمكين التجميع الديناميكي
    enable_chunked_context=True,
    max_chunk_size=2048,

    # جدولة الدفعات
    scheduler_policy="guaranteed_no_evict",
)

إرشادات حجم الدفعة

حالة الاستخدام حجم الدفعة تأثير TTFT الإنتاجية
الدردشة الفورية 16-32 ضئيل متوسط
خدمة API 64-128 معتدل عالي
المعالجة الدفعية 256-512 أعلى أقصى

تحسين الذاكرة

تكوين KV Cache

build_config = BuildConfig(
    # KV cache صفحي لكفاءة الذاكرة
    use_paged_context_fmha=True,

    # تكميم KV cache
    kv_cache_quant_algo="FP8",  # تقليل ذاكرة 50%

    # حجم الكتلة للانتباه الصفحي
    tokens_per_block=64,  # افتراضي، جيد لمعظم الحالات

    # أقصى ذاكرة KV cache (جزء من ذاكرة GPU)
    kv_cache_fraction=0.9,  # احتياطي 10% للتنشيطات
)

تكامل فك التشفير التخميني

يدعم TensorRT-LLM فك التشفير التخميني للتوليد الأسرع:

from tensorrt_llm.builder import BuildConfig

# تكوين فك التشفير التخميني
build_config = BuildConfig(
    # إعدادات النموذج الرئيسي
    max_batch_size=64,
    max_seq_len=8192,

    # فك التشفير التخميني
    speculative_decoding_mode="draft_tokens_external",
    max_draft_tokens=5,  # عدد الرموز المسودة لكل خطوة
)

# بناء كلا نموذجي المسودة والهدف
draft_llm = LLM(
    model="/models/llama-3.1-8b",  # نموذج مسودة أصغر
    build_config=draft_config,
)

target_llm = LLM(
    model="/models/llama-3.1-70b",
    build_config=build_config,
)

يمكن لفك التشفير التخميني توفير تسريع 2-3x لأحمال العمل كثيفة التوليد.

الضبط التلقائي للنواة

يمكن لـ TensorRT-LLM ضبط النوى تلقائياً لـ GPU الخاص بك:

from tensorrt_llm.builder import BuildConfig

build_config = BuildConfig(
    # تمكين الضبط التلقائي للنواة
    builder_opt_level=5,  # أقصى تحسين (0-5)

    # اختيار التكتيك
    max_workspace_size=8 * 1024**3,  # 8GB للضبط

    # التحليل لـ GPU محدد
    # الضبط يستغرق وقتاً أطول لكن ينتج محركات أسرع
)

# البناء مع الضبط (يستغرق وقتاً أطول، يعمل أسرع)
llm = LLM(
    model="/models/llama-3.1-70b",
    build_config=build_config,
    # حفظ المحرك المضبوط
    engine_dir="/engines/llama-3.1-70b-tuned",
)

تحسين وقت التشغيل

جدولة الطلبات

from tensorrt_llm.executor import ExecutorConfig

executor_config = ExecutorConfig(
    # استراتيجية التجميع
    batching_type="INFLIGHT",  # التجميع المستمر

    # الجدولة
    scheduler_policy="MAX_UTILIZATION",

    # معالجة الطلبات
    max_queue_delay_microseconds=1000,  # 1ms أقصى وقت انتظار

    # التنفيذ المتوازي
    parallel_config={
        "communication_mode": "LEADER",
        "participant_ids": [0, 1],  # معرفات GPU
    },
)

تكوين البث

from tensorrt_llm import LLM, SamplingParams

llm = LLM(model="/engines/llama-3.1-70b")

sampling_params = SamplingParams(
    max_tokens=512,
    temperature=0.7,
    # إعدادات البث
    stream=True,
    stream_interval=1,  # إخراج كل N رمز
)

# التوليد المتدفق
async for chunk in llm.generate_async(prompt, sampling_params):
    print(chunk.text, end="", flush=True)

التحليل والمقارنة المرجعية

المقارنة المرجعية المدمجة

# أداة مقارنة TensorRT-LLM
python -m tensorrt_llm.bench.benchmark \
  --engine_dir /engines/llama-3.1-70b \
  --dataset /data/benchmark.json \
  --num_requests 1000 \
  --concurrency 64 \
  --output_file results.json

تكامل NVIDIA Nsight

# التحليل مع Nsight Systems
nsys profile -o llm_profile \
  python inference_script.py

# التحليل مع Nsight Compute لتفاصيل النواة
ncu --target-processes all \
  python inference_script.py

قائمة تحقق ضبط الأداء

┌─────────────────────────────────────────────────────────────┐
│               خطوات تحسين الأداء                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  □ اختر التكميم المناسب (FP8/FP4 لـ Hopper+)               │
│  □ عيّن max_batch_size بناءً على متطلبات زمن الاستجابة     │
│  □ مكّن الانتباه الصفحي لكفاءة الذاكرة                     │
│  □ كوّن تكميم KV cache                                     │
│  □ مكّن الملء المسبق المقطع للسياقات الطويلة               │
│  □ شغّل الضبط التلقائي للنواة على GPUs الإنتاج             │
│  □ حلّل مع حمل عمل تمثيلي                                  │
│  □ راقب ذاكرة GPU والاستخدام في الإنتاج                   │
│  □ عيّن تأخيرات قائمة الانتظار المناسبة لـ SLOs            │
│  □ فكر في فك التشفير التخميني لأحمال التوليد              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

مشاكل الأداء الشائعة

المشكلة العرض الحل
استخدام GPU منخفض <80% استخدام زيادة حجم الدفعة
TTFT عالي رمز أول بطيء تمكين الملء المسبق المقطع
أخطاء OOM فشل تخصيص الذاكرة تقليل حجم الدفعة، استخدم FP8/FP4
انخفاض الإنتاجية يتفاوت مع الحمل تحقق من معدل الاستباق
ارتفاعات زمن الاستجابة P99 >> P50 تقليل تأخير قائمة الانتظار، إضافة نسخ
:::

اختبار

الوحدة 3: TensorRT-LLM وتحسين GPU

خذ الاختبار