الذكاء الاصطناعي

إطار الاستدلال من مايكروسوفت يأتي مع نماذج لغة كبيرة 1-بت إلى الأجهزة المحلية

mm
Understanding 1-bit LLMs and Microsoft's BitNet.cpp Framework

في 17 أكتوبر 2024، أعلنت مايكروسوفت عن BitNet.cpp، وهو إطار استدلال مصمم لتشغيل نماذج لغة كبيرة كمية 1-بت. BitNet.cpp هو تقدم كبير في الجيل العام للذكاء الاصطناعي، مما يسمح بنشر نماذج لغة كبيرة 1-بت بفعالية على معالجات 중앙ية قياسية، دون الحاجة إلى وحدات معالجة رسومات مكلفة. هذا التطور ي民主ي الوصول إلى نماذج لغة كبيرة، مما يجعلها متاحة على مجموعة واسعة من الأجهزة ويوفر إمكانيات جديدة في تطبيقات الذكاء الاصطناعي على الجهاز.

فهم نماذج لغة كبيرة 1-بت

نماذج لغة كبيرة تقليدية تتطلب موارد حسابية كبيرة بسبب استخدامها لأرقام فاصلة عائمة ذات دقة عالية (عادةً ما تكون FP16 أو BF16) لمتغيرات النموذج. هذا الحاجة جعلت نشر نماذج لغة كبيرة مكلفة ومتطلبة للطاقة.

في جوهرها، تستخدم نماذج لغة كبيرة 1-بت تقنيات كمية متطرفة لتمثيل متغيرات النموذج باستخدام ثلاث قيم فقط: -1 و 0 و 1، وبالتالي المصطلح “1.58-بت” (لأنها تتطلب قليلاً أكثر من بت واحد لتشفير ثلاث حالات).

نظام وزن ثلاثي

المفهوم

الكمية 1-بت في BitNet.cpp هي نظام وزن ثلاثي. يعمل BitNet مع ثلاث قيم فقط لمتغيرات النموذج:

  • -1 (سالب)
  • 0 (محايد)
  • 1 (إيجابي)

هذا يؤدي إلى متطلبات تخزين حول 1.58 بت لكل متغير، وبالتالي الاسم BitNet b1.58. هذا الانخفاض الحاد في عرض بت للمتغير يؤدي إلى انخفاض كبير في استخدام الذاكرة و复잡ية الحساب، حيث يتم استبدال معظم عمليات الضرب الفاصلة العائمة بعمليات إضافة وطرح بسيطة.

الأساس الرياضي

الكمية 1-بت تتضمن تحويل المتغيرات والتنشيطات إلى تمثيلها الثلاثي من خلال الخطوات التالية:

1. تحويل وزن ثنائي

تحويل وزن ثنائي يتضمن تحويل المتغيرات حول المتوسط (α)، مما يؤدي إلى تمثيل ثلاثي. التحويل يتم التعبير عنه رياضياً على النحو التالي:

Wf=Sign(Wα)

حيث:

  • W هو مصفوفة الوزن الأصلية.
  • α هو المتوسط لمتغيرات الوزن.
  • Sign(x) يعود +1 إذا x > 0 و -1 في الحالات الأخرى.

2. كمية تنشيط

كمية تنشيط تضمن أن المدخلات مقيدة إلى عرض بت محدد:

حيث:

  • Qb = 2(b−1)2^{(b-1)} هو الحد الأقصى لمستوى الكمية ل عرض بت b.
  • γ هو القيمة المطلقة القصوى ل x (مشار إليه بـ ∣∣x∣∣∞).
  • ε هو رقم صغير لمنع الفاضح أثناء الحساب.

3. عمليات خطية بت

تستبدل طبقة BitLinear عمليات الضرب المصفوفة التقليدية بعمليات مبسطة:

y=Wf×x^e×(Qbβγ)

حيث:

  • β هو معامل масштаб لتحسين أخطاء التقريب.
  • γ يضبط التنشيط.
  • Q_b هو معامل الكمية.

هذه التحويلات تمكن من حسابات فعالة مع الحفاظ على أداء النموذج.

الآثار على الأداء

كفاءة الذاكرة

نظام الوزن الثلاثي يقلل بشكل كبير من متطلبات الذاكرة:

  • نماذج لغة كبيرة تقليدية: 16 بت لكل وزن
  • BitNet.cpp: 1.58 بت لكل وزن

هذا الانخفاض يترجم إلى توفير في الذاكرة يصل إلى 90% مقارنة بنماذج 16 بت التقليدية، مما يسمح بنماذج أكبر في نفس القيود الأجهزة.

كفاءة الطاقة

سرعة الاستدلال، كفاءة الطاقة (Apple M2)

 

سرعة الاستدلال: أسرع على معالجات 중앙ية كلاسيكية

سرعة الاستدلال، كفاءة الطاقة (i7-13700H)

1. سرعة الاستدلال: أسرع على معالجات مرکزیة كلاسيكية

تمثّل سرعة الاستدلال بعدد الرموز المعالجة في الثانية. هنا تلخيص للملاحظات:

  • على Apple M2 Ultra: يصل BitNet.cpp إلى تسرّع يصل إلى 5.07x لنموذج أكبر (30B) مقارنة بلاما.cpp، مع سرعة قصوى تبلغ 593.43 رمزًا في الثانية لنموذج 125M، وهو تسرّع يصل إلى 1.37x. بالنسبة لنموذج 3.8B و 7B، يحافظ BitNet.cpp على سرعة تزيد على 84.77 رمزًا في الثانية، مما يظهر كفاءته عبر المقاييس.
  • على Intel i7-13700H: يحقق BitNet.cpp تحسينات في السرعة أكثر دراماتيكية. عند حجم نموذج 7B، يوفر BitNet.cpp تسرّعًا يصل إلى 5.68x مقارنة بلاما.cpp. بالنسبة لنموذج 125M، يعالج 389.08 رمزًا في الثانية، وهو تسرّع يصل إلى 2.37x أسرع من لاما.cpp.

2. كفاءة الطاقة: مغير اللعبة لأجهزة الحواف

الرسوم البيانية المقدمة تتضمن أيضًا مقارنات تكلفة الطاقة، مما يظهر انخفاضًا كبيرًا في استهلاك الطاقة لكل رمز معالج:

  • على Apple M2 Ultra: توفيرات BitNet.cpp في الطاقة ملحوظة. لنموذج 700M، يستهلك 55.4% أقل طاقة لكل رمز مقارنة بلاما.cpp، انخفاضًا من 0.314 إلى 0.140. يستمر هذا الاتجاه لنموذج أكبر، حيث يظهر نموذج 70B انخفاضًا يصل إلى 70.0% في استهلاك الطاقة.
  • على Intel i7-13700H: يوفر BitNet.cpp 71.9% توفير في الطاقة لنموذج 700M، حيث ينخفض استهلاك الطاقة من 1.367 إلى 0.384. على الرغم من عدم توفر بيانات استهلاك الطاقة لنموذج 70B في لاما.cpp، يبقى BitNet.cpp فعالًا، مع استهلاك طاقة يبلغ 17.33 لنموذج 70B.

3. تجاوز معيار سرعة القراءة البشرية

من أهم الإشارات في هذه الرسوم البيانية هو الإشارة إلى سرعة القراءة البشرية، المحددة عند 5-7 رموز في الثانية. هذه الخط الأحمر يظهر أن كلا التنفيذين، وخاصة BitNet.cpp، يمكنهما تجاوز سرعات القراءة البشرية حتى لنموذج أكبر:

  • على Apple M2 Ultra: يتجاوز BitNet.cpp سرعة القراءة البشرية لجميع أحجام النموذج، مع أدنى سرعة تبلغ 8.67 رمزًا في الثانية لنموذج 70B.
  • على Intel i7-13700H: يصل نموذج 100B إلى 1.70 رمزًا في الثانية، وهو قريب من نطاق أدنى لسرعة القراءة البشرية، بينما يتجاوز جميع النماذج الأصغر هذا المعيار.

اعتبارات التدريب

مُقدر التمرير المباشر (STE)

نظرًا لأن كمية 1-بت تُدخل دوال غير قابلة للتفاضل، يتضمن التدريب تقنية متخصصة تعرف باسم مُقدر التمرير المباشر (STE). في هذا النهج، تتدفق الميلان غير معدلة عبر النقاط غير القابلة للتفاضل. هنا تطبيق مبسط في بايثون:

class StraightThroughEstimator(Function):
@staticmethod
def forward(ctx, input):
return input.sign()

@staticmethod
def backward(ctx, grad_output):
return grad_output

تدريب الدقة المختلطة

为了 الحفاظ على الاستقرار أثناء التدريب، يتم استخدام دقة مختلطة:

  • الوزن والتنشيط: يتم كميتهما إلى دقة 1-بت.
  • الميلان وحالة المُحسّن: يتم تخزينها بدقة أعلى.
  • الوزن اللاتيني: يتم الحفاظ عليه بدقة عالية لتسهيل التحديثات الدقيقة أثناء التدريب.

استراتيجية معدل التعلم الكبير

تحدي فريد مع نماذج 1-بت هو أن التحديثات الصغيرة قد لا تؤثر على أوزان ثنائية. لتحقيق ذلك، يتم زيادة معدل التعلم، مما يضمن الانحدار السريع وتحسين أفضل مقارنة بالنهج التقليدية.

كمية المجموعة والتعويض

يُدخل BitNet.cpp كمية المجموعة والتعويض لتعزيز موازاة النموذج. بدلاً من حساب المعاملات للوزن بأكمله، يقسم BitNet الأوزان والتنشيطات إلى مجموعات متعددة (G).
هذا التجميع يسمح بمعالجة متوازية فعالة دون أي اتصال إضافي بين المجموعات، مما يُمكّن من تدريب نموذج كبير و استدلال.

ملاحظات التنفيذ والتحسينات

تحسين المعالج المركزي

يستفيد BitNet.cpp من عدة تحسينات منخفضة المستوى لتحقيق أداء المعالج المركزي الأقصى:

  • عمليات متجهية: يستخدم تعليمات SIMD لتنفيذ عمليات بت بشكل فعال.
  • وصول ذاكرة ودي: يهيكل البيانات لتقليل أخطاء الذاكرة.
  • معالجة متوازية: يوزع الحمل بشكل فعال عبر نوى المعالج المركزي المتعددة.

هنا مثال على وظيفة رئيسية تنفذ كمية و استدلال في BitNet:

def bitlinear_forward(input, weight, scale):
# قم بكمية الإدخال باستخدام كمية أقصى
input_q = quantize(input)

# قم بضرب المصفوفة الثنائي
output = binary_matmul(input_q, weight)

# مقياس الإخراج لتطابق الدقة الأصلية
return output * scale

def quantize(x):
# قم بكمية أقصى
scale = torch.max(torch.abs(x))
return torch.clamp(x / scale, -1, 1) * scale

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

الإصدار الحالي من BitNet.cpp يدعم النماذج التالية نماذج لغة كبيرة 1-بت المتاحة على Hugging Face:

  • bitnet_b1_58-large (0.7B 매개변수)
  • bitnet_b1_58-3B (3.3B 매개변수)
  • Llama3-8B-1.58-100B-tokens (8.0B 매개변수)

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

دليل التثبيت

لبدء استخدام BitNet.cpp، اتبع الخطوات التالية:

المتطلبات الأساسية

  1. بايثون >= 3.9
  2. CMake >= 3.22
  3. Clang >= 18
  4. Conda (موصى به بشدة)

لمستخدمي ويندوز، يجب تثبيت فيجوال ستوديو مع المكونات التالية:

  • تطوير سطح المكتب مع سي++
  • أدوات سي++-CMake لويندوز
  • جيت لويندوز
  • مترجم سي++-Clang لويندوز
  • دعم MS-Build لشركة LLVM Toolset (Clang)

لمستخدمي ديبيان/أوبنتو، هناك سكريبت تثبيت تلقائي متاح:

bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"

تثبيت خطوة بخطوة

  1. استنساخ المستودع:
    git clone --recursive https://github.com/microsoft/BitNet.git

    cd BitNet
  2. تثبيت الإعتماديات:
    # قم بإنشاء بيئة كوندا جديدة (موصى به)
    conda create -n bitnet-cpp python=3.9
    conda activate bitnet-cpp


    pip install -r requirements.txt
  3. بناء المشروع وتهيئته: يمكنك تنزيل نموذج مباشرة من Hugging Face وتحويله إلى تنسيق كمي:
    python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s

    بديلًا، يمكنك تنزيل وتحويل النموذج يدويًا:

    huggingface-cli download HF1BitLLM/Llama3-8B-1.58-100B-tokens --local-dir models/Llama3-8B-1.58-100B-tokens

    python setup_env.py -md models/Llama3-8B-1.58-100B-tokens -q i2_s

تشغيل الاستدلال مع BitNet.cpp

لتشغيل الاستدلال باستخدام الإطار، استخدم الأمر التالي:

python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Sandra journeyed to the kitchen. Where is Sandra?" -n 6 -temp 0.7

الشرح:

  • -m يحدد مسار ملف النموذج.
  • -p يحدد نص الاستدلال.
  • -n يحدد عدد الرموز للتنبؤ.
  • -temp يضبط عشوائية العينة أثناء الاستدلال (درجة الحرارة).

مثال الإخراج

Sandra journeyed to the kitchen. Where is Sandra?

الجواب: Sandra is in the kitchen.

تفاصيل فنية من BitNet.cpp

طبقة BitLinear

يُطبّق BitNet.cpp هيكلاً محورًا معدلاً، يستبدل عمليات الضرب المصفوفة التقليدية بعمليات BitLinear. هذا النهج يركز الأوزان على الصفر قبل الكمية ويضبطها لتقليل أخطاء التقريب. الدالة الرئيسية للتحويل تبدو هكذا:


# دالة تحويل ثنائي للأوزان 1-بت
def binarize_weights(W):
alpha = W.mean()
W_binarized = np.sign(W - alpha)
return W_binarized

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

التأثير على الصناعة

يمكن أن يكون BitNet.cpp له تأثيرات بعيدة المدى على نشر نماذج لغة كبيرة:

  • الوصول: يسمح بنشر نماذج لغة كبيرة على أجهزة قياسية، مما يُ民主ي الوصول إلى الذكاء الاصطناعي القوي.
  • كفاءة التكلفة: يقلل من الحاجة إلى وحدات معالجة رسومات مكلفة، مما يخفض حاجز التحول.
  • كفاءة الطاقة: يوفر الطاقة من خلال استخدام معالجات مرکزیة قياسية.
  • الابتكار: يفتح إمكانيات جديدة للتطبيقات الذكية على الجهاز، مثل الترجمة الفورية والمرافقة الصوتية والتطبيقات التي تركز على الخصوصية دون الاعتماد على السحابة.

التحديات والتوجّهات المستقبلية

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

الختام

إطلاق مايكروسوفت لـ BitNet.cpp هو تقدم كبير. من خلال تمكين الاستدلال الفعال لنموذج لغة كبير 1-بت على معالجات مرکزیة قياسية، يخلق BitNet.cpp إمكانية الوصول والاستدامة للذكاء الاصطناعي. يضع هذا الإطار الأساس لمزيد من نماذج لغة كبيرة المحمولة وفعالة من حيث التكلفة، مما يدفع إلى ما هو ممكن مع الذكاء الاصطناعي على الجهاز.

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