Feature store — Feast
এই পাঠে যা শিখবেন
- Feature store-এর core concepts — entity, feature view, online/offline
- Point-in-time correctness কী ও কেন critical
- Feast-এ feature definition + materialize
- কখন feature store ROI positive, কখন overkill
১ · কোন সমস্যা solve করে
Bangladesh-এর একটি e-commerce team দু'টো model বানায় — recommendation, fraud। দু'টোতেই একই feature: "user-এর গত ৩০ দিনের avg order value"।
- Recommendation team pandas-এ compute করেছে।
- Fraud team Spark-এ compute করেছে।
- ৩ মাস পরে — recommendation training accuracy fine, production accuracy poor। Reason — production-এ feature subtly different।
- Fraud team-এর code review-এ ভুল implementation পাওয়া গেল — যা months-এর data drift মাস্ক করেছিল।
Feature storeFeature Storecentralized service — feature definition + computation + serving। Training ও serving উভয়ের জন্য single source of truth। এই সমস্যা solve করে — feature definition একবার, ব্যবহার সবখানে।
২ · Architecture
Offline store = historical features for training (BigQuery, Snowflake, S3 Parquet)। Throughput optimized।
Online store = latest features for serving (Redis, DynamoDB, Cassandra)। Latency optimized (< 10ms)।
Feature definition = single source — both stores generate from same logic।
৩ · Core concepts (Feast)
- Entity: "user_id", "merchant_id" — what feature describes।
- Data source: raw table — BigQuery, Parquet, Kafka।
- Feature view: entity + features + source + freshness window।
- Feature service: a bundle of feature views — application-specific।
- Materialize: offline → online sync।
৪ · Feast feature definition
from feast import Entity, FeatureView, Field, FileSource
from feast.types import Float32, Int64
from datetime import timedelta
# ১. Entity define
user = Entity(name="user_id", join_keys=["user_id"])
# ২. Source — historical data
order_history_source = FileSource(
path="s3://my-bucket/features/order_history.parquet",
timestamp_field="event_timestamp",
)
# ৩. Feature view — definition
user_order_features = FeatureView(
name="user_order_features",
entities=[user],
ttl=timedelta(days=30),
schema=[
Field(name="orders_30d", dtype=Int64),
Field(name="avg_order_value_30d", dtype=Float32),
Field(name="cart_abandon_rate_30d", dtype=Float32),
Field(name="days_since_last_order", dtype=Int64),
],
source=order_history_source,
online=True,
)
৫ · Training: get historical features
from feast import FeatureStore
import pandas as pd
store = FeatureStore(repo_path=".")
# Entity rows — labels with timestamps
entity_df = pd.DataFrame({
"user_id": [101, 102, 103, ...],
"event_timestamp": [
"2025-01-01 10:30:00",
"2025-01-02 14:00:00",
...,
],
"label": [1, 0, 1, ...], # purchased or not
})
# ⭐ Point-in-time join — "as of" feature value
training_df = store.get_historical_features(
entity_df=entity_df,
features=[
"user_order_features:orders_30d",
"user_order_features:avg_order_value_30d",
"user_order_features:cart_abandon_rate_30d",
],
).to_df()
# Now training_df-এ each row-এর label-এর সময়ের feature value
X = training_df[feature_cols]
y = training_df["label"]
# train model...
৬ · Serving: get online features
# Daily materialize — offline → online sync
# (এই command Airflow-এ scheduled)
$ feast materialize-incremental 2025-01-15T00:00:00
# In FastAPI serving:
from feast import FeatureStore
store = FeatureStore(repo_path=".")
@app.post("/predict")
def predict(req: Request):
# Online lookup — milliseconds
features = store.get_online_features(
features=[
"user_order_features:orders_30d",
"user_order_features:avg_order_value_30d",
"user_order_features:cart_abandon_rate_30d",
],
entity_rows=[{"user_id": req.user_id}],
).to_dict()
# model predict (same features as training)
score = model.predict_proba([list(features.values())])[0, 1]
return {"score": score}
৭ · Point-in-time correctness
Concept: training-এ row-এর label time "as of"-এর feature value চাই; future feature data leak করতে দেবেন না।
Example: "User_101 কি 2025-01-15 10:00-এ purchase করল?" — এই decision-এ label time-এর আগে user-এর order history use। 11:00-এর data leak (যেমন purchase event itself) ভুল।
Manual SQL-এ এটি কঠিন; Feast এই join automatically করে।
৮ · কখন feature store ROI positive
- ৩+ ML team common features share করছে।
- Same feature multiple model-এ — duplication problematic।
- Online serving low-latency (<50ms) requirement।
- Training-serving skew bug কয়েকবার ঘটেছে।
- Feature engineering team আছে।
৯ · কখন overkill
- একটি model, একটি team, simple features।
- Batch-only inference।
- Stack-এ already ETL exists, no skew problem yet।
ভাবনার প্রশ্ন
প্র ০১ "Feature store ROI calculation" — Bangladesh team-এর জন্য concrete number।
Feature store substantial investment। Concrete ROI-এর জন্য numbers দেখি।
Cost (annualized for 5-engineer team):
- Feast OSS — free; infrastructure (Redis, DB) — $২০০-৫০০/month = ~৩-৬ লাখ BDT/year।
- Setup time — 2-3 engineer-month = ~৬-৯ লাখ BDT one-time।
- Ongoing maintenance — 0.2 FTE = ~৫ লাখ BDT/year।
- Year 1 total: ~১৫-২০ লাখ BDT।
Benefit (annualized):
- Skew bug prevention: 2-3 incidents/year × ~৫ লাখ each (debugging + lost revenue) = ১০-১৫ লাখ saved।
- Faster feature reuse: 5 features × 3 models × 1 week each = 15 engineer-week saved = ~৭.৫ লাখ।
- Latency improvement: Redis 5ms vs custom 80ms — UX gain in conversion (hard to quantify but real)।
- Year 1 benefit: ~১৭-২৫ লাখ BDT।
Break-even: Year 1 marginal positive। Year 2+ benefits dominate as setup amortized।
Threshold rule of thumb:
- ৩+ models sharing features → likely positive ROI।
- 1 model only → don't invest।
- Skew incidents already happening → strong signal to invest।
BD cost-saving alternatives:
- Inhouse "lightweight feature store" — single Postgres + Python helper library।
- Shared Spark transform module — at least same code।
- SaaS (Tecton) — 5-10x more expensive but turn-key।
"Feature store regret" stories:
- Premature investment — small team, complex setup, slow to use।
- Better — reach pain point first, then invest।
মূল উপলব্ধি: Feature store — pain-driven, not platform-driven invest। Real skew bugs, real feature duplication — then go। Otherwise simpler patterns sufficient।
প্র ০২ "Online store latency budget — Redis vs DynamoDB vs Cassandra।"
Online store choice — latency, cost, availability trade-off।
Redis:
- In-memory, sub-millisecond reads।
- Self-hosted easy, managed (Elasticache, MemoryStore) easier।
- Memory-bound — large feature sets expensive।
- Cluster mode complex but scalable।
DynamoDB:
- AWS managed, ~10ms reads (typical)।
- Auto-scaling, pay-per-request।
- Wide adoption, integrated with Feast।
- Cost based on RCU/WCU।
Cassandra:
- Distributed, eventual-consistent, ~5-15ms।
- Self-hosted heavy ops; managed (Astra) available।
- Best for very large-scale, multi-region।
Latency budget allocation example:
- Total p99 budget: 100ms।
- Network from caller: 10ms।
- Feature lookup: 5-15ms (target)।
- Model inference: 30-50ms।
- Response back: 5ms।
- Buffer: 20ms।
BD-context choice:
- Small/medium ML team — Redis (managed via DigitalOcean, AWS Elasticache Mumbai)। Simple, fast।
- AWS-native team — DynamoDB seamless।
- On-prem mandate — self-hosted Redis cluster + Sentinel for HA।
Cost comparison (rough, monthly for moderate workload):
- Redis Elasticache (cache.r6g.large × 2): ~$৩০০।
- DynamoDB (10K RCU + storage): ~$২০০-৫০০ depending traffic।
- Self-hosted Redis (3-node K8s cluster on existing VM): ~$৫০ + ops।
Common mistake:
- Wrong eviction policy — features evicted before next prediction needs।
- TTL too aggressive — frequent miss → fallback to offline → SLA breach।
- Hot keys (popular user features) — cluster shard hotspot।
মূল উপলব্ধি: Latency target match → backend choose। 99% production use case Redis fits। DynamoDB AWS-only convenience। Cassandra rare-need (multi-region, very high scale)। Start Redis, migrate if needed।
প্র ০৩ "Feature freshness vs cost trade-off" — daily refresh vs streaming।
Feature freshness — model accuracy ও infrastructure cost-এর tension।
Daily batch materialize:
- Offline → online sync once/day (e.g., 2 AM)।
- Pros: simple, cheap, predictable।
- Cons: features up to 24 hours stale।
- Use case: features that change slowly (user profile, preferences)।
Hourly batch:
- 24x more compute cost than daily।
- Use case: medium-velocity features (session aggregates)।
Streaming materialize:
- Kafka → Spark Streaming/Flink → online store।
- Pros: seconds-fresh।
- Cons: complex, expensive, debugging painful।
- Use case: real-time fraud, ad bidding।
Bangladesh use case examples:
- Pathao ride pricing: demand changes minute-by-minute → streaming।
- Daraz user profile: daily preferences sufficient → batch।
- bKash fraud: session-level streaming + user-level batch hybrid।
Hybrid pattern (most common):
- User-level features: daily batch।
- Session-level features: streaming (last N events)।
- Real-time signal: in-request compute (cheap, last X minutes)।
Cost saving — selective freshness:
- Not all features need same freshness।
- Feature view-এ
ttlset differently per feature group। - "Feature value" 알려진 — invest accordingly।
Ablation study suggestion:
- Remove fresh features (use stale only) → measure accuracy drop।
- If 0.1% drop only — daily batch sufficient।
- If 5%+ drop — streaming worth।
মূল উপলব্ধি: Freshness — investment-worth carefully measured। Default daily batch; promote to streaming only with measurable benefit। Bangladesh fintech-এ session-level streaming common for fraud; e-commerce mostly batch sufficient।
প্র ০৪ "Feast vs Tecton vs Hopsworks vs build-it-yourself।"
Feature store landscape ২০২৫-এ — broader but stratified।
Feast (open-source):
- Free, self-hostable, Pythonic।
- Active community, Linux Foundation governed।
- Integrations: BigQuery, Snowflake, Redis, etc.।
- "DIY" infrastructure — you operate।
- Best: cost-sensitive, control-wanting team।
Tecton (SaaS):
- Founded by ex-Uber Michelangelo team।
- Managed, polished UI, batch + streaming।
- Very expensive (enterprise-priced)।
- Best: well-funded mid/large team।
Hopsworks:
- Open-source feature store + ML platform।
- Includes feature engineering, model registry, serving।
- Self-host or managed।
- Best: comprehensive ML platform need।
Cloud provider native:
- SageMaker Feature Store (AWS)।
- Vertex AI Feature Store (GCP)।
- Azure ML Managed Feature Store।
- Tied to cloud, integrated with their ML services।
Build-it-yourself:
- Simple Postgres + helper Python lib।
- Pros: minimal, totally controlled।
- Cons: maintenance, missing point-in-time logic।
- Best: very small team, simple use case।
BD-context decision:
- Most BD ML teams — Feast।
- SageMaker shop — SageMaker FS।
- Build-yourself only with single model, single team, simple features।
- Tecton/Hopsworks rare in BD due to cost।
Decision criteria:
- Budget — Feast for free, others paid।
- Team expertise — Feast needs Python+infra, SaaS needs none।
- Scale — Feast handles billion-feature; SaaS may be cheaper at huge scale।
- Compliance — on-prem Feast for sensitive data।
Future trend:
- "DAG-based feature engineering" (Hamilton, etc.) — orthogonal to FS।
- "Online ML platforms" — feature store + model + serving bundled (Feature Store 2.0)।
- LLM-era — embedding feature store new sub-category।
মূল উপলব্ধি: Feast = sweet spot for most BD teams। Open-source, flexible, well-supported। Cloud-native if AWS/GCP-locked-in। Tecton enterprise rare-justified। DIY sometimes okay but rarely optimal।
অনুশীলন
-
Setup: Local Feast project create করুন। একটি simple feature view define করুন।
feast init my_project→cd my_project→feast apply। UI not built-in but CLI দিয়ে exploration। -
Materialize: Sample data দিয়ে materialize করুন; online lookup test করুন।
feast materialize-incremental $(date -u +"%Y-%m-%dT%H:%M:%S")→ Python from FeatureStore.get_online_features()। Sub-ms response। -
চিন্তা: Pathao-র driver matching model। ৫টি feature design করুন। কোনগুলো batch, কোনগুলো streaming?
- driver_acceptance_rate_30d — batch।
- driver_completion_rate_30d — batch।
- driver_current_lat_lng — streaming।
- driver_active_minutes_today — hourly batch।
- recent_5_min_demand_in_area — streaming।