Transformers documentation

الانتباه الصفحي

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

الانتباه الصفحي

توثّق هذه الصفحة دالة الانتباه الصفحي الأمامية المستخدمة في التدريج المستمر.

مسار Varlen

يتعامل نواة flash_attn_varlen_func مع دفعات ذات أطوال متغيرة. يُنصح بهذا المسار للدفعات التي تحتوي على عدد كبير من الطلبات أثناء مرحلة التمهيد (prefill).

سلوك التخزين المؤقت

لا يتوفر في هذا النواة أي آلية للتفاعل مع ذاكرة التخزين المؤقت المقسّمة مباشرة، لذا يتم قراءة ذاكرة التخزين المؤقت وكتابتها يدوياً باستخدام طريقة ~PagedAttentionCache.update. وقد يصبح هذا عنقاً زجاجة عندما تصبح طول التسلسل كبيراً.

آلية الفهرسة

يستخدم النواة طول التسلسل الأقصى (max_length_q، max_length_k) والأطوال التراكمية للتسلسلات (cu_seq_lens_q، cu_seq_lens_k) لحساب الانتباه لكل تسلسل.

مثال

فكّر في دفعة من 3 تسلسلات بطول الاستعلام [10, 3, 1] وطول المفتاح [0, 1, 7]:

cu_seq_lens_q = [0, 10, 13, 14]
cu_seq_lens_k = [0, 0, 1, 8]
max_length_q = 10
max_length_k = 7

أشكال المدخلات:

Q:      [1, 10+3+1, num_heads, head_dim] = [1, 14, num_heads, head_dim]
K or V: [1, 0+1+7, num_kv_heads, head_dim] = [1, 8, num_kv_heads, head_dim]

يُسند النواة كل رمز استعلام ومفتاح/قيمة إلى تسلسل باستخدام الأطوال التراكمية للتسلسلات:

Q request index: [r0, r0, r0, r0, r0, r0, r0, r0, r0, r0, r1, r1, r1, r2]
cu_seq_lens_q:   0____________________________________10__________13__14

K request index: [r1, r2, r2, r2, r2, r2, r2, r2]  (r0 has 0 K tokens)
cu_seq_lens_k: 0,0_1_______________________8

مسار فك الترميز

يتعامل نواة flash_attn_with_kvcache مع دفعات فك الترميز فقط حيث تحتوي كل تسلسلة على رمز استعلام واحد بالضبط. هذا أكثر كفاءة من مسار الطول المتغير، لكنه لا يستطيع التعامل مع الدفعات التي تتضمن طلبات تعبئة مسبقة.

سلوك التخزين المؤقت

يتفاعل هذا النواة مع ذاكرة التخزين المؤقت المقسّمة إلى صفحات باستخدام block_table للبحث في الذاكرة المؤقتة وتحديثها في مكانها. يكون شكل جدول الكتل (batch_size, max_blocks_per_seq)، حيث تحتوي كل صف على المواقع الفيزيائية لكتل ذاكرة التخزين المؤقت الخاصة بطلب معين داخل متجه ذاكرة KV.

آلية الفهرسة

يستخدم النواة cache_seqlens لاسترجاع طول ذاكرة التخزين المؤقت لكل تسلسل. ويفترض أن كل رمز استعلام ينتمي إلى تسلسل مختلف (رمز واحد لكل تسلسل).

مثال

لنفترض أن لدينا دفعة من 3 تسلسلات، أطوال الاستعلام فيها [1, 1, 1] وأطوال المفاتيح فيها [30, 32, 70]. حجم كتلة الكاش هو 32، والحد الأقصى لعدد الكتل لكل تسلسل هو 4.

أطوال تسلسل ذاكرة التخزين المؤقت هي ببساطة أطوال المفاتيح:

cache_seqlens = [30, 32, 70]

شكل جدول الكتل هو (3, 4). باستخدام عناوين أمثلة:

block_table = [[2, -1, -1, -1],
               [0,  1, -1, -1],
               [3,  5,  6, -1]]

تدلّ القيم -1 على كتل غير مُخصَّصة.

  • التسلسل 0 (30 رمزًا مخزّنًا مؤقتًا): التخزين المؤقت في KV_cache[2]. يتسع الرمز الجديد (30 + 1 = 31 < 32).
  • التسلسل 1 (32 رمزًا مخزّنًا مؤقتًا): التخزين المؤقت في KV_cache[0] وKV_cache[1]. يُطلب كتلة ثانية لأن 32 + 1 > 32.
  • التسلسل 2 (70 رمزًا مخزّنًا مؤقتًا): التخزين المؤقت في KV_cache[3] وKV_cache[5] وKV_cache[6]. لاحظ أن الكتل ليست بالضرورة متتالية، وهذا هو الميزة الأساسية للتخزين المؤقت المقسّم إلى صفحات. يتسع الرمز الجديد في الكتلة الثالثة.
Update on GitHub