الفصل 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_4bit | True/False | True لـ QLoRA |
bnb_4bit_quant_type | "nf4", "fp4" | "nf4" (جودة أفضل) |
bnb_4bit_compute_dtype | torch.bfloat16, torch.float16 | bfloat16 (أكثر استقرارًا) |
bnb_4bit_use_double_quant | True/False | True (توفير أكثر) |
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
- تمكين التحقق من التدرج لكفاءة الذاكرة
- تحويل طبقات النورم إلى float32 للاستقرار
- تعيين requires_grad بشكل مناسب
- التعامل مع التضمينات لتدرجات المدخلات
إعداد 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 للاستقرار