From b8931e022697558a205c3eb9ab22f527b4850b42 Mon Sep 17 00:00:00 2001 From: Alexandru Ormenisan Date: Mon, 30 Sep 2024 18:27:31 +0200 Subject: [PATCH 1/3] Model provenance - including init feature vector --- docs/user_guides/fs/provenance/provenance.md | 93 ++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/docs/user_guides/fs/provenance/provenance.md b/docs/user_guides/fs/provenance/provenance.md index 1f2354436..9c1ad814c 100644 --- a/docs/user_guides/fs/provenance/provenance.md +++ b/docs/user_guides/fs/provenance/provenance.md @@ -211,6 +211,47 @@ You can also traverse the provenance graph in the opposite direction. Starting f lineage.inaccessible ``` +You can also traverse the provenance graph downstream to retrieve the models which use training datasets of this feature view as its parents. +=== "Python" + + ```python + models = fraud_fv.get_models_provenance() + + # List all accessible models + lineage.accessible + + # List all the inaccessible models + lineage.inaccessible + ``` + +You can also retrieve only the models generated from specific training dataset versions: +=== "Python" + + ```python + models = fraud_fv.get_models_provenance(training_dataset_version: 1) + ``` + +You can also retrive directly the accessible model objects, without the need to extract them from the provenance links object: +=== "Python" + + ```python + #List all accessible models + models = fraud_fv.get_models() + + #List accessible models trained from a specific training dataset version + models = fraud_fv.get_models(training_dataset_version: 1) + ``` + +Also we added a utility method to retrieve from the user's accessible models, the last trained one. Last is determined based on timestamp when it was saved into the model registry. +=== "Python" + + ```python + #Retrieve newest model from all user's accessible models based on this feature view + model = fraud_fv.get_newest_model() + #Retrieve newest model from all user's accessible models based on this training dataset version + model = fraud_fv.get_newest_model(training_dataset_version: 1) + ``` + ### Using the UI In the feature view overview UI you can explore the provenance graph of the feature view: @@ -221,3 +262,55 @@ In the feature view overview UI you can explore the provenance graph of the feat
Feature view provenance graph

+ +## Step 3: Model lineage + +The relationship between feature views and models is captured automatically when you create a model. You can inspect the relationship between feature views and models using the APIs or the UI. +=== "Python" + + ```python + lineage = model.get_feature_view_provenance() + + # List all accessible parent feature views + lineage.accessible + + # List all deleted parent feature views + lineage.deleted + + # List all the inaccessible parent feature views + lineage.inaccessible + ``` + +You can also retrieve the training dataset provenance object. +=== "Python" + + ```python + lineage = model.get_training_dataset_provenance() + + # List all accessible parent training datasets + lineage.accessible + + # List all deleted parent training datasets + lineage.deleted + + # List all the inaccessible parent training datasets + lineage.inaccessible + ``` + +You can also retrieve directly the parent feature view object, without the need to extract them from the provenance links object +=== "Python" + + ```python + feature_view = model.get_feature_view() + ``` +This utility method also has the options to initialize the required components for batch or online retrieval of feature vectors. +=== "Python" + + ```python + model.get_feature_view(init: bool = True, online: Optional[bool]: None) + ``` + +By default, the base init for feature vector retrieval is enabled. In case you have a workflow that requires more particular options, you can disable this base init by setting the `init` to `false`. +The method detects if it is running within a deployment and will initialize the feature vector retrieval for the serving. +If the `online` argument is provided and `true` it will initialize for online feature vector retrieval. +If the `online` argument is provided and `false` it will initialize the feature vector retrieval for batch scoring. \ No newline at end of file From a19fa5099ad61c8a28d98bd30550c38f1f6aa129 Mon Sep 17 00:00:00 2001 From: Alexandru Ormenisan Date: Wed, 30 Oct 2024 15:26:53 +0100 Subject: [PATCH 2/3] fixes --- .../guides/fs/provenance/provenance_fv.png | Bin 49144 -> 34807 bytes .../mlops/provenance/provenance_model.png | Bin 0 -> 22628 bytes docs/user_guides/fs/provenance/provenance.md | 114 ++++++------------ .../mlops/provenance/provenance.md | 109 +++++++++++++++++ mkdocs.yml | 1 + 5 files changed, 145 insertions(+), 79 deletions(-) create mode 100644 docs/assets/images/guides/mlops/provenance/provenance_model.png create mode 100644 docs/user_guides/mlops/provenance/provenance.md diff --git a/docs/assets/images/guides/fs/provenance/provenance_fv.png b/docs/assets/images/guides/fs/provenance/provenance_fv.png index f1df85765f1480f3bee03b34ea1993f773f16285..dfd76f41867d14dd431b0697fd3e0c5f7fe32d6c 100644 GIT binary patch literal 34807 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 aDnGrMzW%D~vv7HVVwV0-aWj_x`hNjRF1^wK diff --git a/docs/assets/images/guides/mlops/provenance/provenance_model.png b/docs/assets/images/guides/mlops/provenance/provenance_model.png new file mode 100644 index 0000000000000000000000000000000000000000..b28caec6d70eec7b64b94025c27229b19b27fb2c GIT binary patch literal 22628 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 Td^vOqbhxaitDnm{r-UW|{3YWg literal 0 HcmV?d00001 diff --git a/docs/user_guides/fs/provenance/provenance.md b/docs/user_guides/fs/provenance/provenance.md index 9c1ad814c..c9a01acf5 100644 --- a/docs/user_guides/fs/provenance/provenance.md +++ b/docs/user_guides/fs/provenance/provenance.md @@ -1,10 +1,28 @@ -# Provenance +# Provenance -## Introduction +## Introduction -Hopsworks feature store allows users to track provenance (lineage) between storage connectors, feature groups, feature views, training datasets and models. Tracking lineage allows users to determine where/if a feature group is being used. You can track if feature groups are being used to create additional (derived) feature groups or feature views. +Hopsworks allows users to track provenance (lineage) between: -You can interact with the provenance graph using the UI and the APIs. +- storage connectors +- feature groups +- feature views +- training datasets +- models + +In the provenance pages we will call a provenance artifact or shortly artifact, any of the five entities above. + +When following the provenance graph: + +``` +storage connector -> feature group -> feature group -> feature view -> training dataset -> model +``` + +we will call the parent, the artifact to the left, and the child, the artifact to the right. So a feature view has a number of feature groups as parents and can have a number of training datasets as children. + +Tracking provenance allows users to determine where and if an artifact is being used. You can track, for example, if feature groups are being used to create additional (derived) feature groups or feature views, or if their data is eventually used to train models. + +You can interact with the provenance graph using the UI or the APIs. ## Step 1: Storage connector lineage @@ -87,7 +105,7 @@ When creating a feature group, it is possible to specify a list of feature group # Retrieve the feature group profiles_fg = fs.get_external_feature_group("user_profiles", version=1) - # Do feature engineering + # Do feature engineering age_df = transaction_df.merge(profiles_fg.read(), on="cc_num", how="left") transaction_df["age_at_transaction"] = (age_df["datetime"] - age_df["birthdate"]) / np.timedelta64(1, "Y") @@ -103,7 +121,7 @@ When creating a feature group, it is possible to specify a list of feature group transaction_fg.insert(transaction_df) ``` -Another example use case for derived feature group is if you have a feature group containing features with daily resolution and you are using the content of that feature group to populate a second feature group with monthly resolution: +Another example use case for derived feature group is if you have a feature group containing features with daily resolution and you are using the content of that feature group to populate a second feature group with monthly resolution: === "Python" @@ -112,7 +130,7 @@ Another example use case for derived feature group is if you have a feature grou daily_transaction_fg = fs.get_feature_group("daily_transaction", version=1) daily_transaction_df = daily_transaction_fg.read() - # Do feature engineering + # Do feature engineering cc_group = daily_transaction_df[["cc_num", "amount", "datetime"]] \ .groupby("cc_num") \ .rolling("1M", on="datetime") @@ -204,34 +222,16 @@ You can also traverse the provenance graph in the opposite direction. Starting f ```python lineage = transaction_fg.get_generated_feature_views() - # List all accessible downstream feature views + # List all accessible downstream feature views lineage.accessible - # List all the inaccessible downstream feature views + # List all the inaccessible downstream feature views lineage.inaccessible ``` -You can also traverse the provenance graph downstream to retrieve the models which use training datasets of this feature view as its parents. -=== "Python" +Users can call the [get_models_provenance](https://docs.hopsworks.ai/feature-store-api/{{{ hopsworks_version }}}/generated/api/feature_view_api/#get_models_provenance) method which will return a [Link](#provenance-links) object. - ```python - models = fraud_fv.get_models_provenance() - - # List all accessible models - lineage.accessible - - # List all the inaccessible models - lineage.inaccessible - ``` - -You can also retrieve only the models generated from specific training dataset versions: -=== "Python" - - ```python - models = fraud_fv.get_models_provenance(training_dataset_version: 1) - ``` - -You can also retrive directly the accessible model objects, without the need to extract them from the provenance links object: +You can also retrive directly the accessible models, without the need to extract them from the provenance links object: === "Python" ```python @@ -252,7 +252,7 @@ Also we added a utility method to retrieve from the user's accessible models, th model = fraud_fv.get_newest_model(training_dataset_version: 1) ``` -### Using the UI +### Using the UI In the feature view overview UI you can explore the provenance graph of the feature view: @@ -263,54 +263,10 @@ In the feature view overview UI you can explore the provenance graph of the feat

-## Step 3: Model lineage - -The relationship between feature views and models is captured automatically when you create a model. You can inspect the relationship between feature views and models using the APIs or the UI. -=== "Python" - - ```python - lineage = model.get_feature_view_provenance() - - # List all accessible parent feature views - lineage.accessible +## Provenance Links - # List all deleted parent feature views - lineage.deleted - - # List all the inaccessible parent feature views - lineage.inaccessible - ``` - -You can also retrieve the training dataset provenance object. -=== "Python" - - ```python - lineage = model.get_training_dataset_provenance() - - # List all accessible parent training datasets - lineage.accessible - - # List all deleted parent training datasets - lineage.deleted - - # List all the inaccessible parent training datasets - lineage.inaccessible - ``` - -You can also retrieve directly the parent feature view object, without the need to extract them from the provenance links object -=== "Python" - - ```python - feature_view = model.get_feature_view() - ``` -This utility method also has the options to initialize the required components for batch or online retrieval of feature vectors. -=== "Python" - - ```python - model.get_feature_view(init: bool = True, online: Optional[bool]: None) - ``` +All the `_provenance` methods return a `Link` dictionary object that contains `accessible`, `inaccesible`, `deleted` lists. -By default, the base init for feature vector retrieval is enabled. In case you have a workflow that requires more particular options, you can disable this base init by setting the `init` to `false`. -The method detects if it is running within a deployment and will initialize the feature vector retrieval for the serving. -If the `online` argument is provided and `true` it will initialize for online feature vector retrieval. -If the `online` argument is provided and `false` it will initialize the feature vector retrieval for batch scoring. \ No newline at end of file +- `accessible` - contains any artifact from the result, that the user has access to. +- `inaccessible` - contains any artifacts that might have been shared at some point in the past, but where this sharing was retracted. Since the relation between artifacts is still maintained in the provenance, the user will only have access to limited metadata and the artifacts will be included in this `inaccessible` list. +- `deleted` - contains artifacts that are deleted with children stil present in the system. There is minimum amount of metadata for the deleted allowing for some limited human readable identification. diff --git a/docs/user_guides/mlops/provenance/provenance.md b/docs/user_guides/mlops/provenance/provenance.md new file mode 100644 index 000000000..8fa663b84 --- /dev/null +++ b/docs/user_guides/mlops/provenance/provenance.md @@ -0,0 +1,109 @@ +# Provenance + +## Introduction + +Hopsworks allows users to track provenance (lineage) between: + +- storage connectors +- feature groups +- feature views +- training datasets +- models + +In the provenance pages we will call a provenance artifact or shortly artifact, any of the five entities above. + +When following the provenance graph: + +``` +storage connector -> feature group -> feature group -> feature view -> training dataset -> model +``` + +we will call the parent, the artifact to the left, and the child, the artifact to the right. So a feature view has a number of feature groups as parents and can have a number of training datasets as children. + +Tracking provenance allows users to determine where and if an artifact is being used. You can track, for example, if feature groups are being used to create additional (derived) feature groups or feature views, or if their data is eventually used to train models. + +You can interact with the provenance graph using the UI or the APIs. + +## Model provenance + +The relationship between feature views and models is captured in the model [constructor](https://docs.hopsworks.ai/machine-learning-api/{{{ hopsworks_version }}}/generated/model_registry/model_api/#create_model). If you do not provide at least the feature view object to the constructor, the provenance will not capture this relation and you will not be able to navigate from model to the feature view it used or from the feature view to this model. + +You can provide the feature view object and have the training dataset version be inferred. + +=== "Python" + + ```python + # this fv object will be provided to the model constructor + fv = hsfs.get_feature_view(...) + + # when calling trainig data related methods on the feature view, the training dataset version is cached in the feature view and is implicitly provided to the model constructor + X_train, X_test, y_train, y_test = feature_view.train_test_split(...) + + # provide the feature_view object in the model constructor + hsml.model_registry.ModelRegistry.python.create_model( + ... + feature_view = fv + ...) + ``` + +You can of course explicitly provide the training dataset version. +=== "Python" + + ```python + # this object will be provided to the model constructor + fv = hsfs.get_feature_view(...) + + # this training dataset version will be provided to the model constructor + X_train, X_test, y_train, y_test = feature_view.get_train_test_split(training_dataset_version=1) + + # provide the feature_view object in the model constructor + hsml.model_registry.ModelRegistry.python.create_model( + ... + feature_view = fv, + training_dataset_version = 1, + ...) + ``` + +Once the relation is stored in the provenance graph, you can navigate the graph from model to feature view or training dataset and the other way around. + +Users can call the [get_feature_view_provenance(https://docs.hopsworks.ai/machine-learning-api/{{{ hopsworks_version }}}/generated/model_registry/model_api/#get_feature_view_provenance) method or the [get_training_dataset_provenance(https://docs.hopsworks.ai/machine-learning-api/{{{ hopsworks_version }}}/generated/model_registry/model_api/#get_training_dataset_provenance) method which will each return a [Link](#provenance-links) object. + +You can also retrieve directly the parent feature view object, without the need to extract them from the provenance links object, using the [get_feature_view(https://docs.hopsworks.ai/machine-learning-api/{{{ hopsworks_version }}}/generated/model_registry/model_api/#get_feature_view ) method + +=== "Python" + + ```python + feature_view = model.get_feature_view() + ``` + +This utility method also has the options to initialize the required components for batch or online retrieval of feature vectors. + +=== "Python" + + ```python + model.get_feature_view(init: bool = True, online: Optional[bool]: None) + ``` + +By default, the base init for feature vector retrieval is enabled. In case you have a workflow that requires more particular options, you can disable this base init by setting the `init` to `false`. +The method detects if it is running within a deployment and will initialize the feature vector retrieval for the serving. +If the `online` argument is provided and `true` it will initialize for online feature vector retrieval. +If the `online` argument is provided and `false` it will initialize the feature vector retrieval for batch scoring. + +### Using the UI + +In the model overview UI you can explore the provenance graph of the model: + +

+

+ Model provenance graph +
Provenance graph of derived feature groups
+
+

+ +## Provenance Links + +All the `_provenance` methods return a `Link` dictionary object that contains `accessible`, `inaccesible`, `deleted` lists. + +- `accessible` - contains any artifact from the result, that the user has access to. +- `inaccessible` - contains any artifacts that might have been shared at some point in the past, but where this sharing was retracted. Since the relation between artifacts is still maintained in the provenance, the user will only have access to limited metadata and the artifacts will be included in this `inaccessible` list. +- `deleted` - contains artifacts that are deleted with children stil present in the system. There is minimum amount of metadata for the deleted allowing for some limited human readable identification. diff --git a/mkdocs.yml b/mkdocs.yml index c94fd7d7d..c6d234991 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -195,6 +195,7 @@ nav: - API Protocol: user_guides/mlops/serving/api-protocol.md - Troubleshooting: user_guides/mlops/serving/troubleshooting.md - Vector Database: user_guides/mlops/vector_database/index.md + - Provenance: user_guides/mlops/provenance/provenance.md - Migration: - 3.X to 4.0: user_guides/migration/40_migration.md - Setup and Administration: From 60c3b3131cbd0fd2710f18672fc3b402bf148e43 Mon Sep 17 00:00:00 2001 From: Fabio Buso Date: Sun, 10 Nov 2024 05:41:23 +0100 Subject: [PATCH 3/3] Fix links for main branch --- docs/user_guides/fs/provenance/provenance.md | 16 ++++++++-------- docs/user_guides/mlops/provenance/provenance.md | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/user_guides/fs/provenance/provenance.md b/docs/user_guides/fs/provenance/provenance.md index c9a01acf5..9b42e7e8a 100644 --- a/docs/user_guides/fs/provenance/provenance.md +++ b/docs/user_guides/fs/provenance/provenance.md @@ -12,7 +12,7 @@ Hopsworks allows users to track provenance (lineage) between: In the provenance pages we will call a provenance artifact or shortly artifact, any of the five entities above. -When following the provenance graph: +With the following provenance graph: ``` storage connector -> feature group -> feature group -> feature view -> training dataset -> model @@ -46,7 +46,7 @@ The relationship between storage connectors and feature groups is captured autom ### Using the APIs -Starting from a feature group metadata object, you can traverse upstream the provenance graph to retrieve the metadata objects of the storage connectors that are part of the feature group. To do so, you can use the [get_storage_connector_provenance](https://docs.hopsworks.ai/feature-store-api/{{{ hopsworks_version }}}/generated/api/feature_group_api/#get_storage_connector_provenance) method. +Starting from a feature group metadata object, you can traverse upstream the provenance graph to retrieve the metadata objects of the storage connectors that are part of the feature group. To do so, you can use the [get_storage_connector_provenance](https://docs.hopsworks.ai/hopsworks-api/{{{ hopsworks_version }}}/generated/api/feature_group_api/#get_storage_connector_provenance) method. === "Python" @@ -71,7 +71,7 @@ Starting from a feature group metadata object, you can traverse upstream the pro user_profiles_fg.get_storage_connector() ``` -To traverse the provenance graph in the opposite direction (i.e. from the storage connector to the feature group), you can use the [get_feature_groups_provenance](https://docs.hopsworks.ai/feature-store-api/{{{ hopsworks_version }}}/generated/api/storage_connector_api/#get_feature_groups_provenance) method. When navigating the provenance graph downstream, the `deleted` feature groups are not tracked by provenance, as such, the `deleted` property will always return an empty list. +To traverse the provenance graph in the opposite direction (i.e. from the storage connector to the feature group), you can use the [get_feature_groups_provenance](https://docs.hopsworks.ai/hopsworks-api/{{{ hopsworks_version }}}/generated/api/storage_connector_api/#get_feature_groups_provenance) method. When navigating the provenance graph downstream, the `deleted` feature groups are not tracked by provenance, as such, the `deleted` property will always return an empty list. === "Python" @@ -97,7 +97,7 @@ To traverse the provenance graph in the opposite direction (i.e. from the storag ### Assign parents to a feature group -When creating a feature group, it is possible to specify a list of feature groups used to create the derived features. For example, you could have an external feature group defined over a Snowflake or Redshift table, which you use to compute the features and save them in a feature group. You can mark the external feature group as parent of the feature group you are creating by using the `parents` parameter in the [get_or_create_feature_group](https://docs.hopsworks.ai/feature-store-api/{{{ hopsworks_version }}}/generated/api/feature_group_api/#get_or_create_feature_group) or [create_feature_group](https://docs.hopsworks.ai/feature-store-api/{{{ hopsworks_version }}}/generated/api/feature_group_api/#create_feature_group) methods: +When creating a feature group, it is possible to specify a list of feature groups used to create the derived features. For example, you could have an external feature group defined over a Snowflake or Redshift table, which you use to compute the features and save them in a feature group. You can mark the external feature group as parent of the feature group you are creating by using the `parents` parameter in the [get_or_create_feature_group](https://docs.hopsworks.ai/hopsworks-api/{{{ hopsworks_version }}}/generated/api/feature_group_api/#get_or_create_feature_group) or [create_feature_group](https://docs.hopsworks.ai/hopsworks-api/{{{ hopsworks_version }}}/generated/api/feature_group_api/#create_feature_group) methods: === "Python" @@ -150,7 +150,7 @@ Another example use case for derived feature group is if you have a feature grou ### List feature group parents -You can query the provenance graph of a feature group using the UI and the APIs. From the APIs you can list the parent feature groups by calling the method [get_parent_feature_groups](https://docs.hopsworks.ai/feature-store-api/{{{ hopsworks_version }}}/generated/api/feature_group_api/#get_parent_feature_groups) +You can query the provenance graph of a feature group using the UI and the APIs. From the APIs you can list the parent feature groups by calling the method [get_parent_feature_groups](https://docs.hopsworks.ai/hopsworks-api/{{{ hopsworks_version }}}/generated/api/feature_group_api/#get_parent_feature_groups) === "Python" @@ -169,7 +169,7 @@ You can query the provenance graph of a feature group using the UI and the APIs. A parent is marked as `deleted` (and added to the deleted list) if the parent feature group was deleted. `inaccessible` if you no longer have access to the parent feature group (e.g. the parent feature group belongs to a project you no longer have access to). -To traverse the provenance graph in the opposite direction (i.e. from the parent feature group to the child), you can use the [get_generate_feature_groups](https://docs.hopsworks.ai/feature-store-api/{{{ hopsworks_version }}}/generated/api/feature_group_api/#get_generated_feature_groups) method. When navigating the provenance graph downstream, the `deleted` feature groups are not tracked by provenance, as such, the `deleted` property will always return an empty list. +To traverse the provenance graph in the opposite direction (i.e. from the parent feature group to the child), you can use the [get_generate_feature_groups](https://docs.hopsworks.ai/hopsworks-api/{{{ hopsworks_version }}}/generated/api/feature_group_api/#get_generated_feature_groups) method. When navigating the provenance graph downstream, the `deleted` feature groups are not tracked by provenance, as such, the `deleted` property will always return an empty list. === "Python" @@ -198,7 +198,7 @@ The relationship between feature groups and feature views is captured automatica ### Using the APIs -Starting from a feature view metadata object, you can traverse upstream the provenance graph to retrieve the metadata objects of the feature groups that are part of the feature view. To do so, you can use the [get_parent_feature_groups](https://docs.hopsworks.ai/feature-store-api/{{{ hopsworks_version }}}/generated/api/feature_view_api/#get_parent_feature_groups) method. +Starting from a feature view metadata object, you can traverse upstream the provenance graph to retrieve the metadata objects of the feature groups that are part of the feature view. To do so, you can use the [get_parent_feature_groups](https://docs.hopsworks.ai/hopsworks-api/{{{ hopsworks_version }}}/generated/api/feature_view_api/#get_parent_feature_groups) method. === "Python" @@ -229,7 +229,7 @@ You can also traverse the provenance graph in the opposite direction. Starting f lineage.inaccessible ``` -Users can call the [get_models_provenance](https://docs.hopsworks.ai/feature-store-api/{{{ hopsworks_version }}}/generated/api/feature_view_api/#get_models_provenance) method which will return a [Link](#provenance-links) object. +Users can call the [get_models_provenance](https://docs.hopsworks.ai/hopsworks-api/{{{ hopsworks_version }}}/generated/api/feature_view_api/#get_models_provenance) method which will return a [Link](#provenance-links) object. You can also retrive directly the accessible models, without the need to extract them from the provenance links object: === "Python" diff --git a/docs/user_guides/mlops/provenance/provenance.md b/docs/user_guides/mlops/provenance/provenance.md index 8fa663b84..611366af4 100644 --- a/docs/user_guides/mlops/provenance/provenance.md +++ b/docs/user_guides/mlops/provenance/provenance.md @@ -12,7 +12,7 @@ Hopsworks allows users to track provenance (lineage) between: In the provenance pages we will call a provenance artifact or shortly artifact, any of the five entities above. -When following the provenance graph: +With the following provenance graph: ``` storage connector -> feature group -> feature group -> feature view -> training dataset -> model @@ -26,7 +26,7 @@ You can interact with the provenance graph using the UI or the APIs. ## Model provenance -The relationship between feature views and models is captured in the model [constructor](https://docs.hopsworks.ai/machine-learning-api/{{{ hopsworks_version }}}/generated/model_registry/model_api/#create_model). If you do not provide at least the feature view object to the constructor, the provenance will not capture this relation and you will not be able to navigate from model to the feature view it used or from the feature view to this model. +The relationship between feature views and models is captured in the model [constructor](https://docs.hopsworks.ai/hopsworks-api/{{{ hopsworks_version }}}/generated/model_registry/model_api/#create_model). If you do not provide at least the feature view object to the constructor, the provenance will not capture this relation and you will not be able to navigate from model to the feature view it used or from the feature view to this model. You can provide the feature view object and have the training dataset version be inferred. @@ -66,9 +66,9 @@ You can of course explicitly provide the training dataset version. Once the relation is stored in the provenance graph, you can navigate the graph from model to feature view or training dataset and the other way around. -Users can call the [get_feature_view_provenance(https://docs.hopsworks.ai/machine-learning-api/{{{ hopsworks_version }}}/generated/model_registry/model_api/#get_feature_view_provenance) method or the [get_training_dataset_provenance(https://docs.hopsworks.ai/machine-learning-api/{{{ hopsworks_version }}}/generated/model_registry/model_api/#get_training_dataset_provenance) method which will each return a [Link](#provenance-links) object. +Users can call the [get_feature_view_provenance(https://docs.hopsworks.ai/hopsworks-api/{{{ hopsworks_version }}}/generated/model_registry/model_api/#get_feature_view_provenance) method or the [get_training_dataset_provenance(https://docs.hopsworks.ai/hopsworks-api/{{{ hopsworks_version }}}/generated/model_registry/model_api/#get_training_dataset_provenance) method which will each return a [Link](#provenance-links) object. -You can also retrieve directly the parent feature view object, without the need to extract them from the provenance links object, using the [get_feature_view(https://docs.hopsworks.ai/machine-learning-api/{{{ hopsworks_version }}}/generated/model_registry/model_api/#get_feature_view ) method +You can also retrieve directly the parent feature view object, without the need to extract them from the provenance links object, using the [get_feature_view(https://docs.hopsworks.ai/hopsworks-api/{{{ hopsworks_version }}}/generated/model_registry/model_api/#get_feature_view ) method === "Python"