إنتقل إلى المحتوى الرئيسي

الفصل 2: التكميم بـ 4 بت باستخدام bitsandbytes

فهم وتنفيذ التكميم الفعال​

تمكن مكتبة bitsandbytes من التكميم بـ 4 بت و8 بت لتحميل النماذج وتدريبها بكفاءة.


أساسيات التكميم​

ما هو التكميم؟​

تحويل القيم ذات الدقة العالية إلى دقة أقل:

Float16: 2 بايت لكل معلمة
Int8: 1 بايت لكل معلمة
Int4: 0.5 بايت لكل معلمة

توفير الذاكرة​

# ذاكرة نموذج 7B
fp32 = 7e9 * 4 / 1e9 # 28 جيجابايت
fp16 = 7e9 * 2 / 1e9 # 14 جيجابايت
int8 = 7e9 * 1 / 1e9 # 7 جيجابايت
int4 = 7e9 * 0.5 / 1e9 # 3.5 جيجابايت

BitsAndBytesConfig​

التكوين الكامل​

from transformers import BitsAndBytesConfig
import torch

bnb_config = BitsAndBytesConfig(
# استخدام التكميم بـ 4 بت
load_in_4bit=True,

# نوع التكميم NF4 (موصى به)
bnb_4bit_quant_type="nf4",

# الحساب بـ bfloat16 للاستقرار
bnb_4bit_compute_dtype=torch.bfloat16,

# التكميم المزدوج لتوفير إضافي
bnb_4bit_use_double_quant=True,
)

شرح المعلمات​

المعلمةالخياراتالتوصية
load_in_4bitTrue/FalseTrue لـ QLoRA
bnb_4bit_quant_type"nf4", "fp4""nf4" (جودة أفضل)
bnb_4bit_compute_dtypetorch.bfloat16, torch.float16bfloat16 (أكثر استقرارًا)
bnb_4bit_use_double_quantTrue/FalseTrue (توفير أكثر)

NF4 مقابل FP4​

NF4 (NormalFloat4)​

  • مصمم للأوزان الموزعة بشكل طبيعي
  • قيم متساوية في كل حاوية تكميم
  • جودة أفضل للشبكات العصبية

FP4 (Float4)​

  • تكميم موحد
  • أبسط ولكنه أقل مثالية للأوزان
# يوصى بـ NF4
bnb_4bit_quant_type="nf4"

تحميل نموذج مكمم​

from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-8B",
quantization_config=bnb_config,
device_map="auto",
torch_dtype=torch.bfloat16,
)

tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B")

# تحقق من الذاكرة
print(f"Memory: {torch.cuda.memory_allocated() / 1e9:.2f} GB")

التحضير للتدريب​

from peft import prepare_model_for_kbit_training

# خطوات التحضير الضرورية:
# 1. تمكين التحقق من التدرج
# 2. تحويل طبقات النورم إلى float32
# 3. تمكين تدرجات المدخلات

model = prepare_model_for_kbit_training(model)

ما الذي يفعله prepare_model_for_kbit_training​

  1. تمكين التحقق من التدرج لكفاءة الذاكرة
  2. تحويل طبقات النورم إلى float32 للاستقرار
  3. تعيين requires_grad بشكل مناسب
  4. التعامل مع التضمينات لتدرجات المدخلات

إعداد QLoRA الكامل​

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training

# 1. تكوين التكميم
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)

# 2. تحميل النموذج المكمم
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-8B",
quantization_config=bnb_config,
device_map="auto",
)

# 3. التحضير للتدريب
model = prepare_model_for_kbit_training(model)

# 4. إضافة LoRA
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_dropout=0.05,
task_type="CAUSAL_LM",
)

model = get_peft_model(model, lora_config)
model.print_trainable_parameters()

النقاط الرئيسية​

✅ bitsandbytes تمكن من التكميم بـ 4 بت/8 بت ✅ NF4 هو الأمثل لأوزان الشبكات العصبية ✅ التكميم المزدوج يضيف توفيرًا إضافيًا بنسبة ~11% ✅ استخدم prepare_model_for_kbit_training قبل إضافة LoRA ✅ يجب أن يكون نوع الحساب bfloat16 للاستقرار


تابع إلى الفصل 3: التدريب بكفاءة الذاكرة →