الدرس 17 من 22

الأداء والتحسين

شرح الضغط الكمّي

3 دقيقة للقراءة

الضغط الكمّي يقلل دقة النموذج لتقليص استخدام الذاكرة مع الحفاظ على الجودة. هكذا تشغّل نموذج 70B على عتاد المستهلك.

ما هو الضغط الكمّي؟

┌─────────────────────────────────────────────────────────────────┐
│                   مستويات دقة الضغط الكمّي                       │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  الأصلي (FP32)       ████████████████████████████████  32 بت   │
│  نصف (FP16)          ████████████████                  16 بت   │
│  8-بت (Q8)           ████████                          8 بت    │
│  5-بت (Q5)           █████                             5 بت    │
│  4-بت (Q4)           ████                              4 بت    │
│                                                                 │
│  بتات أقل = حجم أصغر، استدلال أسرع، بعض فقدان الجودة            │
└─────────────────────────────────────────────────────────────────┘

تنسيق GGUF

Ollama يستخدم GGUF (تنسيق موحد لـ GPT)، المعيار للنماذج المضغوطة.

# علامات النموذج تشير لمستوى الضغط
ollama pull llama3.2:8b        # افتراضي (عادةً Q4_K_M)
ollama pull llama3.2:8b-q4_0   # 4-بت أساسي
ollama pull llama3.2:8b-q4_K_M # K-quant متوسط (موصى به)
ollama pull llama3.2:8b-q5_K_M # جودة أعلى
ollama pull llama3.2:8b-q8_0   # قريب من الجودة الأصلية

مقارنة أنواع الضغط

┌─────────────────────────────────────────────────────────────────┐
│                   جودة الضغط مقابل الحجم                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  النوع    │ بت   │ الحجم (7B) │ الجودة  │ حالة الاستخدام        │
│  ─────────│──────│───────────│─────────│────────────────────   │
│  Q4_0     │ 4    │ ~3.5 GB   │ جيد     │ أقصى ضغط              │
│  Q4_K_M   │ 4    │ ~4.0 GB   │ أفضل    │ أفضل توازن ★          │
│  Q4_K_S   │ 4    │ ~3.8 GB   │ جيد     │ Q4 أصغر               │
│  Q5_K_M   │ 5    │ ~4.8 GB   │ رائع    │ أولوية الجودة         │
│  Q5_K_S   │ 5    │ ~4.5 GB   │ جيد     │ Q5 متوازن             │
│  Q6_K     │ 6    │ ~5.5 GB   │ ممتاز   │ قريب من بلا خسارة     │
│  Q8_0     │ 8    │ ~7.0 GB   │ ممتاز   │ خسارة بسيطة           │
│  F16      │ 16   │ ~14 GB    │ أصلي    │ بدون ضغط              │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

شرح K-Quants

K-quants (K_S, K_M, K_L) تستخدم دقة مختلطة—الطبقات المهمة تحصل على بتات أكثر.

┌─────────────────────────────────────────────────────────────────┐
│                   استراتيجية طبقات K-Quant                      │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  نوع الطبقة          Q4_K_S    Q4_K_M    Q4_K_L               │
│  ─────────────────    ──────    ──────    ──────               │
│  الانتباه (Q,K,V)    4-بت      5-بت      6-بت                  │
│  التغذية الأمامية    4-بت      4-بت      5-بت                  │
│  طبقات الإخراج       5-بت      6-بت      6-بت                  │
│                                                                 │
│  _S = صغير (أسرع)، _M = متوسط (متوازن)، _L = كبير             │
└─────────────────────────────────────────────────────────────────┘

اختيار الضغط العملي

import ollama

def get_available_quantizations(model_name: str) -> list[str]:
    """قائمة متغيرات الضغط المتاحة لنموذج."""
    # لواحق الضغط الشائعة
    quants = ["q4_0", "q4_K_S", "q4_K_M", "q5_0", "q5_K_S", "q5_K_M", "q8_0"]

    available = []
    for q in quants:
        tag = f"{model_name}:{q}"
        try:
            # تحقق إذا كان النموذج موجود
            available.append(tag)
        except:
            pass

    return available

def recommend_quantization(vram_gb: float, model_params_b: float) -> str:
    """أوصِ بضغط بناءً على VRAM المتاحة."""
    # تقديرات VRAM تقريبية لكل مليار بارامتر
    vram_per_b = {
        "q4_K_M": 0.5,  # ~0.5 GB لكل مليار بارامتر
        "q5_K_M": 0.625,
        "q8_0": 1.0,
        "f16": 2.0,
    }

    recommendations = []
    for quant, ratio in vram_per_b.items():
        needed = model_params_b * ratio * 1.2  # 20% احتياطي
        if needed <= vram_gb:
            recommendations.append((quant, needed))

    if recommendations:
        # أرجع أعلى جودة تناسب
        return recommendations[-1][0]
    return "النموذج كبير جداً لـ VRAM المتاحة"

# أمثلة
print(recommend_quantization(8, 7))   # 8GB VRAM، نموذج 7B
print(recommend_quantization(24, 34)) # 24GB VRAM، نموذج 34B

اختبار تأثير الجودة

import ollama
import time

def compare_quantizations(prompt: str, model_base: str, quants: list[str]):
    """قارن جودة الرد عبر مستويات الضغط."""
    results = []

    for quant in quants:
        model = f"{model_base}:{quant}" if quant else model_base

        try:
            start = time.time()
            response = ollama.generate(
                model=model,
                prompt=prompt,
                options={"num_predict": 100}
            )
            elapsed = time.time() - start

            results.append({
                "quantization": quant or "default",
                "response": response["response"][:200],
                "tokens_per_second": response.get("eval_count", 0) / elapsed,
                "time": elapsed
            })
        except Exception as e:
            results.append({
                "quantization": quant,
                "error": str(e)
            })

    return results

# قارن Q4 مقابل Q8
prompt = "اشرح الحوسبة الكمية بعبارات بسيطة."
results = compare_quantizations(prompt, "llama3.2", ["8b-q4_K_M", "8b-q8_0"])

for r in results:
    print(f"\n{r['quantization']}:")
    print(f"  السرعة: {r.get('tokens_per_second', 0):.1f} توكن/ثانية")
    print(f"  عينة: {r.get('response', r.get('error', ''))[:100]}...")

متى تستخدم كل ضغط

الضغط حالة الاستخدام
Q4_K_M الخيار الافتراضي، أفضل توازن حجم/جودة
Q4_K_S ذاكرة محدودة، تحتاج أصغر 4-بت
Q5_K_M الجودة أهم من السرعة
Q8_0 أقصى جودة، لديك VRAM كافية
F16 المقارنة، التقييم مقابل الأصلي

إنشاء نماذج مضغوطة مخصصة

# Modelfile مع تلميح الضغط
FROM llama3.2

# طلب نظام للاستخدام المتخصص
SYSTEM أنت مساعد برمجة.

# هذه البارامترات تعمل جيداً مع ضغط Q4
PARAMETER temperature 0.7
PARAMETER top_p 0.9
# أنشئ النموذج المخصص
ollama create coding-assistant -f Modelfile

# النموذج الناتج يرث ضغط النموذج الأساسي
ollama show coding-assistant --modelfile

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

  1. Q4_K_M هي النقطة المثلى لمعظم حالات الاستخدام
  2. K-quants تحافظ على الجودة في الطبقات المهمة
  3. بتات أكثر = جودة أفضل لكن VRAM أكثر مطلوبة
  4. اختبر حالة استخدامك - تأثير الجودة يختلف حسب المهمة

الضغط يجعل النماذج الكبيرة متاحة. بعد ذلك، سنستكشف ضبط أداء وقت التشغيل لتعظيم السرعة. :::

اختبار

الوحدة 5: الأداء والتحسين

خذ الاختبار