الأداء والتحسين
شرح الضغط الكمّي
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
النقاط الرئيسية
- Q4_K_M هي النقطة المثلى لمعظم حالات الاستخدام
- K-quants تحافظ على الجودة في الطبقات المهمة
- بتات أكثر = جودة أفضل لكن VRAM أكثر مطلوبة
- اختبر حالة استخدامك - تأثير الجودة يختلف حسب المهمة
الضغط يجعل النماذج الكبيرة متاحة. بعد ذلك، سنستكشف ضبط أداء وقت التشغيل لتعظيم السرعة. :::