خطوط أنابيب 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 | بسيط، زمن استجابة منخفض | لا إدارة ميزات |
رؤية خبير: في المقابلات، ناقش الصحة في نقطة زمنية. "لا يمكننا استخدام ميزات محسوبة بعد طابع وقت التوقع - هذا تسرب بيانات."
في الدرس التالي، سنغطي أنماط تصميم خطوط الأنابيب للمقابلات. :::