الذكاء الاصطناعي
تحسين الذاكرة لاستدلال وضبط النماذج اللغوية الكبيرة
النماذج اللغوية الكبيرة (LLM) مثل GPT-4 و Bloom و LLaMA حققت قدرات ملحوظة من خلال التوسع إلى مليارات المعلمات. ومع ذلك ، فإن نشر هذه النماذج الضخمة للاستدلال أو الضبط يعتبر تحديًا بسبب متطلبات الذاكرة الهائلة. في هذا المنشور الفني ، سنستكشف تقنيات لتقييم وضبط استهلاك الذاكرة أثناء استدلال وضبط LLM عبر مختلف الإعدادات الأجهزة.
فهم متطلبات الذاكرة
تحدد الذاكرة المطلوبة لتحميل LLM في الغالب من خلال عدد المعلمات والدقة العددية المستخدمة لتخزين المعلمات. قاعدة بسيطة هي:
- تحميل نموذج مع X مليار معلمة يتطلب حوالي 4X GB من VRAM في دقة 32-bit
- تحميل نموذج مع X مليار معلمة يتطلب حوالي 2X GB من VRAM في دقة 16-bit
على سبيل المثال ، تحميل نموذج GPT-3 ذي 175 مليار معلمة يتطلب حوالي 350GB من VRAM في دقة bfloat16. كما من اليوم ، أكبر بطاقات الرسومات التجارية المتاحة مثل NVIDIA A100 و H100 توفر فقط 80GB من VRAM ، مما يتطلب تقنيات موازاة التنسور ونموذج موازاة.
خلال الاستدلال ، يتمحور بصمة الذاكرة من المعلمات النموذجية والتنشيطات المؤقتة المنتجة. تقدير تقريبي لاستخدام الذاكرة الأقصى خلال الاستدلال هو مجموع الذاكرة المطلوبة لتحميل معلمات النموذج والذاكرة للتنشيطات.
تحديد كمية الذاكرة للاستدلال
دعونا نحدد متطلبات الذاكرة للاستدلال باستخدام نموذج OctoCode ، الذي يحتوي على حوالي 15 مليار معلمة في تنسيق bfloat16 (~ 31GB). سنستخدم مكتبة Transformers لتحميل النموذج وتوليد النص:
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline import torch <p>model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder", torch_dtype=torch.bfloat16, device_map="auto", pad_token_id=0) tokenizer = AutoTokenizer.from_pretrained("bigcode/octocoder") pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)</p> <p>prompt = "Question: Please write a Python function to convert bytes to gigabytes.\n\nAnswer:" result = pipe(prompt, max_new_tokens=60)[0]["generated_text"][len(prompt):]</p> <p>def bytes_to_gigabytes(bytes): return bytes / 1024 / 1024 / 1024</p> <p>bytes_to_gigabytes(torch.cuda.max_memory_allocated())
الإخراج:
29.0260648727417استخدام الذاكرة الأقصى على GPU هو حوالي 29GB ، وهو يتوافق مع تقديرنا البالغ 31GB لتحميل معلمات النموذج في تنسيق bfloat16.
تحسين الذاكرة للاستدلال مع الكمية
في حين أن bfloat16 هي الدقة الشائعة المستخدمة لتدريب LLM ، وجد الباحثون أن كمية أوزان النموذج إلى دقة أقل مثل 8 بت أو 4 بت يمكن أن يقلل بشكل كبير من استخدام الذاكرة مع خسارة دقة طفيفة للاستدلال.
دعونا نرى مدى توفير الذاكرة من كمية 8 بت و 4 بت لنموذج OctoCode:
&lt;/div&gt; # 8-bit كمية model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder", load_in_8bit=True, pad_token_id=0) pipe = pipeline("text-generation", model=model, tokenizer=tokenizer) result = pipe(prompt, max_new_tokens=60)[0]["generated_text"][len(prompt):] bytes_to_gigabytes(torch.cuda.max_memory_allocated())</pre>
الإخراج:
15.219234466552734# 4-bit كمية model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder", load_in_4bit=True, low_cpu_mem_usage=True, pad_token_id=0) pipe = pipeline("text-generation", model=model, tokenizer=tokenizer) result = pipe(prompt, max_new_tokens=60)[0]["generated_text"][len(prompt):] bytes_to_gigabytes(torch.cuda.max_memory_allocated())
الإخراج:
9.543574333190918مع كمية 8 بت ، يتقلص متطلب الذاكرة من 31GB إلى 15GB ، بينما يقلل كمية 4 بت من ذلك إلى 9.5GB فقط! هذا يسمح بتشغيل نموذج OctoCode ذي 15 مليار معلمة على بطاقات الرسومات المستهلكة مثل RTX 3090 (24GB VRAM).
然而 ، يجب ملاحظة أن كمية أكثر عدوانية مثل 4 بت يمكن أن تؤدي أحيانًا إلى تدهور الدقة مقارنة بدقة 8 بت أو bfloat16. هناك توازن بين توفير الذاكرة والدقة التي يجب على المستخدمين تقييمها لاستخدامهم.
الكمية هي تقنية قوية يمكن أن تمكن من نشر LLM على بيئات مقيدة بالموارد مثل مثيلات السحابة أو أجهزة الحواف أو حتى الهواتف المحمولة عن طريق تقليل بصمة الذاكرة بشكل كبير.
تقييم الذاكرة للضبط
في حين أن الكمية تستخدم في الغالب للاستدلال الفعال ، فإن تقنيات مثل موازاة التنسور ونموذج موازاة هي حاسمة لتحديد الذاكرة أثناء تدريب أو ضبط النماذج اللغوية الكبيرة.
استهلاك الذاكرة الأقصى أثناء الضبط عادة ما يكون 3-4 مرات أعلى من الاستدلال بسبب متطلبات الذاكرة الإضافية ل:
- المتغيرات
- حالات المُحسِّن
- التنشيطات من المرور الأمامي المخزنة للخلف
تقدير محافظ هو أن ضبط LLM مع X مليار معلمة يتطلب حوالي 4 * (2X) = 8X GB من VRAM في دقة bfloat16.
على سبيل المثال ، ضبط نموذج LLaMA ذي 7 مليار معلمة يتطلب حوالي 7 * 8 = 56GB of VRAM لكل وحدة معالجة رسومات في دقة bfloat16. هذا يتجاوز سعة الذاكرة الحالية للوحدات ، مما يتطلب تقنيات ضبط موزعة.
تقنيات الضبط الموزعة
تم اقتراح عدة طرق للضبط الموزعة للتغلب على قيود الذاكرة للوحدات:
- الموازاة البيانية: يكرر هذا النهج النموذج بأكمله عبر وحدات معالجة متعددة بينما يقسم ويوزع مجموعات البيانات. هذا يقلل من وقت التدريب بشكل خطي مع عدد الوحدات ولكن لا يقلل من متطلب الذاكرة الأقصى على كل وحدة.
- ZeRO Stage 3: شكل متقدم من الموازاة البيانية يقسم معلمات النموذج والمتغيرات وحالات المُحسِّن عبر الوحدات. يقلل من الذاكرة مقارنة بالموازاة البيانية التقليدية من خلال الاحتفاظ فقط بالبيانات المقسمة المطلوبة على كل وحدة خلال مراحل مختلفة من التدريب.
- الموازاة التنسورية: بدلاً من تكرار النموذج ، تقسم الموازاة التنسورية معلمات النموذج إلى صفوف أو أعمدة وتوزعها عبر الوحدات. تعمل كل وحدة على مجموعة مقسمة من المعلمات والمتغيرات وحالات المُحسِّن ، مما يؤدي إلى توفير كبير في الذاكرة.
- الموازاة الأنبوبية: تقسم هذه التقنية طبقات النموذج عبر وحدات مختلفة ، حيث تنفذ كل وحدة مجموعة فرعية من الطبقات. يتم تمرير التنشيطات بين العمال ، مما يقلل من الذاكرة الأقصى ولكنه يزيد من أعباء الاتصال.
تقييم استخدام الذاكرة لهذه الطرق الموزعة ليس بسيطًا لأن توزيع المعلمات والمتغيرات والتنشيطات وحالات المُحسِّن يختلف عبر التقنيات. بالإضافة إلى ذلك ، قد تظهر مكونات مختلفة مثل جسم الترانسفورمر ورأس نمذجة اللغة سلوكيات تخصيص ذاكرة مختلفة.
حل LLMem
اقترح الباحثون مؤخرًا LLMem ، وهو حل يقدّر استخدام الذاكرة على GPU بدقة عند تطبيق تقنيات الضبط الموزعة على LLM عبر وحدات متعددة.
يأخذ LLMem في الاعتبار عوامل مثل إعادة تجميع المعلمات قبل الحساب (ZeRO Stage 3) وجمع الإخراج في المرور الخلفي (الموازاة التنسورية) و استراتيجيات تخصيص الذاكرة المختلفة لجسم الترانسفورمر ورأس نمذجة اللغة.
تظهر النتائج التجريبية أن LLMem يمكن أن يقدّر استخدام الذاكرة الأقصى على GPU لضبط LLM بمتوسط خطأ يصل إلى 1.6% ، متجاوزًا معدل الخطأ المتوسط ل DNNMem البالغ 42.6%. عند تطبيق تقنيات الضبط الموزعة على LLM مع أكثر من مليار معلمة على وحدات متعددة ، يصل LLMem إلى معدل خطأ متوسط يبلغ 3.0%.













