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 | تقليل تأخير قائمة الانتظار، إضافة نسخ |
| ::: |