لقد أظهرت النماذج اللغوية الكبيرة قدرات ملحوظة في فهم وإنشاء نص يشبه الإنسان، مما أحدث ثورة في التطبيقات عبر مختلف المجالات. ومع ذلك، أصبحت تلبية المتطلبات التي يفرضونها على الأجهزة الاستهلاكية للتدريب والنشر أمرًا صعبًا بشكل متزايد.

🤗 المهمة الأساسية لـ Hugging Face هي إضفاء الطابع الديمقراطي على التعلم الآلي الجيد، وهذا يشمل جعل النماذج الكبيرة في متناول الجميع قدر الإمكان. بنفس روح تعاوننا في وحدات البت ساندبايت، قمنا للتو بدمج مكتبة AutoGPTQ في Transformers، مما يتيح للمستخدمين قياس النماذج وتشغيلها بدقة 8 أو 4 أو 3 أو حتى 2 بت باستخدام خوارزمية GPTQ (Frantar et al. 2023). هناك تدهور ضئيل في الدقة مع تكميم 4 بت، مع سرعة استدلال مماثلة لـ fp16 خط الأساس لأحجام الدفعات الصغيرة. لاحظ أن طريقة GPTQ تختلف قليلاً عن طرق التكميم بعد التدريب التي تقترحها وحدات البت ساندبايت لأنها تتطلب تمرير مجموعة بيانات المعايرة.

يتوفر هذا التكامل لكل من وحدات معالجة الرسومات Nvidia ووحدات معالجة الرسوميات AMD التي تعمل بنظام RoCm.

جدول المحتويات

موارد

تأتي هذه المدونة والإصدار مع العديد من الموارد للبدء في تكميم GPTQ:


ملخص لطيف لورقة GPTQ

تنتمي طرق التكميم عادة إلى إحدى فئتين:

  1. القياس الكمي بعد التدريب (PTQ): نقوم بقياس نموذج تم تدريبه مسبقًا باستخدام موارد معتدلة، مثل مجموعة بيانات المعايرة وبضع ساعات من الحساب.
  2. التدريب المدرك للتكميم (QAT): يتم تنفيذ التكميم قبل التدريب أو المزيد من الضبط.

تندرج GPTQ ضمن فئة PTQ وهذا مثير للاهتمام بشكل خاص بالنسبة للنماذج الضخمة، والتي يمكن أن يكون التدريب الكامل للنموذج أو حتى الضبط الدقيق لها مكلفًا للغاية.

على وجه التحديد، يعتمد GPTQ نظام تكميم int4/fp16 مختلط حيث يتم قياس الأوزان كـ int4 بينما تظل عمليات التنشيط في float16. أثناء الاستدلال، يتم موازنة الأوزان بسرعة ويتم إجراء الحساب الفعلي في float16.

فوائد هذا المخطط ذات شقين:

  • يصل توفير الذاكرة إلى x4 بالنسبة لتكميم int4، حيث يحدث التكمية بالقرب من وحدة الحوسبة في نواة مدمجة، وليس في الذاكرة العامة لوحدة معالجة الرسومات.
  • عمليات تسريع محتملة بفضل الوقت الموفر في اتصالات البيانات بسبب انخفاض عرض البت المستخدم للأوزان.

تتناول ورقة GPTQ مشكلة الضغط على مستوى الطبقة:

نظرا لطبقة لل مع مصفوفة الوزن دبليولW_L

دبليو^ل=أصزمأناندبليول^دبليولXدبليو^لX22\hatW_l^* = argmin_\hatW_l \|W_lX-\hatW_lX\|^2_2

بمجرد حل هذه المشكلة لكل طبقة، يمكن الحصول على حل للمشكلة العالمية من خلال الجمع بين الحلول الخاصة بالطبقة.

من أجل حل مشكلة الضغط على مستوى الطبقة، يستخدم المؤلف إطار العمل الأمثل لتكميم الدماغ (Frantar et al 2022). تبدأ طريقة OBQ من ملاحظة أنه يمكن كتابة المعادلة أعلاه كمجموع الأخطاء المربعة، على كل صف من دبليولW_L

أنا=0دصسثدبليول[i,:]Xدبليو^ل[i,:]X22 \sum_i=0^d_row \|W_l[i,:]X-\hatW_l[i,:]X\|^2_2

هذا يعني أنه يمكننا قياس كل صف بشكل مستقل. وهذا ما يسمى التكميم لكل قناة. لكل صف دبليول[i,:]W_L[i,:]

تعمل ورقة GPTQ على تحسين هذا الإطار من خلال تقديم مجموعة من التحسينات التي تقلل من تعقيد خوارزمية القياس الكمي مع الحفاظ على دقة النموذج.

بالمقارنة مع OBQ، فإن خطوة التكميم نفسها أسرع أيضًا مع GPTQ: يستغرق تكميم نموذج BERT (336M) باستخدام OBQ ساعتين من وحدة معالجة الرسومات، بينما مع GPTQ، يمكن تكميم نموذج Bloom (176B) في أقل من 4 ساعات من وحدة معالجة الرسومات.

لمعرفة المزيد حول الخوارزمية الدقيقة والمعايير المختلفة بشأن الحيرة والتسريع، راجع الورقة الأصلية.

مكتبة AutoGPTQ – المكتبة الشاملة للاستفادة بكفاءة من GPTQ لمجالس LLM

تتيح مكتبة AutoGPTQ للمستخدمين إمكانية تكميم نماذج المحولات باستخدام طريقة GPTQ. في حين أن جهود المجتمع الموازية مثل GPTQ-for-LLaMa وExllama وllama.cpp تنفذ أساليب التكميم بشكل صارم لبنية Llama، اكتسب AutoGPTQ شعبية من خلال تغطيته السلسة لمجموعة واسعة من بنيات المحولات.

نظرًا لأن مكتبة AutoGPTQ تحتوي على تغطية أكبر لنماذج المحولات، فقد قررنا توفير واجهة برمجة تطبيقات Transformers API المتكاملة لجعل تقدير LLM في متناول الجميع. في الوقت الحالي، قمنا بدمج خيارات التحسين الأكثر شيوعًا، مثل نواة CUDA. للحصول على المزيد من الخيارات المتقدمة مثل حبات Triton أو توافق الانتباه المنصهر، راجع مكتبة AutoGPTQ.

الدعم الأصلي لنماذج GPTQ في 🤗 المحولات

بعد تثبيت مكتبة AutoGPTQ و optimum (pip install optimum)، أصبح تشغيل نماذج GPTQ في Transformers الآن بسيطًا مثل:

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("TheBloke/Llama-2-7b-Chat-GPTQ", torch_dtype=torch.float16, device_map="auto")

راجع وثائق Transformers لمعرفة المزيد حول جميع الميزات.

يتمتع تكامل AutoGPTQ الخاص بنا بالعديد من المزايا:

  • النماذج الكمية قابلة للتسلسل ويمكن مشاركتها على المركز.
  • يقلل GPTQ بشكل كبير من متطلبات الذاكرة لتشغيل LLMs، في حين أن زمن الوصول للاستدلال يكون على قدم المساواة مع الاستدلال FP16.
  • يدعم AutoGPTQ نواة Exllama لمجموعة واسعة من البنى.
  • يأتي التكامل مع دعم RoCm الأصلي لوحدات معالجة الرسومات AMD.
  • الضبط الدقيق باستخدام PEFT متاح.

يمكنك التحقق من Hub إذا تم بالفعل تحديد حجم النموذج المفضل لديك. قام TheBloke، أحد كبار المساهمين في Hugging Face، بقياس الكثير من النماذج باستخدام AutoGPTQ ومشاركتها على Hugging Face Hub. لقد عملنا معًا للتأكد من أن هذه المستودعات ستعمل خارج الصندوق من خلال تكاملنا.

هذه عينة مرجعية لحجم الدفعة = حالة واحدة. تم تشغيل الاختبار على وحدة معالجة الرسومات NVIDIA A100-SXM4-80GB واحدة. استخدمنا طولًا فوريًا قدره 512، وقمنا بإنشاء 512 رمزًا جديدًا بالضبط. الصف الأول هو غير المكممة fp16 خط الأساس، بينما تعرض الصفوف الأخرى استهلاك الذاكرة والأداء باستخدام نواة AutoGPTQ المختلفة.

gptq act_order أجزاء حجم المجموعة نواة وقت التحميل (ق) زمن الاستجابة لكل رمز مميز (ملي ثانية) الإنتاجية (الرموز/الرموز) ذاكرة الذروة (ميجابايت)
خطأ شنيع لا أحد لا أحد لا أحد لا أحد 26.0 36.958 27.058 29152.98
حقيقي خطأ شنيع 4 128 تعجب 36.2 33.711 29.663 10484.34
حقيقي خطأ شنيع 4 128 autogptq-cuda-old 36.2 46.44 21.53 10344.62

يتوفر هنا معيار أكثر شمولاً وقابل للتكرار.

نماذج الكميات مع مكتبة الأمثل

لدمج AutoGPTQ بسلاسة في Transformers، استخدمنا إصدارًا بسيطًا من واجهة برمجة تطبيقات AutoGPTQ المتوفرة في مجموعة أدوات Optimum, Hugging Face للتدريب وتحسين الاستدلال. باتباع هذا النهج، حققنا تكاملًا سهلاً مع Transformers، مع السماح للأشخاص باستخدام Optimum API إذا كانوا يريدون قياس نماذجهم الخاصة! تحقق من الوثائق المثالية إذا كنت ترغب في تحديد كمية LLMs الخاصة بك.

التكميم 🤗 يمكن عمل نماذج المحولات بطريقة GPTQ في بضعة أسطر:

from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

model_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset = "c4", tokenizer=tokenizer)

model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=quantization_config)

قد يستغرق تكميم النموذج وقتًا طويلاً. لاحظ أنه بالنسبة لنموذج 175B، يلزم وجود 4 ساعات من وحدة معالجة الرسومات على الأقل إذا كان أحد الأشخاص يستخدم مجموعة بيانات كبيرة (على سبيل المثال `”c4″“). كما هو مذكور أعلاه، تتوفر بالفعل العديد من نماذج GPTQ على Hugging Face Hub، مما يتجاوز الحاجة إلى تحديد حجم النموذج بنفسك في معظم حالات الاستخدام. ومع ذلك، يمكنك أيضًا تحديد حجم النموذج باستخدام مجموعة البيانات الخاصة بك المناسبة للمجال المعين الذي تعمل عليه.

تشغيل نماذج GPTQ من خلال استنتاج توليد النص

بالتوازي مع دمج GPTQ في المحولات، تمت إضافة دعم GPTQ إلى مكتبة استدلال إنشاء النص (TGI)، التي تهدف إلى خدمة نماذج لغوية كبيرة في الإنتاج. يمكن الآن استخدام GPTQ جنبًا إلى جنب مع ميزات مثل التجميع الديناميكي والاهتمام المقسم إلى صفحات والاهتمام بالفلاش لمجموعة واسعة من البنيات.

على سبيل المثال، يسمح هذا التكامل بخدمة طراز 70B على وحدة معالجة الرسومات A100-80GB واحدة! هذا غير ممكن باستخدام نقطة تفتيش fp16 لأنها تتجاوز ذاكرة GPU المتاحة.

يمكنك معرفة المزيد حول استخدام GPTQ في TGI في الوثائق.

لاحظ أن النواة المدمجة في TGI لا تتوسع بشكل جيد مع أحجام الدُفعات الأكبر. على الرغم من أن هذا الأسلوب يوفر الذاكرة، إلا أنه من المتوقع حدوث تباطؤ في أحجام الدُفعات الأكبر.


ضبط النماذج الكمية باستخدام PEFT

لا يمكنك مواصلة تدريب النموذج الكمي باستخدام الطرق العادية. ومع ذلك، من خلال الاستفادة من مكتبة PEFT، يمكنك تدريب المحولات في الأعلى! للقيام بذلك، نقوم بتجميد جميع طبقات النموذج الكمي وإضافة المحولات القابلة للتدريب. فيما يلي بعض الأمثلة حول كيفية استخدام PEFT مع نموذج GPTQ: دفتر ملاحظات colab ونص ضبط دقيق.

مجال للتحسين

إن تكامل AutoGPTQ الخاص بنا يجلب بالفعل فوائد رائعة بتكلفة بسيطة في جودة التنبؤ. لا يزال هناك مجال للتحسين، سواء في تقنيات التكميم أو تطبيقات النواة.

أولاً، بينما يتكامل AutoGPTQ (على حد علمنا) مع نواة W4A16 الأكثر أداءً (أوزان مثل int4 وعمليات تنشيط مثل fp16) من تنفيذ exllama، هناك فرصة جيدة لاستمرار تحسين النواة. كانت هناك تطبيقات واعدة أخرى من كيم وآخرون. ومن مختبر MIT Han Lab الذي يبدو واعدًا. علاوة على ذلك، من خلال المعايير الداخلية، يبدو أنه لا يوجد حتى الآن نواة W4A16 مفتوحة المصدر مكتوبة بلغة Triton، وهو ما قد يكون اتجاهًا للاستكشاف.

ومن ناحية التكميم، دعونا نؤكد مرة أخرى أن هذه الطريقة تقوم فقط بتكميم الأوزان. كانت هناك طرق أخرى مقترحة لتكميم LLM يمكنها قياس كل من الأوزان وعمليات التنشيط بتكلفة صغيرة في جودة التنبؤ، مثل LLM-QAT حيث يمكن استخدام مخطط int4/int8 المختلط، بالإضافة إلى تكميم ذاكرة التخزين المؤقت ذات القيمة الرئيسية. إحدى المزايا القوية لهذه التقنية هي القدرة على استخدام حساب الأعداد الصحيحة الفعلية للحساب، على سبيل المثال، تدعم Nvidia Tensor Cores حساب int8. ومع ذلك، على حد علمنا، لا توجد نواة تكميم W4A8 مفتوحة المصدر متاحة، ولكن قد يكون هذا اتجاهًا مثيرًا للاهتمام للاستكشاف.

وعلى جانب النواة أيضًا، يظل تصميم حبات W4A16 ذات الأداء العالي لأحجام الدفعات الأكبر تحديًا مفتوحًا.

النماذج المدعومة

في هذا التنفيذ الأولي، يتم دعم نماذج اللغات الكبيرة فقط التي تحتوي على وحدة فك ترميز أو بنية تشفير فقط. قد يبدو هذا مقيدًا بعض الشيء، ولكنه يشمل معظم برامج LLM المتطورة مثل Llama وOPT وGPT-Neo وGPT-NeoX.

نماذج الرؤية والصوت والنماذج المتعددة الوسائط غير مدعومة حاليًا.

الخاتمة والكلمات النهائية

في هذه المدونة، قدمنا ​​دمج مكتبة AutoGPTQ في Transformers، مما يجعل من الممكن قياس LLMs باستخدام طريقة GPTQ لجعلها في متناول أي شخص في المجتمع وتمكينهم من بناء أدوات وتطبيقات مثيرة باستخدام LLMs.

يتوفر هذا التكامل لكل من وحدات معالجة الرسومات Nvidia ووحدات معالجة الرسوميات AMD التي تعمل بنظام RoCm، وهي خطوة كبيرة نحو إضفاء الطابع الديمقراطي على النماذج الكمية لبنيات GPU الأوسع.

لقد كان التعاون مع فريق AutoGPTQ مثمرًا للغاية، ونحن ممتنون جدًا لدعمهم وعملهم في هذه المكتبة.

نأمل أن يسهل هذا التكامل على الجميع استخدام LLMs في تطبيقاتهم، ونحن نتطلع إلى رؤية ما ستبنيه به!

لا تفوت الموارد المفيدة التي تمت مشاركتها أعلاه لفهم التكامل بشكل أفضل وكيفية البدء بسرعة في تكميم GPTQ.

شكر وتقدير

نود أن نشكر ويليام على دعمه وعمله في مكتبة AutoGPTQ المذهلة وعلى مساعدته في عملية التكامل. نود أيضًا أن نشكر TheBloke على عمله في تحديد كمية العديد من النماذج باستخدام AutoGPTQ ومشاركتها على Hub وعلى مساعدته في التكامل. نود أيضًا أن نشكر qwopqwop200 على مساهماته المستمرة في مكتبة AutoGPTQ وعمله على توسيع مكتبة وحدة المعالجة المركزية (CPU) التي سيتم إصدارها في الإصدارات التالية من AutoGPTQ.

أخيرًا، نود أن نشكر بيدرو كوينكا لمساعدته في كتابة هذه التدوينة.

شاركها.
اترك تعليقاً