دفتر ملاحظات Docker Model Runner: الأوامر وال أمثلة

مراجع سريعة للأوامر الخاصة بتشغيل نموذج Docker

Docker Model Runner (DMR) هو الحل الرسمي من Docker لتشغيل نماذج الذكاء الاصطناعي محليًا، وقد تم تقديمه في أبريل 2025. يوفر هذا الدليل مرجع سريع لأهم الأوامر، والتكوينات، والممارسات المثلى.

قائمة نماذج Gemma المتاحة في Docker Model Runner

التثبيت

Docker Desktop

تفعيل Docker Model Runner عبر الواجهة الرسومية:

  1. افتح Docker Desktop
  2. انتقل إلى الإعداداتال탭 AI
  3. اضغط على تفعيل Docker Model Runner
  4. أعد تشغيل Docker Desktop

/home/rg/prj/hugo-pers/content/post/2025/10/docker-model-runner-cheatsheet/docker-model-runner_w678.jpg واجهة Docker Model Runner

Docker Engine (Linux)

تثبيت حزمة المكون:

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install docker-model-plugin

# Fedora/RHEL
sudo dnf install docker-model-plugin

# Arch Linux
sudo pacman -S docker-model-plugin

التحقق من التثبيت:

docker model --help

دعم NVIDIA RTX لـ Docker

لتفعيل تشغيل النماذج الكبيرة على وحدة معالجة الرسومات (GPU) بدلًا من المعالج (CPU)، قم بتثبيت nvidia-container-toolkit:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

ثم يمكنك تشغيل الحاويات باستخدام --gpus all

docker run --rm --gpus all <image> <command>

تحقق من أن الحاوية يمكنها رؤية وحدة المعالجة الرسومية:

docker run --rm --gpus all nvidia/cuda:12.2.2-base-ubi8 nvidia-smi

إضافة دعم NVIDIA لـ Docker Model Runner

يحتاج Docker Model Runner إلى تكوين صريح لوحدة المعالجة الرسومية. على عكس الأوامر القياسية docker run، لا يدعم docker model run الأعلام --gpus أو -e. بدلًا من ذلك، يجب عليك:

  1. تكوين Docker daemon لاستخدام runtime NVIDIA بشكل افتراضي

أولًا، تحقق من مكان تثبيت nvidia-container-runtime:

which nvidia-container-runtime

سيكون هذا عادةً /usr/bin/nvidia-container-runtime. استخدم هذا المسار في التكوين أدناه.

أنشئ أو قم بتحديث /etc/docker/daemon.json:

sudo tee /etc/docker/daemon.json > /dev/null << 'EOF'
{
  "default-runtime": "nvidia",
  "runtimes": {
    "nvidia": {
      "path": "/usr/bin/nvidia-container-runtime",
      "runtimeArgs": []
    }
  }
}
EOF

ملاحظة: إذا عادت which nvidia-container-runtime إلى مسار مختلف، قم بتحديث قيمة "path" في تكوين JSON وفقًا لذلك.

أعد تشغيل Docker:

sudo systemctl restart docker

التحقق من التكوين:

docker info | grep -i runtime

يجب أن ترى Default Runtime: nvidia في الناتج.

  1. إعادة تثبيت Docker Model Runner مع دعم GPU

يجب أن يتم تثبيت Docker Model Runner أو إعادة تثبيته مع دعم GPU صريح:

# توقف المُشغل الحالي
docker model stop-runner

# إعادة التثبيت مع دعم CUDA
docker model reinstall-runner --gpu cuda

هذا سيقوم بسحب الإصدار الممكّن من CUDA (docker/model-runner:latest-cuda) بدلًا من الإصدار المخصص فقط للمعالج.

  1. التحقق من الوصول إلى GPU

تحقق من أن حاوية Docker Model Runner يمكنها الوصول إلى وحدة المعالجة الرسومية:

docker exec docker-model-runner nvidia-smi
  1. اختبار النموذج مع GPU

قم بتشغيل نموذج وتحقق من السجلات للتأكيد على استخدام GPU:

docker model run ai/qwen3:14B-Q6_K "من أنت؟"

تحقق من السجلات للحصول على تأكيد GPU:

docker model logs | grep -i cuda

يجب أن ترى رسائل مثل:

  • يتم استخدام الجهاز CUDA0 (NVIDIA GeForce RTX 4080)
  • تم نقل 41/41 طبقات إلى GPU
  • حجم مخزن GPU CUDA0 = 10946.13 ميغا بايت

ملاحظة: إذا قمت بتثبيت Docker Model Runner مسبقًا دون دعم GPU، فعليك إعادة تثبيته مع العلم --gpu cuda. لا يكفي فقط تكوين Docker daemon - يجب أن يكون الحاوية نفسها إصدارًا ممكّنًا من CUDA.

الخلفيات المتوفرة لـ GPU:

  • cuda - NVIDIA CUDA (الأكثر شيوعًا)
  • rocm - AMD ROCm
  • musa - Moore Threads MUSA
  • cann - Huawei CANN
  • auto - الكشف التلقائي (الافتراضي)
  • none - فقط المعالج

الأوامر الأساسية

سحب النماذج

سحب النماذج المعبأة مسبقًا من Docker Hub:

# سحب أساسي
docker model pull ai/llama2

# سحب إصدار محدد
docker model pull ai/llama2:7b-q4

# سحب من مستودع خاص
docker model pull myregistry.com/models/mistral:latest

# قائمة النماذج المتاحة في مساحة اسم
docker search ai/

تشغيل النماذج

ابدأ نموذجًا مع خدمة API تلقائية:

# تشغيل أساسي (تفاعلية)
docker model run ai/llama2 "ما هو Docker؟"

# تشغيل كخدمة (خلفية)
docker model run -d

بشكل عام، لا نملك خيارات كثيرة لتشغيل النماذج عبر CLI:

docker model run --help
Usage:  docker model run MODEL [PROMPT]

تشغيل نموذج وتفاعل معه باستخدام طلب مُقدّم أو وضع المحادثة

الخيارات:
      --color string                  استخدام إخراج ملون (auto|yes|no) (الافتراضي "auto")
      --debug                         تمكين سجلات التصحيح
  -d, --detach                        تحميل النموذج في الخلفية دون تفاعل
      --ignore-runtime-memory-check   لا تمنع السحب إذا تجاوزت الذاكرة المقدرة للنموذج موارد النظام.

قائمة النماذج

عرض النماذج المحمّلة والتشغيل:

# قائمة جميع النماذج المحمّلة
docker model ls

# قائمة النماذج المشغّلة
docker model ps

# قائمة مع معلومات تفصيلية
docker model ls --json

# قائمة مع معلومات تفصيلية
docker model ls --openai

# سيعيد فقط رموز هش
docker model ls -q

حذف النماذج

حذف النماذج من التخزين المحلي:

# حذف نموذج محدد
docker model rm ai/llama2

# حذف بالقوة (حتى لو كان يعمل)
docker model rm -f ai/llama2

# حذف النماذج غير المستخدمة
docker model prune

# حذف جميع النماذج
docker model rm $(docker model ls -q)

تكوين أحجام سياق النماذج

لا يمكننا استخدام CLI لتحديد حجم سياق النموذج لطلب معين.

بشكل أساسي، يمكننا التحكم في حجم سياق النموذج فقط في ثلاث طرق:

  1. حزم النموذج بأنفسنا، مع تحديد حجم السياق المُحدّد مسبقًا (انظر المزيد عن هذا في القسم التالي.)

  2. عند استخدام docker model runner، تكوين الأمر مع معلمة –context-size مثل:

docker model configure --context-size=10000 ai/gemma3-qat:4B

ثم يمكنك استخدام curl له، ولكن لا يمكنك فعل docker model run... - سيتجاهل هذا الأمر التكوين.

  1. في ملف docker-compose.yaml، ولكن لا يمكننا استخدام صورة docker-model-runner بهذه الطريقة، لأنها تمرر إلى النموذج حجم سياق مُحدّد مسبقًا بقيمة 4096
...
models:
  llm_model:
    model: ai/gemma3-qat:4B
    context_size: 10240
...

للحصول على تفاصيل إضافية، يرجى رؤية المنشور المخصص حول هذا الموضوع: تحديد حجم السياق في DMR

حزم النماذج المخصصة

إنشاء OCI Artifact من GGUF

حزم نماذج GGUF الخاصة بك:

# الحزم الأساسية
docker model package --gguf /path/to/model.gguf myorg/mymodel:latest

# الحزم مع البيانات
docker model package \
  --gguf /path/to/model.gguf \
  --label "description=نموذج Llama المخصص" \
  --label "version=1.0" \
  myorg/mymodel:v1.0

# الحزم والدفع في أمر واحد
docker model package --gguf /path/to/model.gguf --push myorg/mymodel:latest

# الحزم مع حجم سياق مخصص
docker model package \
  --gguf /path/to/model.gguf \
  --context 8192 \
  myorg/mymodel:latest

نشر النماذج

دفع النماذج إلى المستودعات:

# تسجيل الدخول إلى Docker Hub
docker login

# دفع إلى Docker Hub
docker model push myorg/mymodel:latest

# دفع إلى مستودع خاص
docker login myregistry.com
docker model push myregistry.com/models/mymodel:latest

# تسمية ودفع
docker model tag mymodel:latest myorg/mymodel:v1.0
docker model push myorg/mymodel:v1.0

استخدام API

نقاط النهاية المتوافقة مع OpenAI

يقوم Docker Model Runner بعرض تلقائي لنقاط النهاية المتوافقة مع OpenAI:

# بدء النموذج مع API
docker model run -d -p 8080:8080 --name llm ai/llama2

# إكمال المحادثة
curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama2",
    "messages": [{"role": "user", "content": "مرحبا!"}]
  }'

# إنتاج النص
curl http://localhost:8080/v1/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama2",
    "prompt": "في يوم ما",
    "max_tokens": 100
  }'

# استجابة متسلسلة
curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama2",
    "messages": [{"role": "user", "content": "أخبرني قصة"}],
    "stream": true
  }'

# قائمة النماذج المتاحة عبر API
curl http://localhost:8080/v1/models

# معلومات النموذج
curl http://localhost:8080/v1/models/llama2

تكوين Docker Compose

ملف Compose الأساسي

version: '3.8'

services:
  llm:
    image: docker-model-runner
    model: ai/llama2:7b-q4
    ports:
      - "8080:8080"
    environment:
      - MODEL_TEMPERATURE=0.7
    volumes:
      - docker-model-runner-models:/models
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

volumes:
  docker-model-runner-models:
    external: true

إعداد متعدد النماذج

version: '3.8'

services:
  llama:
    image: docker-model-runner
    model: ai/llama2
    ports:
      - "8080:8080"
    
  mistral:
    image: docker-model-runner
    model: ai/mistral
    ports:
      - "8081:8080"
    
  embedding:
    image: docker-model-runner
    model: ai/nomic-embed-text
    ports:
      - "8082:8080"

للحصول على تكوينات Docker Compose المتقدمة وأوامر إضافية، راجع دليل Docker Compose الذي يغطي الشبكات، والوحدات، والأنماط المُنظمّة.

المتغيرات البيئية

قم بتكوين سلوك النموذج باستخدام المتغيرات البيئية:

# درجة الحرارة (0.0-1.0)
MODEL_TEMPERATURE=0.7

# تجريب p
MODEL_TOP_P=0.9

# تجريب k
MODEL_TOP_K=40

# أقصى عدد من الرموز
MODEL_MAX_TOKENS=2048

# عدد طبقات GPU
MODEL_GPU_LAYERS=35

# حجم الدفعة
MODEL_BATCH_SIZE=512

# عدد الخيوط (المعالج)
MODEL_THREADS=8

# تمكين سجلات مفصلة
MODEL_VERBOSE=true

# مفتاح API للتوثيق
MODEL_API_KEY=your-secret-key

تشغيل مع المتغيرات البيئية:

docker model run \
  -e MODEL_TEMPERATURE=0.8 \
  -e MODEL_API_KEY=secret123 \
  ai/llama2

تكوين GPU

الكشف التلقائي عن GPU

يكتشف DMR تلقائيًا ويستخدم GPUs المتاحة:

# استخدام جميع GPUs
docker model run --gpus all ai/llama2

# استخدام GPU محدد
docker model run --gpus 0 ai/llama2

# استخدام عدة GPUs محددة
docker model run --gpus 0,1,2 ai/llama2

# GPU مع حد مساحة الذاكرة
docker model run --gpus all --memory 16g ai/llama2

وضع المعالج فقط

إجبار الاستنتاج على المعالج عندما يكون GPU متاحًا:

docker model run --no-gpu ai/llama2

توزيع النماذج الكبيرة عبر GPUs متعددة

توزيع النماذج الكبيرة عبر GPUs:

docker model run \
  --gpus all \
  --tensor-parallel 2 \
  ai/llama2-70b

الفحص والتصحيح

عرض تفاصيل النموذج

# فحص تكوين النموذج
docker model inspect ai/llama2

# عرض طبقات النموذج
docker model history ai/llama2

# التحقق من حجم النموذج والمعلومات
docker model inspect --format='{{.Size}}' ai/llama2

السجلات والمراقبة

# عرض سجلات النموذج
docker model logs llm

# متابعة السجلات في الوقت الفعلي
docker model logs -f llm

# عرض 100 سطر الأخيرة
docker model logs --tail 100 llm

# عرض السجلات مع تواريخ
docker model logs -t llm

الإحصائيات الأداء

# استخدام الموارد
docker model stats

# إحصائيات نموذج محدد
docker model stats llm

# إحصائيات في تنسيق JSON
docker model stats --format json

الشبكات

إظهار APIs

# المنفذ الافتراضي (8080)
docker model run -p 8080:8080 ai/llama2

# منفذ مخصص
docker model run -p 3000:8080 ai/llama2

# ربط إلى واجهة محددة
docker model run -p 127.0.0.1:8080:8080 ai/llama2

# عدة منافذ
docker model run -p 8080:8080 -p 9090:9090 ai/llama2

تكوين الشبكة

# إنشاء شبكة مخصصة
docker network create llm-network

# تشغيل نموذج على شبكة مخصصة
docker model run --network llm-network --name llm ai/llama2

# الاتصال بشبكة موجودة
docker model run --network host ai/llama2

الأمان

التحكم في الوصول

# تشغيل مع مصادقة مفتاح API
docker model run \
  -e MODEL_API_KEY=my-secret-key \
  ai/llama2

# استخدام مع مصادقة
curl http://localhost:8080/v1/chat/completions \
  -H "Authorization: Bearer my-secret-key" \
  -H "Content-Type: application/json" \
  -d '{"model": "llama2", "messages": [...]}'

مصادقة المستودع

# تسجيل الدخول إلى مستودع خاص
docker login myregistry.com -u username -p password

# سحب من مستودع خاص
docker model pull myregistry.com/private/model:latest

# استخدام مساعدي المصادقة
docker login --password-stdin < token.txt

الممارسات المثلى

اختيار النموذج

# استخدام نماذج مُكمّسة لتحسين الاستنتاج
docker model pull ai/llama2:7b-q4     # كمّسة 4 بت
docker model pull ai/llama2:7b-q5     # كمّسة 5 بت
docker model pull ai/llama2:7b-q8     # كمّسة 8 بت

# التحقق من المتغيرات النموذجية
docker search ai/llama2

إدارة الموارد

# تحديد حدود الذاكرة
docker model run --memory 8g --memory-swap 16g ai/llama2

# تحديد حدود المعالج
docker model run --cpus 4 ai/llama2

# تحديد حدود الذاكرة لـ GPU
docker model run --gpus all --gpu-memory 8g ai/llama2

الفحص الصحي

# تشغيل مع فحص صحي
docker model run \
  --health-cmd "curl -f http://localhost:8080/health || exit 1" \
  --health-interval 30s \
  --health-timeout 10s \
  --health-retries 3 \
  ai/llama2

تنسيق الإنتاج

للمشاريع الإنتاجية مع Kubernetes، يمكن استخدام حاويات Docker Model Runner مع مانيفستات Kubernetes القياسية. عرف التوزيعات مع حدود الموارد، والتوسع التلقائي، والتوازن. للحصول على مرجع شامل لأوامر Kubernetes ونمط التوزيع، راجع دليل Kubernetes.

# مثال: توزيع على كластر Kubernetes
kubectl apply -f llm-deployment.yaml

# توسيع التوزيع
kubectl scale deployment llm --replicas=3

# إظهار كخدمة
kubectl expose deployment llm --type=LoadBalancer --port=8080

التصحيح

المشكلات الشائعة

لن يبدأ النموذج:

# تحقق من مساحة القرص المتاحة
df -h

# عرض سجلات الخطأ التفصيلية
docker model logs --tail 50 llm

# تحقق من توفر GPU
nvidia-smi  # لوحدات المعالجة الرسومية NVIDIA

أخطاء نقص الذاكرة:

# استخدم نموذجًا مُكمّسًا أصغر
docker model pull ai/llama2:7b-q4

# قلل حجم السياق
docker model run -e MODEL_CONTEXT=2048 ai/llama2

# قلل حجم الدفعة
docker model run -e MODEL_BATCH_SIZE=256 ai/llama2

الاستنتاج البطيء:

# تحقق من استخدام GPU
docker model stats llm

# تأكد من استخدام GPU
docker model logs llm | grep -i gpu

# زيادة طبقات GPU
docker model run -e MODEL_GPU_LAYERS=40 ai/llama2

الأوامر التشخيصية

# معلومات النظام
docker model system info

# استخدام القرص
docker model system df

# تنظيف الموارد غير المستخدمة
docker model system prune

# تنظيف كامل (إزالة جميع النماذج)
docker model system prune -a

أمثلة التكامل

التكامل مع Python

import openai

# تكوين العميل لـ Docker Model Runner
client = openai.OpenAI(
    base_url="http://localhost:8080/v1",
    api_key="not-needed"  # لا يتطلب DMR مفتاحًا بشكل افتراضي
)

# إكمال المحادثة
response = client.chat.completions.create(
    model="llama2",
    messages=[
        {"role": "user", "content": "مرحبا!"}
    ]
)

print(response.choices[0].message.content)

# التدفق
stream = client.chat.completions.create(
    model="llama2",
    messages=[{"role": "user", "content": "أخبرني قصة"}],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

نسخة Bash

#!/bin/bash

# ابدأ النموذج إذا لم يكن يعمل
if ! docker model ps | grep -q "llm"; then
    docker model run -d --name llm -p 8080:8080 ai/llama2
    echo "الانتظار حتى يبدأ النموذج..."
    sleep 10
fi

# إجراء مكالمة API
curl -s http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama2",
    "messages": [{"role": "user", "content": "'"$1"'"}]
  }' | jq -r '.choices[0].message.content'

تكامل Node.js

import OpenAI from 'openai';

const client = new OpenAI({
    baseURL: 'http://localhost:8080/v1',
    apiKey: 'not-needed'
});

async function chat(message) {
    const completion = await client.chat.completions.create({
        model: 'llama2',
        messages: [{ role: 'user', content: message }]
    });
    
    return completion.choices[0].message.content;
}

// الاستخدام
const response = await chat('ما هو Docker Model Runner؟');
console.log(response);

الروابط المفيدة

الوثائق الرسمية

الدليلات المفيدة

مقالات المقارنة