إنتقل إلى المحتوى الرئيسي

الفصل 2: التحكم في إصدارات البيانات (DVC)

المقدمة​

يمدد DVC (التحكم في إصدارات البيانات) قدرات Git للتعامل مع الملفات الكبيرة ومجموعات البيانات ونماذج التعلم الآلي. يتيح إمكانية التكرار من خلال تتبع البيانات والنماذج بجانب الكود.

لماذا DVC؟​

المشكلة مع الملفات الكبيرة في Git​

فوائد DVC​

الميزةالفائدة
أوامر مشابهة لـ Gitسير عمل مألوف للمطورين
التخزين الخارجيتبقى البيانات خارج Git
إزالة التكراريتم تخزين نفس البيانات مرة واحدة
الأنابيبسير عمل ML قابل للتكرار
التخزين البعيددعم S3، GCS، Azure، SSH

إعداد DVC​

التثبيت​

# باستخدام pip
pip install dvc

# مع دعم التخزين البعيد
pip install "dvc[s3]" # Amazon S3
pip install "dvc[gs]" # Google Cloud Storage
pip install "dvc[azure]" # Azure Blob Storage
pip install "dvc[ssh]" # SSH remote
pip install "dvc[all]" # جميع التخزينات البعيدة

# تهيئة DVC في مشروعك
cd your-project
dvc init
git add .dvc .dvcignore
git commit -m "Initialize DVC"

هيكل دليل DVC​

بعد التهيئة:

your-project/
├── .dvc/
│ ├── config # تكوين DVC
│ ├── .gitignore # الملفات التي يتجاهلها DVC في مجلده الخاص
│ └── cache/ # ذاكرة التخزين المؤقت المحلية (متجاهلة من git)
├── .dvcignore # الملفات التي يجب على DVC تجاهلها
└── ...

تتبع البيانات باستخدام DVC​

تتبع البيانات الأساسية​

# إضافة ملف بيانات لتتبع DVC
dvc add data/training_data.csv

# هذا ينشئ:
# - data/training_data.csv.dvc (ملف بيانات وصفية)
# - data/.gitignore (يمنع git من تتبع الملف الفعلي)

# إضافة ملفات DVC إلى git
git add data/training_data.csv.dvc data/.gitignore
git commit -m "data: track training data with DVC"

فهم ملفات .dvc​

# data/training_data.csv.dvc
outs:
- md5: a3f2b1c4d5e6f7g8h9i0j1k2
size: 1073741824
path: training_data.csv

يحتوي ملف .dvc على:

  • md5: تجزئة محتوى الملف
  • size: حجم الملف بالبايت
  • path: المسار النسبي للملف

تتبع الأدلة​

# تتبع الأدلة بالكامل
dvc add data/images/

# ينشئ data/images.dvc
git add data/images.dvc data/.gitignore
git commit -m "data: add image dataset"

تكوين التخزين البعيد​

إعداد S3 Remote​

# إضافة S3 remote
dvc remote add -d myremote s3://mybucket/dvc-storage

# تكوين بيانات الاعتماد (أو استخدام أدوار IAM)
dvc remote modify myremote access_key_id 'YOUR_ACCESS_KEY'
dvc remote modify myremote secret_access_key 'YOUR_SECRET_KEY'

# أو استخدام ملف تعريف AWS
dvc remote modify myremote profile myprofile

# تمكين ذاكرة التخزين المؤقت لعمليات أسرع
dvc remote modify myremote cache true

إعداد GCS Remote​

# إضافة Google Cloud Storage remote
dvc remote add -d myremote gs://mybucket/dvc-storage

# المصادقة باستخدام حساب الخدمة
dvc remote modify myremote credentialpath /path/to/credentials.json

إعداد Azure Blob Remote​

# إضافة Azure Blob Storage remote
dvc remote add -d myremote azure://mycontainer/dvc-storage

# تكوين الحساب
dvc remote modify myremote account_name 'myaccount'
dvc remote modify myremote account_key 'mykey'

التخزين المحلي (للتطوير)​

# استخدام دليل محلي كـ remote (مفيد للتطوير)
dvc remote add -d local /shared/dvc-storage

# أو محرك شبكة
dvc remote add -d network //server/dvc-storage

دفع وسحب البيانات​

دفع البيانات إلى Remote​

# دفع جميع البيانات المتتبعة إلى remote الافتراضي
dvc push

# دفع ملف محدد
dvc push data/training_data.csv.dvc

# دفع إلى remote محدد
dvc push -r myremote

سحب البيانات من Remote​

# سحب جميع البيانات من remote الافتراضي
dvc pull

# سحب ملف محدد
dvc pull data/training_data.csv.dvc

# سحب من remote محدد
dvc pull -r myremote

التحقق من إصدار محدد​

# التبديل إلى commit/branch مختلف في git
git checkout v1.0.0

# التحقق من إصدار البيانات المقابل
dvc checkout

أنابيب DVC​

لماذا الأنابيب؟​

تحدد الأنابيب تسلسل خطوات معالجة البيانات، مما يجعل التجارب قابلة للتكرار.

تعريف الأنابيب​

# dvc.yaml
stages:
prepare:
cmd: python src/data/prepare.py
deps:
- src/data/prepare.py
- data/raw/
params:
- prepare.seed
- prepare.split_ratio
outs:
- data/processed/train.csv
- data/processed/test.csv

featurize:
cmd: python src/features/featurize.py
deps:
- src/features/featurize.py
- data/processed/train.csv
- data/processed/test.csv
params:
- featurize.max_features
outs:
- data/features/train_features.pkl
- data/features/test_features.pkl

train:
cmd: python src/models/train.py
deps:
- src/models/train.py
- data/features/train_features.pkl
params:
- train.n_estimators
- train.max_depth
- train.learning_rate
outs:
- models/model.pkl
metrics:
- metrics/train_metrics.json:
cache: false

evaluate:
cmd: python src/models/evaluate.py
deps:
- src/models/evaluate.py
- models/model.pkl
- data/features/test_features.pkl
metrics:
- metrics/eval_metrics.json:
cache: false
plots:
- metrics/plots/:
cache: false

ملف المعلمات​

# params.yaml
prepare:
seed: 42
split_ratio: 0.2

featurize:
max_features: 1000

train:
n_estimators: 100
max_depth: 10
learning_rate: 0.1

تشغيل الأنابيب​

# تشغيل الأنابيب بالكامل
dvc repro

# تشغيل مرحلة محددة
dvc repro train

# تشغيل إجباري (تجاهل ذاكرة التخزين المؤقت)
dvc repro -f

# تصور الأنابيب
dvc dag

تصور الأنابيب​

$ dvc dag
+----------+
| prepare |
+----------+
*
*
*
+-----------+
| featurize |
+-----------+
*
*
*
+---------+
| train |
+---------+
*
*
*
+----------+
| evaluate |
+----------+

التجارب مع DVC​

تشغيل التجارب​

# تشغيل تجربة مع معلمات معدلة
dvc exp run --set-param train.n_estimators=200

# تشغيل تجارب متعددة في قائمة الانتظار
dvc exp run --queue --set-param train.n_estimators=100
dvc exp run --queue --set-param train.n_estimators=200
dvc exp run --queue --set-param train.n_estimators=300

# تشغيل التجارب في قائمة الانتظار
dvc exp run --run-all

# عرض التجارب
dvc exp show

مقارنة التجارب​

# عرض التجارب مع المقاييس
dvc exp show --md

# مقارنة تجارب محددة
dvc exp diff exp-abc123 exp-def456

إدارة التجارب​

# تطبيق تجربة على مساحة العمل
dvc exp apply exp-abc123

# إنشاء فرع من تجربة
dvc exp branch exp-abc123 feature/best-model

# إزالة التجارب
dvc exp remove exp-abc123

مقاييس ورسوم DVC​

تعريف المقاييس​

# src/models/train.py
import json

metrics = {
"accuracy": 0.92,
"f1_score": 0.89,
"auc_roc": 0.95
}

with open("metrics/train_metrics.json", "w") as f:
json.dump(metrics, f)

عرض المقاييس​

# عرض المقاييس
dvc metrics show

# مقارنة المقاييس عبر الالتزامات
dvc metrics diff HEAD~1

إنشاء الرسوم​

# src/models/evaluate.py
import json

# بيانات منحنى ROC
roc_data = [
{"fpr": 0.0, "tpr": 0.0},
{"fpr": 0.1, "tpr": 0.6},
{"fpr": 0.2, "tpr": 0.8},
{"fpr": 1.0, "tpr": 1.0}
]

with open("metrics/plots/roc.json", "w") as f:
json.dump(roc_data, f)
# إنشاء الرسوم
dvc plots show

# مقارنة الرسوم عبر التجارب
dvc plots diff exp-abc123 exp-def456

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

1. تنظيم أدلة البيانات​

data/
├── raw/ # البيانات الأصلية، غير القابلة للتغيير
├── interim/ # التحويلات الوسيطة
├── processed/ # البيانات النهائية، النظيفة للنمذجة
└── external/ # البيانات من مصادر خارجية

2. استخدام أسماء ملفات .dvc ذات معنى​

# جيد: أسماء وصفية
dvc add data/customer_transactions_2024.parquet

# تجنب: أسماء عامة
dvc add data/data.csv

3. إصدار البيانات مع البيانات الوصفية​

# وضع علامات على إصدارات البيانات مع git
git tag -a "data-v1.0.0" -m "Initial training dataset"
git push origin data-v1.0.0

4. توثيق مصادر البيانات​

# data/README.md أو data/sources.yaml
sources:
customer_transactions:
description: "تاريخ معاملات العملاء"
source: "قاعدة بيانات PostgreSQL الإنتاجية"
refresh_frequency: "يوميًا"
columns:
- name: transaction_id
type: string
description: "معرف فريد للمعاملة"
- name: amount
type: float
description: "مبلغ المعاملة بالدولار الأمريكي"

5. أتمتة عمليات DVC​

# .github/workflows/dvc.yml
name: DVC Pipeline
on:
push:
branches: [main]

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

- uses: iterative/setup-dvc@v1

- name: Configure DVC remote
run: |
dvc remote modify --local myremote access_key_id ${{ secrets.AWS_ACCESS_KEY }}
dvc remote modify --local myremote secret_access_key ${{ secrets.AWS_SECRET_KEY }}

- name: Pull data
run: dvc pull

- name: Run pipeline
run: dvc repro

- name: Push results
run: dvc push

استكشاف الأخطاء وإصلاحها​

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

# خطأ: "Unable to acquire lock"
rm .dvc/lock

# خطأ: "Checkout failed"
dvc checkout -f

# خطأ: "Push failed" (ملفات كبيرة)
dvc push --jobs 4 # تحميلات متوازية

# التحقق من حالة ذاكرة التخزين المؤقت
dvc cache dir

# تنظيف ذاكرة التخزين المؤقت غير المستخدمة
dvc gc -w

النقاط الرئيسية​

الملخص
  1. يمدد DVC Git للملفات الكبيرة دون تضخيم المستودع
  2. استخدام التخزين البعيد للتعاون بين الفرق (S3، GCS، Azure)
  3. تعريف الأنابيب لسير عمل ML قابل للتكرار
  4. تتبع التجارب باستخدام أوامر DVC exp
  5. إصدار البيانات بجانب الكود لتحقيق التكرار الكامل
  6. أتمتة عمليات DVC في أنابيب CI/CD

تمرين عملي​

  1. تهيئة DVC في مشروع جديد
  2. تكوين S3 أو التخزين المحلي البعيد
  3. تتبع مجموعة بيانات باستخدام DVC
  4. إنشاء أنبوب بسيط من 3 مراحل
  5. تشغيل تجارب بمعلمات مختلفة

التالي: الفصل 3: إصدار النماذج