CI/CD لأنظمة ML

GitHub Actions لخطوط أنابيب ML

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

GitHub Actions هي أداة CI/CD الأكثر شيوعاً في ML. يتوقع المحاورون أن تصمم سير عمل للتدريب والاختبار والنشر.

سؤال المقابلة: تصميم CI/CD لـ ML

السؤال: "صمم سير عمل GitHub Actions لمشروع ML يتضمن التحقق من البيانات وتدريب النموذج والنشر."

سير العمل الكامل:

# .github/workflows/ml-pipeline.yml
name: ML Pipeline

on:
  push:
    branches: [main]
    paths:
      - 'src/**'
      - 'data/**'
      - 'models/**'
  pull_request:
    branches: [main]
  workflow_dispatch:
    inputs:
      force_retrain:
        description: 'فرض إعادة تدريب النموذج'
        type: boolean
        default: false

env:
  PYTHON_VERSION: '3.11'
  MLFLOW_TRACKING_URI: ${{ secrets.MLFLOW_TRACKING_URI }}

jobs:
  lint-and-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: إعداد Python
        uses: actions/setup-python@v5
        with:
          python-version: ${{ env.PYTHON_VERSION }}
          cache: 'pip'

      - name: تثبيت التبعيات
        run: |
          pip install -r requirements.txt
          pip install -r requirements-dev.txt

      - name: فحص الكود
        run: |
          ruff check src/
          mypy src/

      - name: تشغيل اختبارات الوحدة
        run: pytest tests/unit/ -v --cov=src/

  data-validation:
    runs-on: ubuntu-latest
    needs: lint-and-test
    steps:
      - uses: actions/checkout@v4

      - name: إعداد Python
        uses: actions/setup-python@v5
        with:
          python-version: ${{ env.PYTHON_VERSION }}
          cache: 'pip'

      - name: تثبيت التبعيات
        run: pip install -r requirements.txt

      - name: التحقق من بيانات التدريب
        run: python src/validate_data.py --config configs/data_expectations.yaml

      - name: التحقق من انحراف البيانات
        run: python src/check_drift.py --baseline data/baseline_stats.json

  train-model:
    runs-on: ubuntu-latest
    needs: data-validation
    if: |
      github.event_name == 'workflow_dispatch' && github.event.inputs.force_retrain == 'true' ||
      github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4

      - name: إعداد Python
        uses: actions/setup-python@v5
        with:
          python-version: ${{ env.PYTHON_VERSION }}

      - name: تكوين بيانات اعتماد AWS
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1

      - name: تدريب النموذج
        run: |
          python src/train.py \
            --config configs/training_config.yaml \
            --experiment-name "fraud-detection-${{ github.sha }}"

      - name: تشغيل اختبارات النموذج
        run: pytest tests/model/ -v

      - name: تسجيل النموذج في MLflow
        if: success()
        run: |
          python src/register_model.py \
            --run-id ${{ env.MLFLOW_RUN_ID }} \
            --model-name fraud-detector

  deploy-staging:
    runs-on: ubuntu-latest
    needs: train-model
    environment: staging
    steps:
      - uses: actions/checkout@v4

      - name: النشر إلى staging
        run: |
          kubectl apply -f k8s/staging/ --context staging-cluster
          kubectl rollout status deployment/model-serving -n ml-staging

      - name: تشغيل اختبارات التكامل
        run: pytest tests/integration/ --env staging

      - name: تشغيل اختبارات الدخان
        run: python tests/smoke_test.py --endpoint ${{ vars.STAGING_ENDPOINT }}

  deploy-production:
    runs-on: ubuntu-latest
    needs: deploy-staging
    environment: production
    steps:
      - uses: actions/checkout@v4

      - name: نشر كناري (10%)
        run: |
          kubectl apply -f k8s/production/canary.yaml
          sleep 300  # انتظار 5 دقائق لمقاييس الكناري

      - name: فحص مقاييس الكناري
        run: python src/check_canary_metrics.py --threshold 0.01

      - name: الطرح الكامل
        if: success()
        run: |
          kubectl apply -f k8s/production/
          kubectl rollout status deployment/model-serving -n ml-production

أنماط سير العمل الرئيسية

النمط 1: التدريب الشرطي

# التدريب فقط عندما يتغير كود التدريب أو البيانات
on:
  push:
    paths:
      - 'src/train.py'
      - 'src/model/**'
      - 'data/training/**'
      - 'configs/training_config.yaml'

النمط 2: تدريب GPU مع runners مستضافة ذاتياً

train-gpu:
  runs-on: [self-hosted, gpu, linux]
  steps:
    - name: التدريب مع GPU
      run: |
        nvidia-smi  # التحقق من توفر GPU
        python src/train.py --device cuda

النمط 3: تخزين تبعيات ML مؤقتاً

- name: تخزين حزم pip مؤقتاً
  uses: actions/cache@v4
  with:
    path: ~/.cache/pip
    key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}

- name: تخزين أصول النموذج مؤقتاً
  uses: actions/cache@v4
  with:
    path: models/
    key: model-${{ hashFiles('data/training/**') }}

نقاط مناقشة المقابلة

الموضوع ماذا تقول
GPU runners "نستخدم runners مستضافة ذاتياً مع GPUs للتدريب، مستضافة GitHub للاختبارات"
الأسرار "بيانات اعتماد سجل النماذج في GitHub Secrets، يتم تدويرها كل ربع"
الأصول "النماذج مخزنة في S3، المؤشرات فقط في artifacts"
البيئات "GitHub Environments لـ staging/prod مع مراجعين مطلوبين"
التخزين المؤقت "تخزين حزم pip ونقاط التحقق للنموذج مؤقتاً لتسريع سير العمل"

نصيحة احترافية: اذكر أنك تفصل التدريب عن النشر - "التدريب مكلف ولا يجب أن يحجب كل PR، لذلك نجعله شرطياً أو مجدولاً."

في الدرس التالي، سنغطي استراتيجيات النشر لنماذج ML. :::

اختبار

الوحدة 5: CI/CD لأنظمة ML

خذ الاختبار