البنية التحتية والنشر

Docker لنماذج ML

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

تعبئة Docker في حاويات أمر أساسي لـ MLOps. يتوقع المحاورون أن تحسن الحاويات لأحمال عمل ML.

سؤال المقابلة: البناء متعدد المراحل

السؤال: "كيف ستحسن صورة Docker لتقديم نموذج PyTorch؟"

هيكل الإجابة القوية:

# المرحلة 1: مرحلة البناء - تتضمن أدوات البناء
FROM python:3.11-slim AS builder

WORKDIR /app

# تثبيت تبعيات البناء
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

# تثبيت تبعيات Python
COPY requirements.txt .
RUN pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt

# المرحلة 2: مرحلة التشغيل - الحد الأدنى
FROM python:3.11-slim AS runtime

WORKDIR /app

# نسخ العجلات فقط، وليس أدوات البناء
COPY --from=builder /wheels /wheels
RUN pip install --no-cache-dir /wheels/* && rm -rf /wheels

# نسخ النموذج وكود الاستدلال
COPY model/ ./model/
COPY src/ ./src/

# مستخدم غير root للأمان
RUN useradd -m appuser && chown -R appuser:appuser /app
USER appuser

EXPOSE 8080
CMD ["python", "src/serve.py"]

استراتيجيات التحسين الرئيسية

الاستراتيجية التأثير كيفية الشرح
البناء متعدد المراحل تقليل الحجم 60-80% "تبعيات البناء لا تُشحن للإنتاج"
ترتيب الطبقات إعادة بناء أسرع "ضع الطبقات نادرة التغيير أولاً (OS، deps)"
dockerignore. سياق أصغر "استبعاد بيانات التدريب، الدفاتر، الاختبارات"
صور أساسية نحيفة أصغر 5 مرات "python:3.11-slim مقابل python:3.11"
تثبيت pip بدون cache توفير 100MB+ "العجلات لا تحتاج cache في الحاوية"

أسئلة المتابعة الشائعة في المقابلات

س: "كيف تتعامل مع أوزان النموذج؟"

# الخيار 1: تضمين في الصورة (للنماذج الصغيرة <500MB)
COPY model_weights.pt /app/model/

# الخيار 2: التنزيل عند البدء (للنماذج الكبيرة)
# استخدم init container أو سكريبت entrypoint
ENV MODEL_PATH=/models/bert-large
RUN mkdir -p /models

# الخيار 3: التحميل من volume (الإنتاج)
# عند التشغيل: -v /host/models:/app/models

س: "كيف تتعامل مع حاويات GPU؟"

# استخدم صورة NVIDIA الأساسية لدعم CUDA
FROM nvidia/cuda:12.1-runtime-ubuntu22.04

# أو PyTorch مع CUDA مثبت مسبقاً
FROM pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime

# تحقق من الوصول إلى GPU عند التشغيل
# docker run --gpus all my-ml-image nvidia-smi

أفضل ممارسات الأمان

غالباً ما يتحقق المحاورون من الوعي الأمني:

# 1. لا تشغل كـ root في الإنتاج أبداً
USER appuser

# 2. ثبت الإصدارات للتكرارية
FROM python:3.11.7-slim@sha256:abc123...

# 3. افحص الصور في CI/CD
# trivy image my-ml-image:latest

# 4. لا تضمن الأسرار
# سيء: ENV AWS_SECRET_KEY=xyz
# جيد: استخدم مدير الأسرار عند التشغيل

إشارة المقابلة: ذكر Trivy أو Grype لفحص الحاويات يُظهر نضج أمني.

في الدرس التالي، سنغطي أسئلة مقابلات Kubernetes. :::

اختبار

الوحدة 2: البنية التحتية والنشر

خذ الاختبار