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. :::