Problem
A FeatureService exists to freeze the exact feature definitions a model was
trained and served on. Today it cannot pin a specific feature view version —
it always resolves to the active (promoted) version. Feast's own docs name this
limitation verbatim on the alpha feature-view-versioning page:
Feature services — Feature services always resolve to the active (promoted)
version. --no-promote versions are not served until promoted.
Building a service from a version-pinned FeatureView silently falls back to the
promoted version:
fv = FeatureView(name="driver_stats", version="v2", ...)
svc = FeatureService(name="model_v1", features=[fv[["conv_rate"]]])
svc.feature_view_projections[0].version_tag # -> None (should be 2)
svc.feature_view_projections[0].name_to_use() # -> "driver_stats" (should be "driver_stats@v2")
Root cause
FeatureService.__init__ appends the source view's projection without
translating its version string into projection.version_tag (the field
name_to_use() checks to render fv@v2).
utils._get_feature_views_to_use hard-codes the version as None for the
FeatureService branch, so retrieval always falls through to the promoted
snapshot via get_any_feature_view.
While fixing this, a second pre-existing bug surfaced: offline retrieval of a
version-pinned OnDemandFeatureView fails. Offline stores re-fetch ODFVs from the
registry via an unversioned registry.list_on_demand_feature_views, so a pinned
ODFV ref (odfv@v1:feat) raises ValueError: Could not find feature view from reference ... or silently drops the ODFV's features. Every offline backend is
affected (they funnel through OnDemandFeatureView.get_requested_odfvs or
offline_utils.get_feature_view_query_context, plus dask's inline duplicate).
Proposal
- Capture the pinned version into the service's projection, and read it back at
retrieval time (fixes both online and offline for plain FeatureViews, which
share _get_feature_views_to_use).
- Add a clean pinning API: allow plain string refs as
FeatureService.features
entries ("driver_stats@v2:trips_today"), resolved against the registry at
feast apply time — no importing/reconstructing historical view objects.
- Fix offline ODFV resolution with a shared version-aware helper.
Gated by the existing registry.enable_online_feature_view_versioning flag,
which (despite its name) gates both online and offline versioned resolution.
Problem
A
FeatureServiceexists to freeze the exact feature definitions a model wastrained and served on. Today it cannot pin a specific feature view version —
it always resolves to the active (promoted) version. Feast's own docs name this
limitation verbatim on the alpha feature-view-versioning page:
Building a service from a version-pinned
FeatureViewsilently falls back to thepromoted version:
Root cause
FeatureService.__init__appends the source view's projection withouttranslating its
versionstring intoprojection.version_tag(the fieldname_to_use()checks to renderfv@v2).utils._get_feature_views_to_usehard-codes the version asNonefor theFeatureServicebranch, so retrieval always falls through to the promotedsnapshot via
get_any_feature_view.While fixing this, a second pre-existing bug surfaced: offline retrieval of a
version-pinned
OnDemandFeatureViewfails. Offline stores re-fetch ODFVs from theregistry via an unversioned
registry.list_on_demand_feature_views, so a pinnedODFV ref (
odfv@v1:feat) raisesValueError: Could not find feature view from reference ...or silently drops the ODFV's features. Every offline backend isaffected (they funnel through
OnDemandFeatureView.get_requested_odfvsoroffline_utils.get_feature_view_query_context, plus dask's inline duplicate).Proposal
retrieval time (fixes both online and offline for plain FeatureViews, which
share
_get_feature_views_to_use).FeatureService.featuresentries (
"driver_stats@v2:trips_today"), resolved against the registry atfeast applytime — no importing/reconstructing historical view objects.Gated by the existing
registry.enable_online_feature_view_versioningflag,which (despite its name) gates both online and offline versioned resolution.