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 التي تستخدمها مهام أخرى.
📋 المتطلبات المسبقة: يجب أن تتقن ما يلي أولًا
- الدرس 2: تثبيت Ollama وإعداد البيئة
1. ماذا ستتعلم
- مبادئ تسريع GPU في Ollama: التقدير الكمي GGUF + تفريغ GPU
- كشف وإعداد بيئة NVIDIA CUDA
- تسريع AMD ROCm وApple Metal
- الاستنتاج بـ GPU متعددة واستراتيجيات توزيع الذاكرة
- تقدير VRAM وتحويل عدد معلمات النموذج
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.
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 بحت.
📖 ملخص
- تسريع GPU يُنفَّذ عبر تفريغ الطبقات: GPU كامل الأسرع، الوضع الهجين في الوسط، CPU فقط الأبطأ
- تقدير VRAM: عدد المعلمات × بايت التقدير الكمي × 1.2 معامل الحمل الزائد
- NVIDIA تحتاج فقط تثبيت المشغّل (بدون CUDA Toolkit)؛ Ollama يكتشف تلقائيًا
- AMD ROCm على Linux فقط؛ Apple Metal على macOS بدون إعداد
- GPU المتعددة تُتحكم عبر OLLAMA_NUM_GPU وCUDA_VISIBLE_DEVICES
- سيناريو أليس: تسريع GPU زاد سرعة الاستنتاج من 5 رموز/ثانية إلى 55 رمز/ثانية
📝 تمارين
- أساسي (صعوبة ⭐): تحقق مما إذا كان تسريع GPU يعمل على جهازك، باستخدام
--verboseلمقارنة سرع استنتاج CPU وGPU. - متوسط (صعوبة ⭐⭐): بناءً على حجم VRAM لـ GPU لديك، احسب أكبر نموذج يمكنك تشغيله (أي عدد معلمات + أي مستوى تقدير كمي)، وتحقق بالاختبار الفعلي.
- متقدم (صعوبة ⭐⭐⭐): اختبر استراتيجيات توزيع GPU مختلفة في بيئة GPU متعددة (GPU واحدة مقابل GPU متعددة)، وسجّل سرعة الاستنتاج وكمون أول رمز واستخدام الذاكرة، وأصدر تقرير مقارنة أداء.