Ollama: إعداد GPU وCUDA

GPU هو المُسرّع للذكاء الاصطناعي المحلي — من 5 رموز في الثانية إلى 50 رمز في الثانية، فرق عشرة أضعاف.

💡 نصيحة: استخدم المتغير البيئي CUDA_VISIBLE_DEVICES للتحكم الدقيق في بطاقات GPU التي يستخدمها Ollama. مثلاً، CUDA_VISIBLE_DEVICES=0 يستخدم GPU الأولى فقط، بينما CUDA_VISIBLE_DEVICES=0,1 يستخدم الأوليين. على خوادم GPU المتعددة، يتيح لك هذا المتغير تحديد GPU للاستنتاج وتجنب احتلال Ollama لبطاقات GPU التي تستخدمها مهام أخرى.

📋 المتطلبات المسبقة: يجب أن تتقن ما يلي أولًا

1. ماذا ستتعلم


2. قصة مطور حقيقية

⚠️ تحذير: يجب أن يتطابق إصدار CUDA مع إصدار مشغّل NVIDIA. المشغّلات القديمة قد تجعل nvidia-smi يعمل بشكل طبيعي لكن Ollama غير قادر على استخدام GPU. نوصي بتثبيت مشغّل NVIDIA ≥ 535 وCUDA ≥ 12.0، والتأكد من أن CUDA Version في مخرجات nvidia-smi يتطابق مع CUDA Toolkit الفعلي.

(1) المشكلة: الاستنتاج على CPU بطيء جدًا

منتج SaaS لأليس يحتاج تحليلًا فوريًا لتقييمات العملاء. سرعة الاستنتاج على CPU فقط 5 رموز/ثانية — رد بـ 200 رمز يستغرق 40 ثانية، مما يؤدي لتجربة مستخدم سيئة. خادمها يحتوي على GPU من NVIDIA لكن Ollama لا يستخدمه.

(2) الحل: تسريع GPU يمنح تسريعًا بـ 10 أضعاف

بعد إعداد CUDA، زادت سرعة استنتاج نفس النموذج من 5 رموز/ثانية إلى 55 رمز/ثانية — رد بـ 200 رمز يستغرق الآن 3.6 ثانية فقط:

BASH
# التحقق من كشف GPU
ollama run --verbose llama3.2 "test"

# قبل (CPU): eval speed: 5.0 tokens/s
# بعد (GPU):  eval speed: 55.0 tokens/s

3. مبادئ تسريع GPU

💡 نصيحة: يُحمّل Ollama تلقائيًا أكبر عدد ممكن من طبقات النموذج على GPU، واضعًا الطبقات المتبقية في ذاكرة CPU RAM (الوضع الهجين). عندما لا تكفي VRAM للنموذج الكامل، يرجع تلقائيًا للاستنتاج الهجين GPU+CPU، بسرعة بين GPU بحت وCPU بحت.

(1) بنية التقدير الكمي GGUF + تفريغ GPU

⚠️ ملاحظة: عندما لا تكفي VRAM لتحميل النموذج الكامل، يرجع Ollama تلقائيًا للوضع الهجين GPU+CPU — بعض طبقات النموذج تعمل على GPU والباقي على CPU. أداء الوضع الهجين أقل بكثير من وضع GPU البحت، وسرعة استنتاج CPU تعتمد على عرض نطاق RAM بالنظام. إذا كانت سرعة الاستنتاج أقل بكثير من المتوقع (مثلاً، نموذج 8B أقل من 20 رمز/ثانية)، تحقق مما إذا كان يحدث رجوع إلى CPU بسبب عدم كفاية VRAM.

100%
flowchart LR
    A[Model GGUF<br/>Q4_K_M] --> B{Load Strategy}
    B -->|Full GPU| C[GPU VRAM<br/>Fast Inference]
    B -->|Partial| D[GPU Layers<br/>+ CPU RAM<br/>Hybrid Mode]
    B -->|CPU Only| E[CPU RAM<br/>Slow Inference]

يستخدم Ollama استراتيجية "تفريغ الطبقات"، يوزع طبقات النموذج بين GPU (سريع) وCPU (بطيء):

الوضع استراتيجية التوزيع السرعة متطلبات الذاكرة
GPU كامل جميع الطبقات في VRAM الأسرع (50+ رمز/ثانية) VRAM ≥ حجم النموذج
الوضع الهجين بعض الطبقات GPU + بعض CPU متوسط (15-30 رمز/ثانية) VRAM < حجم النموذج
CPU فقط جميع الطبقات في RAM الأبطأ (3-10 رموز/ثانية) RAM ≥ حجم النموذج

(2) معادلة تقدير متطلبات VRAM

TEXT
VRAM needed (GB) ≈ Parameters (B) × Quantization bytes × 1.2 (overhead)

أمثلة:
  7B Q4_K_M:  7 × 0.5 bytes × 1.2 ≈ 4.2 GB
  8B Q4_K_M:  8 × 0.5 bytes × 1.2 ≈ 4.8 GB
  70B Q4_K_M: 70 × 0.5 bytes × 1.2 ≈ 42 GB
النموذج التقدير الكمي VRAM الأدنى VRAM الموصى به
3B Q4_K_M 2 غيغابايت 4 غيغابايت
8B Q4_K_M 5 غيغابايت 8 غيغابايت
8B Q8_0 9 غيغابايت 12 غيغابايت
70B Q4_K_M 42 غيغابايت 48 غيغابايت (2×24GB)
70B Q8_0 75 غيغابايت 80 غيغابايت (4×24GB)

4. إعداد NVIDIA CUDA

(1) التحقق من تثبيت CUDA

الخطوة الأمر المخرجات المتوقعة
فحص GPU nvidia-smi يعرض طراز GPU وVRAM
فحص إصدار CUDA nvidia-smi | grep "CUDA Version" CUDA Version: 12.x
فحص nvcc nvcc --version يعرض إصدار حزمة CUDA
التحقق من Ollama ollama run --verbose model يعرض سرعة الاستنتاج
💡 نصيحة: لا يحتاج Ollama لتثبيت CUDA Toolkit منفصل — مشغّل NVIDIA كافٍ. فقط تأكد من أن nvidia-smi قابل للتشغيل؛ يكتشف Ollama GPU ويستخدمه تلقائيًا.

(2) الإعداد حسب المنصة

المنصة نقاط الإعداد الرئيسية ملاحظات
Linux تثبيت مشغّل NVIDIA الأبسط، دعم أصلي
Windows WSL2 تثبيت مشغّل NVIDIA على Windows WSL2 يرث GPU تلقائيًا
Windows أصلي تثبيت مشغّل NVIDIA Ollama 0.5+ يدعم أصليًا

▶ مثال 1: التحقق من بيئة CUDA على Linux

BASH
# الخطوة 1: فحص ظهور GPU
nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv
# NVIDIA GeForce RTX 4090, 24576 MiB, 550.54.15

# الخطوة 2: التحقق من إصدار CUDA
nvidia-smi | grep "CUDA Version"
# CUDA Version: 12.4

# الخطوة 3: اختبار تسريع GPU في Ollama
ollama run --verbose llama3.2 "Hello"
# Look for: "load duration" (should be < 1s with GPU)
# Look for: "eval speed" (should be 30+ tokens/s with GPU)

# الخطوة 4: فحص الجهاز الذي يستخدمه Ollama
OLLAMA_DEBUG=1 ollama run llama3.2 "test" 2>&1 | grep -i cuda
# cuda: detected devices [0]

الإخراج:

TEXT
I'm a helpful AI assistant running locally on your machine...

▶ مثال 2: إعداد GPU عبر WSL2

POWERSHELL
# على Windows: التحقق من تثبيت مشغّل NVIDIA
nvidia-smi

# الدخول إلى WSL2
wsl

# داخل WSL2: التحقق من تمرير GPU
nvidia-smi
# Should show same GPU as Windows

# تثبيت Ollama في WSL2
curl -fsSL https://ollama.com/install.sh | sh

# اختبار الاستنتاج على GPU
ollama run --verbose llama3.2 "Hello"
# eval speed should show GPU-level performance

الإخراج:

TEXT
// Execution successful

5. AMD ROCm وApple Metal

(1) دعم AMD ROCm (Linux فقط)

سلسلة GPU الدعم ملاحظات
RX 7900 XTX ROCm 5.7+
RX 7900 XT ROCm 5.7+
RX 6800 XT ROCm 5.5+
RX 580 غير مدعومة
Windows ROCm يدعم Linux فقط
BASH
# التحقق من عمل ROCm
rocminfo | grep "gfx"
# Should show gfx1100 (RDNA3) or gfx1030 (RDNA2)

# يكتشف Ollama GPU من AMD تلقائيًا على Linux
ollama run --verbose llama3.2 "Hello"
# Should show: using AMD GPU

(2) تسريع Apple Metal

Hardware الذاكرة الموحدة النموذج الموصى به
M1 (8GB) 8 غيغابايت 3B Q4_K_M
M2 (16GB) 16 غيغابايت 8B Q4_K_M
M3 Pro (18GB) 18 غيغابايت 8B Q4_K_M
M4 Max (128GB) 128 غيغابايت 70B Q4_K_M
💡 نصيحة: بنية الذاكرة الموحدة لـ Apple Silicon ميزة طبيعية — VRAM = RAM. M4 Max بـ 128 غيغابايت يمكنه تشغيل نماذج 70B.

▶ مثال 3: التحقق من Apple Metal

BASH
# على macOS: تسريع Metal تلقائي
ollama run --verbose llama3.2 "Hello"

# فحص استخدام Metal في السجلات
# Look for: "using Metal" in debug output
OLLAMA_DEBUG=1 ollama run llama3.2 "test" 2>&1 | grep -i metal

# مراقبة استخدام GPU
# افتح Activity Monitor → تبويب GPU
# أو استخدم: sudo powermetrics --samplers gpu_power -i 1000

الإخراج:

TEXT
I'm a helpful AI assistant running locally on your machine...

6. استراتيجيات GPU المتعددة

(1) خيارات إعداد GPU المتعددة

المتغير البيئي الافتراضي الوصف
OLLAMA_NUM_GPU تلقائي عدد GPU للاستخدام
CUDA_VISIBLE_DEVICES الكل تحديد GPU المرئية
OLLAMA_LLD_LIBRARY_PATH تلقائي نوع المشغّل (cuda/rocm/metal)

(2) مقارنة سيناريوهات GPU المتعددة

السيناريو إعداد GPU النماذج القابلة للتشغيل الاستراتيجية
GPU واحدة 8GB 1× RTX 3060 8B Q4_K_M تفريغ كامل على GPU
GPU واحدة 24GB 1× RTX 4090 8B Q8_0 / 70B Q2_K تفريغ كامل
GPU مزدوجة 48GB 2× RTX 4090 70B Q4_K_M تقسيم النموذج على GPU اثنتين
GPU رباعية 320GB 4× A100 80GB 405B بتقدير كمي توازي الموترات

▶ مثال 4: إعداد GPU متعددة

BASH
# استخدام GPU اثنتين للاستنتاج
export OLLAMA_NUM_GPU=2
ollama serve

# أو تحديد أي GPU للاستخدام
export CUDA_VISIBLE_DEVICES=0,1
ollama serve

# التحقق من استخدام GPU المتعددة
nvidia-smi  # كلا GPU يجب أن يظهر استخدام الذاكرة أثناء الاستنتاج

# تشغيل نموذج كبير يحتاج GPU اثنتين
ollama run llama3.1:70b "Explain quantum computing"

الإخراج:

TEXT
I'm a helpful AI assistant running locally on your machine...

▶ مثال 5: تشخيص توزيع ذاكرة GPU

BASH
#!/bin/bash
# سكربت تشخيص ذاكرة GPU

echo "=== GPU Memory Report ==="
echo ""

nvidia-smi --query-gpu=index,name,memory.total,memory.used,memory.free --format=csv

echo ""
echo "=== Model Memory Estimation ==="

estimate_vram() {
    local params=$1
    local quant=$2
    local overhead=1.2
    local vram=$(echo "scale=1; $params * $quant * $overhead" | bc)
    echo "  ${params}B model (${quant}B/param): ~${vram}GB VRAM needed"
}

estimate_vram 3 0.5   # Q4_K_M ~0.5 bytes/param
estimate_vram 8 0.5   # Q4_K_M
estimate_vram 8 1.0   # Q8_0
estimate_vram 70 0.5  # Q4_K_M
estimate_vram 70 1.0  # Q8_0

echo ""
echo "=== Recommendation ==="
total_vram=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | awk '{sum+=$1} END {print sum}')
echo "Total VRAM: ${total_vram}MB (~$((total_vram/1024))GB)"

if [ "$total_vram" -gt 40000 ]; then
    echo "Can run: 70B Q4_K_M (recommended) or 8B Q8_0"
elif [ "$total_vram" -gt 8000 ]; then
    echo "Can run: 8B Q4_K_M (recommended)"
elif [ "$total_vram" -gt 4000 ]; then
    echo "Can run: 3B Q4_K_M"
else
    echo "GPU VRAM too low. Use CPU-only mode with 16GB+ RAM."
fi

الإخراج:

TEXT
# تم تنفيذ الأمر بنجاح

7. مثال شامل: سكربت قرار نشر GPU

PYTHON
# ============================================
# شامل: محرك قرار نشر GPU
# يحلل hardware ويوصي بإعداد النموذج
# ============================================

import subprocess
import json
from dataclasses import dataclass
from typing import Optional

@dataclass
class GPUInfo:
    name: str
    vram_mb: int
    index: int

@dataclass
class ModelRecommendation:
    model: str
    quantization: str
    vram_needed_gb: float
    fits: bool
    strategy: str

def detect_gpus() -> list[GPUInfo]:
    """Detect available GPUs via nvidia-smi."""
    try:
        result = subprocess.run(
            ["nvidia-smi", "--query-gpu=index,name,memory.total",
             "--format=csv,noheader,nounits"],
            capture_output=True, text=True
        )
        gpus = []
        for line in result.stdout.strip().split("\n"):
            if line:
                parts = [p.strip() for p in line.split(",")]
                gpus.append(GPUInfo(
                    index=int(parts[0]),
                    name=parts[1],
                    vram_mb=int(float(parts[2]))
                ))
        return gpus
    except Exception:
        return []

def estimate_vram(params_b: float, quant_bytes: float) -> float:
    """Estimate VRAM needed for a model."""
    return params_b * quant_bytes * 1.2

def recommend_models(total_vram_gb: float) -> list[ModelRecommendation]:
    """Recommend models based on available VRAM."""
    models = [
        ("llama3.2:3b", 3.2, 0.5, "Q4_K_M"),
        ("llama3.1:8b", 8.0, 0.5, "Q4_K_M"),
        ("llama3.1:8b", 8.0, 1.0, "Q8_0"),
        ("llama3.1:70b", 70.0, 0.5, "Q4_K_M"),
    ]
    recs = []
    for name, params, qbytes, quant in models:
        needed = estimate_vram(params, qbytes)
        fits = needed <= total_vram_gb
        if fits:
            strategy = "Full GPU offload"
        elif needed <= total_vram_gb * 1.5:
            strategy = "Hybrid (partial GPU + CPU)"
        else:
            strategy = "CPU only or multi-GPU required"
        recs.append(ModelRecommendation(
            model=name, quantization=quant,
            vram_needed_gb=round(needed, 1),
            fits=fits, strategy=strategy
        ))
    return recs

# التحليل الرئيسي
if __name__ == "__main__":
    gpus = detect_gpus()
    if not gpus:
        print("No NVIDIA GPU detected. Using CPU-only mode.")
        print("Recommended: llama3.2:3b with 8GB+ RAM")
    else:
        total_vram = sum(g.vram_mb for g in gpus) / 1024
        print(f"Detected {len(gpus)} GPU(s):")
        for g in gpus:
            print(f"  GPU {g.index}: {g.name} ({g.vram_mb}MB)")
        print(f"Total VRAM: {total_vram:.1f}GB")
        print()
        print("Model Recommendations:")
        for r in recommend_models(total_vram):
            status = "✅" if r.fits else "❌"
            print(f"  {status} {r.model} ({r.quantization}): "
                  f"{r.vram_needed_gb}GB - {r.strategy}")

❓ أسئلة شائعة

س Ollama يعرض استنتاج CPU رغم امتلاكي GPU، ماذا أفعل؟
ج شغّل nvidia-smi لتأكيد عمل المشغّل. على Linux، تحقق مما إذا كان المستخدم في مجموعة video: sudo usermod -aG video $USER. أعد تشغيل خدمة Ollama: sudo systemctl restart ollama.
س سرعة الاستنتاج على GPU أبطأ من المتوقع، ماذا أفعل؟
ج قد يكون هذا الوضع الهجين (بعض الطبقات على CPU). افحص مخرجات --verbose لعدد طبقات GPU. تقليل num_ctx يخفض استخدام KV Cache للذاكرة، مما يتيح تفريغ طبقات أكثر على GPU.
س هل يمكن لـ AMD GPU العمل على Windows؟
ج حاليًا ROCm يدعم Linux فقط. بطاقات AMD GPU لا يمكنها تسريع Ollama على Windows. نوصي باستخدام Linux أو النظر في GPU من NVIDIA.
س هل تسريع Metal على Mac يحتاج إعدادًا؟
ج لا. على macOS، يستخدم Ollama تسريع Metal تلقائيًا بدون أي إعداد. أي Mac بـ Apple Silicon أو GPU من AMD يُكتشف تلقائيًا.
س كيف تُوزع النماذج عبر GPU متعددة؟
ج يوزع Ollama طبقات النموذج بالتساوي على GPU المتاحة تلقائيًا. اضبط OLLAMA_NUM_GPU=N لتحديد استخدام N من GPU. CUDA_VISIBLE_DEVICES يتيح لك اختيار GPU محددة.
س هل يمكنني تشغيل نموذج كبير إذا كانت VRAM غير كافية لكن RAM كافية؟
ج نعم. يستخدم Ollama الوضع الهجين تلقائيًا — بعض الطبقات على GPU وبعضها على CPU RAM. السرعة تقع بين GPU بحت وCPU بحت.

📖 ملخص


📝 تمارين

  1. أساسي (صعوبة ⭐): تحقق مما إذا كان تسريع GPU يعمل على جهازك، باستخدام --verbose لمقارنة سرع استنتاج CPU وGPU.
  2. متوسط (صعوبة ⭐⭐): بناءً على حجم VRAM لـ GPU لديك، احسب أكبر نموذج يمكنك تشغيله (أي عدد معلمات + أي مستوى تقدير كمي)، وتحقق بالاختبار الفعلي.
  3. متقدم (صعوبة ⭐⭐⭐): اختبر استراتيجيات توزيع GPU مختلفة في بيئة GPU متعددة (GPU واحدة مقابل GPU متعددة)، وسجّل سرعة الاستنتاج وكمون أول رمز واستخدام الذاكرة، وأصدر تقرير مقارنة أداء.
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%