خطوط أنابيب ML والتنسيق

مخازن الميزات وإصدار البيانات

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

مخازن الميزات هي بنية تحتية حيوية لأنظمة ML. يختبر المحاورون كلاً من الفهم المفاهيمي والتنفيذ العملي.

لماذا تهم مخازن الميزات

سؤال المقابلة: "لماذا لا تحسب الميزات فقط في وقت التوقع؟"

إطار الإجابة:

# المشاكل بدون مخزن ميزات
problems = {
    "training_serving_skew": "مسارات كود مختلفة = ميزات مختلفة",
    "computation_cost": "إعادة حساب التجميعات المعقدة لكل طلب",
    "consistency": "لا يوجد مصدر واحد للحقيقة لتعريفات الميزات",
    "latency": "الميزات المعقدة لا يمكنها تلبية متطلبات SLA",
    "reuse": "الفرق تكرر عمل هندسة الميزات"
}

# فوائد مخزن الميزات
benefits = {
    "single_source_of_truth": "نفس الميزات للتدريب والتقديم",
    "real_time_serving": "ميزات محسوبة مسبقاً بزمن استجابة منخفض",
    "feature_reuse": "كتالوج الميزات المعتمدة والموثقة",
    "point_in_time_correctness": "الميزات التاريخية بدون تسرب البيانات",
    "governance": "تتبع نسب الميزات واستخدامها"
}

هندسة مخزن الميزات

# المكونات الأساسية للمعرفة في المقابلات
feature_store_architecture:
  offline_store:
    purpose: "الميزات التاريخية للتدريب"
    storage: "مستودع البيانات (BigQuery، Snowflake، Parquet)"
    latency: "ثوانٍ إلى دقائق"

  online_store:
    purpose: "الميزات منخفضة زمن الاستجابة للاستدلال"
    storage: "مخزن قيمة-مفتاح (Redis، DynamoDB)"
    latency: "< 10ms p99"

  feature_registry:
    purpose: "البيانات الوصفية، المخططات، التوثيق"
    contents: "تعريفات الميزات، المالكين، SLAs"

  materialization:
    purpose: "مزامنة offline → online store"
    frequency: "دفعي أو متدفق"

مثال Feast للمقابلة

سؤال المقابلة: "اشرح لي تنفيذ مخزن ميزات لنظام اكتشاف الاحتيال."

from feast import Entity, Feature, FeatureView, FileSource, ValueType
from feast.types import Float32, Int64
from datetime import timedelta

# الكيان: لماذا نحسب الميزات؟
user = Entity(
    name="user_id",
    value_type=ValueType.INT64,
    description="معرف المستخدم الفريد"
)

# المصدر غير المتصل: أين توجد البيانات التاريخية
transactions_source = FileSource(
    path="s3://features/user_transactions.parquet",
    timestamp_field="event_timestamp"
)

# عرض الميزات: مجموعة منطقية من الميزات
user_transaction_features = FeatureView(
    name="user_transaction_features",
    entities=[user],
    ttl=timedelta(days=1),  # مدة صلاحية الميزات
    schema=[
        Feature(name="transaction_count_7d", dtype=Int64),
        Feature(name="avg_transaction_amount_7d", dtype=Float32),
        Feature(name="max_transaction_amount_7d", dtype=Float32),
        Feature(name="unique_merchants_7d", dtype=Int64),
    ],
    online=True,  # تمكين التقديم عبر الإنترنت
    source=transactions_source,
    tags={"team": "fraud", "pii": "false"}
)

جلب الميزات:

from feast import FeatureStore

store = FeatureStore(repo_path=".")

# التدريب: الحصول على الميزات التاريخية (offline)
training_data = store.get_historical_features(
    entity_df=transactions_df,  # DataFrame مع user_id، event_timestamp
    features=[
        "user_transaction_features:transaction_count_7d",
        "user_transaction_features:avg_transaction_amount_7d"
    ]
).to_df()

# الاستدلال: الحصول على الميزات عبر الإنترنت (الوقت الفعلي)
online_features = store.get_online_features(
    features=[
        "user_transaction_features:transaction_count_7d",
        "user_transaction_features:avg_transaction_amount_7d"
    ],
    entity_rows=[{"user_id": 12345}]
).to_dict()

إصدار البيانات مع DVC

سؤال المقابلة: "كيف تصدر مجموعات بيانات التدريب؟"

# تهيئة DVC في مستودع Git موجود
dvc init

# تتبع ملفات البيانات الكبيرة
dvc add data/training_v1.parquet

# هذا ينشئ data/training_v1.parquet.dvc (ملف مؤشر)
# Git يتتبع ملف .dvc، DVC يتتبع البيانات الفعلية

git add data/training_v1.parquet.dvc data/.gitignore
git commit -m "Add training data v1"

# رفع البيانات إلى التخزين البعيد
dvc push  # يرفع إلى S3/GCS المكون في .dvc/config

إعادة إنتاج التدريب:

# التبديل إلى إصدار بيانات سابق
git checkout v1.0.0
dvc checkout  # يسحب إصدار البيانات المطابق

# تشغيل التدريب
python train.py

# البيانات + الكود + النموذج الآن قابلة للتكرار

مناقشة مفاضلات المقابلة

النهج الإيجابيات السلبيات
Feast مفتوح المصدر، أصلي Kubernetes يتطلب بنية تحتية
Tecton مُدار، ميزات مؤسسية التكلفة، الارتباط بالمورد
Databricks Feature Store متكامل مع Databricks Databricks فقط
Custom Redis بسيط، زمن استجابة منخفض لا إدارة ميزات

رؤية خبير: في المقابلات، ناقش الصحة في نقطة زمنية. "لا يمكننا استخدام ميزات محسوبة بعد طابع وقت التوقع - هذا تسرب بيانات."

في الدرس التالي، سنغطي أنماط تصميم خطوط الأنابيب للمقابلات. :::

اختبار

الوحدة 3: خطوط أنابيب ML والتنسيق

خذ الاختبار