GitHub Actions لسير عمل التعلم الآلي

سير العمل القابل لإعادة الاستخدام وأفضل الممارسات

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

مع نمو ML CI/CD الخاص بك، ستريد تجنب تكرار كود سير العمل. دعنا نستكشف سير العمل القابل لإعادة الاستخدام وأفضل ممارسات الإنتاج.

سير العمل القابل لإعادة الاستخدام

أنشئ سير عمل يمكن استدعاؤه من سير عمل أخرى:

تعريف سير عمل قابل لإعادة الاستخدام

# .github/workflows/reusable-train.yml
name: Reusable Training Workflow

on:
  workflow_call:
    inputs:
      model_name:
        required: true
        type: string
      python_version:
        required: false
        type: string
        default: '3.11'
      run_tests:
        required: false
        type: boolean
        default: true
    secrets:
      MLFLOW_URI:
        required: true
    outputs:
      model_path:
        description: "Path to trained model"
        value: ${{ jobs.train.outputs.model_path }}
      accuracy:
        description: "Model accuracy"
        value: ${{ jobs.train.outputs.accuracy }}

jobs:
  train:
    runs-on: ubuntu-latest
    outputs:
      model_path: ${{ steps.train.outputs.path }}
      accuracy: ${{ steps.train.outputs.accuracy }}

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: ${{ inputs.python_version }}
          cache: 'pip'

      - run: pip install -r requirements.txt

      - name: Run tests
        if: ${{ inputs.run_tests }}
        run: pytest tests/

      - name: Train model
        id: train
        run: |
          python train.py --model ${{ inputs.model_name }}
          echo "path=models/${{ inputs.model_name }}.pkl" >> $GITHUB_OUTPUT
          echo "accuracy=$(cat metrics.json | jq .accuracy)" >> $GITHUB_OUTPUT
        env:
          MLFLOW_TRACKING_URI: ${{ secrets.MLFLOW_URI }}

      - uses: actions/upload-artifact@v4
        with:
          name: model-${{ inputs.model_name }}
          path: models/

استدعاء سير العمل القابل لإعادة الاستخدام

# .github/workflows/main.yml
name: Main Pipeline

on:
  push:
    branches: [main]

jobs:
  train-baseline:
    uses: ./.github/workflows/reusable-train.yml
    with:
      model_name: baseline
      python_version: '3.11'
    secrets:
      MLFLOW_URI: ${{ secrets.MLFLOW_URI }}

  train-improved:
    uses: ./.github/workflows/reusable-train.yml
    with:
      model_name: improved
      run_tests: false
    secrets:
      MLFLOW_URI: ${{ secrets.MLFLOW_URI }}

  compare:
    needs: [train-baseline, train-improved]
    runs-on: ubuntu-latest
    steps:
      - run: |
          echo "Baseline: ${{ needs.train-baseline.outputs.accuracy }}"
          echo "Improved: ${{ needs.train-improved.outputs.accuracy }}"

الإجراءات المركبة

تجميع خطوات متعددة في إجراء واحد قابل لإعادة الاستخدام:

# .github/actions/setup-ml-env/action.yml
name: 'Setup ML Environment'
description: 'Sets up Python and installs ML dependencies'

inputs:
  python-version:
    description: 'Python version'
    required: false
    default: '3.11'
  install-gpu:
    description: 'Install GPU dependencies'
    required: false
    default: 'false'

runs:
  using: "composite"
  steps:
    - uses: actions/setup-python@v5
      with:
        python-version: ${{ inputs.python-version }}
        cache: 'pip'

    - name: Install base dependencies
      shell: bash
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt

    - name: Install GPU dependencies
      if: ${{ inputs.install-gpu == 'true' }}
      shell: bash
      run: pip install -r requirements-gpu.txt

استخدام الإجراء المركب

jobs:
  train:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: ./.github/actions/setup-ml-env
        with:
          python-version: '3.11'
          install-gpu: 'true'

      - run: python train.py

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

1. فصل البيئات

jobs:
  train:
    runs-on: ubuntu-latest
    environment: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
    steps:
      - run: echo "Deploying to ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}"

2. إدارة الأسرار

# استخدم أسرار خاصة بالبيئة
jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - name: Deploy
        run: ./deploy.sh
        env:
          # هذه الأسرار متاحة فقط في بيئة 'production'
          API_KEY: ${{ secrets.PROD_API_KEY }}
          DB_URL: ${{ secrets.PROD_DB_URL }}

3. التحكم في التزامن

# منع تشغيل تدريب متعدد
concurrency:
  group: training-${{ github.ref }}
  cancel-in-progress: true

jobs:
  train:
    runs-on: ubuntu-latest
    steps:
      - run: python train.py

4. معالجة الأخطاء

jobs:
  train:
    runs-on: ubuntu-latest
    steps:
      - name: Train with retry
        uses: nick-fields/retry@v2
        with:
          timeout_minutes: 60
          max_attempts: 3
          command: python train.py

      - name: Cleanup on failure
        if: failure()
        run: |
          # تنظيف الموارد
          python scripts/cleanup.py

      - name: Notify on completion
        if: always()
        run: |
          curl -X POST $SLACK_WEBHOOK \
            -d '{"text": "Training ${{ job.status }}"}'

5. تحسين التكلفة

jobs:
  # تشغيل مهام GPU المكلفة فقط عند الحاجة
  quick-check:
    runs-on: ubuntu-latest
    outputs:
      needs_training: ${{ steps.check.outputs.result }}
    steps:
      - id: check
        run: |
          # فحص إذا تغيرت البيانات
          if [ "$(git diff --name-only HEAD~1 | grep data/)" ]; then
            echo "result=true" >> $GITHUB_OUTPUT
          else
            echo "result=false" >> $GITHUB_OUTPUT
          fi

  train:
    needs: quick-check
    if: needs.quick-check.outputs.needs_training == 'true'
    runs-on: [self-hosted, gpu]
    steps:
      - run: python train.py

6. توثيق سير العمل

name: ML Training Pipeline

# سير العمل هذا:
# 1. يشغل الاختبارات على كل push
# 2. يدرب النموذج على الفرع main فقط
# 3. يتحقق وينشر إذا نجحت جميع البوابات
#
# الأسرار المطلوبة:
#   - MLFLOW_URI: عنوان خادم تتبع MLflow
#   - AWS_KEY: مفتاح وصول AWS لـ S3
#
# المحفزات:
#   - Push لأي فرع (اختبارات فقط)
#   - Push لـ main (خط الأنابيب الكامل)
#   - جدول أسبوعي (إعادة التدريب)

on:
  push:
    branches: ['*']
  schedule:
    - cron: '0 2 * * 0'

تنظيم سير العمل

.github/
├── workflows/
│   ├── main.yml              # نقطة الدخول الرئيسية
│   ├── reusable-train.yml    # تدريب قابل لإعادة الاستخدام
│   ├── reusable-validate.yml # تحقق قابل لإعادة الاستخدام
│   └── scheduled-retrain.yml # إعادة تدريب مجدولة
├── actions/
│   ├── setup-ml-env/         # إجراء مركب
│   │   └── action.yml
│   └── report-metrics/       # إجراء مركب آخر
│       └── action.yml
└── CODEOWNERS                # مالكو سير العمل

قائمة ملخص

الممارسة التنفيذ
إعادة استخدام سير العمل workflow_call للمنطق المشترك
تجميع الخطوات إجراءات مركبة للإعداد
التحكم في التزامن concurrency لمنع التعارض
معالجة الأخطاء if: failure() وإعادة المحاولة
تحسين التكلفة استخدام GPU شرطي
التوثيق تعليقات في ملفات سير العمل
التنظيم بنية مجلدات متسقة

الرؤية الرئيسية: قاعدة كود CI/CD منظمة جيداً بنفس أهمية قاعدة كود ML الخاصة بك. تعامل مع سير عملك ككود إنتاج.

في الوحدة التالية، سنستكشف GitLab CI/CD ونقارنه مع GitHub Actions. :::

اختبار

الوحدة 2: GitHub Actions لسير عمل التعلم الآلي

خذ الاختبار