Partager via


Résolution des problèmes magasin de fonctionnalités géré

Dans cet article, découvrez comment résoudre les problèmes courants que vous pouvez rencontrer avec le magasin de fonctionnalités géré dans Azure Machine Learning.

Problèmes rencontrés lors de la création et de la mise à jour d’un magasin de fonctionnalités

Vous pouvez rencontrer ces problèmes lorsque vous créez ou mettez à jour un magasin de fonctionnalités :

Erreur de limitation ARM

Symptôme

Échec de la création ou de la mise à jour du magasin de fonctionnalités. L’erreur peut ressembler à ceci :

{
  "error": {
    "code": "TooManyRequests",
    "message": "The request is being throttled as the limit has been reached for operation type - 'Write'. ..",
    "details": [
      {
        "code": "TooManyRequests",
        "target": "Microsoft.MachineLearningServices/workspaces",
        "message": "..."
      }
    ]
  }
}

Solution

Exécutez l’opération de création/mise à jour du magasin de fonctionnalités ultérieurement. Le déploiement se déroulant en plusieurs étapes, la deuxième tentative peut échouer dans la mesure où certaines ressources existent déjà. Supprimez ces ressources et reprenez le travail.

Problème d’ID ARM d’identité de matérialisation en double

Une fois le magasin de fonctionnalités mis à jour pour activer la matérialisation pour la première fois, certaines mises à jour ultérieures sur le magasin de fonctionnalités peuvent entraîner cette erreur.

Symptôme

Lorsque le magasin de fonctionnalités est mis à jour à l’aide du Kit de développement logiciel (SDK)/de l’interface CLI, la mise à jour échoue avec ce message d’erreur :

Erreur :

{
  "error":{
    "code": "InvalidRequestContent",
    "message": "The request content contains duplicate JSON property names creating ambiguity in paths 'identity.userAssignedIdentities['/subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{your-uai}']'. Please update the request content to eliminate duplicates and try again."
  }
}

Solution

Le problème implique l’identifiant ARM du format d’identifiant ARM materialization_identity.

À partir de l’interface utilisateur ou du Kit de développement logiciel (SDK) Azure, l’identifiant ARM de l’identité managée affectée par l’utilisateur utilise la minuscule resourcegroups. Consultez l’exemple suivant :

  • (A) : /subscriptions/{sub-id}/resourcegroups/{rg}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{your-uai}

Lorsque le magasin de fonctionnalités utilise l’identité managée affectée par l’utilisateur comme materialization_identity, son identifiant ARM est normalisé et stocké avec resourceGroups. Consultez l’exemple suivant :

  • (B) : /subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{your-uai}

Dans la requête de mise à jour, vous pouvez utiliser une identité affectée par l’utilisateur qui correspond à l’identité de matérialisation pour mettre à jour le magasin de fonctionnalités. Lorsque vous utilisez l’ID ARM au format (A), lors de l’utilisation de cette identité managée à cet effet, la mise à jour échoue et retourne le message d’erreur précédent.

Pour résoudre le problème, remplacez la chaîne resourcegroups par resourceGroups l’identifiant ARM de l’identité managée affectée par l’utilisateur. Ensuite, réexécutez la mise à jour du magasin de fonctionnalités.

Erreurs d’autorisation RBAC

Pour créer un magasin de fonctionnalités, l’utilisateur a besoin des rôles Contributor et User Access Administrator. Un rôle personnalisé qui couvre le même ensemble de rôles des actions est valable. Un super ensemble regroupant ces deux rôles des actions est également valable.

Symptôme

Si l’utilisateur ne dispose pas des rôles requis, le déploiement échoue. La réponse d’erreur peut ressembler à ceci :

{
  "error": {
    "code": "AuthorizationFailed",
    "message": "The client '{client_id}' with object id '{object_id}' does not have authorization to perform action '{action_name}' over scope '{scope}' or the scope is invalid. If access was recently granted, please refresh your credentials."
  }
}

Solution

Octroyez les rôles Contributor et User Access Administrator à l’utilisateur sur le groupe de ressources où le magasin de fonctionnalités est créé. Ensuite, demandez à l’utilisateur d’exécuter à nouveau le déploiement.

Pour plus d’informations, consultez la ressource Autorisations requises pour le rôle feature store materialization managed identity.

Les versions antérieures du package azure-mgmt-authorization ne fonctionnent pas avec AzureMLOnBehalfOfCredential

Symptôme

Dans le référentiel azureml-examples, lorsque vous utilisez le script setup_storage_uai fourni dans le dossier featurestore_sample, le script échoue avec ce message d’erreur :

AttributeError: 'AzureMLOnBehalfOfCredential' object has no attribute 'signed_session'

Solution :

Vérifiez la version du package installé azure-mgmt-authorization et vérifiez que vous utilisez une version récente, au moins 3.0.0 ou ultérieure. Une version plus ancienne, par exemple 0.61.0, ne fonctionne pas avec AzureMLOnBehalfOfCredential.

Erreurs de création de spécifications de l’ensemble de fonctionnalités

Schéma non valide dans la spécification de l’ensemble de fonctionnalités

Avant d’inscrire un ensemble de fonctionnalités dans le magasin de fonctionnalités, définissez la spécification de l’ensemble de fonctionnalités localement et exécutez <feature_set_spec>.to_spark_dataframe() pour la valider.

Symptôme

Lorsqu’un utilisateur exécute <feature_set_spec>.to_spark_dataframe(), plusieurs échecs de validation de schéma peuvent se produire si le schéma du DataFrame du jeu de fonctionnalités n’est pas aligné sur la définition de spécification de l’ensemble de fonctionnalités.

Par exemple :

  • Message d’erreur : azure.ai.ml.exceptions.ValidationException: Schema check errors, timestamp column: timestamp is not in output dataframe
  • Message d’erreur : Exception: Schema check errors, no index column: accountID in output dataframe
  • Message d’erreur : ValidationException: Schema check errors, feature column: transaction_7d_count has data type: ColumnType.long, expected: ColumnType.string

Solution

Vérifiez l’erreur d’échec de validation du schéma et mettez à jour la définition de spécification de l’ensemble de fonctionnalités en conséquence, pour les noms et types de colonnes. Par exemple :

  • mettre à jour la propriété source.timestamp_column.name pour définir correctement les noms des colonnes de timestamp
  • mettre à jour la propriété index_columns pour définir correctement les colonnes d’index
  • mettre à jour la propriété features pour définir correctement les noms et types de colonnes de fonctionnalités
  • si les données de la source de fonctionnalités sont de type csv, vérifier que les fichiers CSV sont générés avec des en-têtes de colonne

Ensuite, réexécutez <feature_set_spec>.to_spark_dataframe() pour vérifier si la validation a réussi.

Au lieu de taper manuellement les valeurs, si le Kit de développement logiciel (SDK) définit la spécification de l’ensemble de fonctionnalités, l’option infer_schema est également recommandée comme moyen préféré de remplir automatiquement features. timestamp_column et index columns ne peuvent pas être remplis automatiquement.

Pour plus d’informations, visitez la ressource Schéma de spécification de l’ensemble de fonctionnalités.

Impossible de trouver la classe de transformation

Symptôme

Lorsqu’un utilisateur exécute <feature_set_spec>.to_spark_dataframe(), il retourne cette erreur : AttributeError: module '<...>' has no attribute '<...>'

Par exemple :

  • AttributeError: module '7780d27aa8364270b6b61fed2a43b749.transaction_transform' has no attribute 'TransactionFeatureTransformer1'

Solution

La classe de transformation de fonctionnalité devrait avoir sa définition dans un fichier Python sous la racine du dossier de code. Le dossier de code peut avoir d’autres fichiers ou sous-dossiers.

Affectez à la propriété feature_transformation_code.transformation_class la valeur <py file name of the transformation class>.<transformation class name>.

Par exemple, si le dossier de code ressemble à ceci

code/
└── my_transformation_class.py

et le fichier my_transformation_class.py définit la classe MyFeatureTransformer, définissez

feature_transformation_code.transformation_class sur my_transformation_class.MyFeatureTransformer

FileNotFoundError sur le dossier de code

Symptôme

Cette erreur peut se produire si le fichier YAML de spécification de l’ensemble de fonctionnalités est créé manuellement et que le SDK ne génère pas l’ensemble de fonctionnalités. La commande

runs <feature_set_spec>.to_spark_dataframe()

retourne une erreur

FileNotFoundError: [Errno 2] No such file or directory: ....

Solution

Vérifiez le dossier de code. Il doit s’agir d’un sous-dossier sous le dossier de spécifications de l’ensemble de fonctionnalités. Dans la spécification de l’ensemble de fonctionnalités, définissez feature_transformation_code.path comme chemin d’accès relatif au dossier de spécifications de l’ensemble de fonctionnalités. Par exemple :

feature set spec folder/
├── code/
│ ├── my_transformer.py
│ └── my_orther_folder
└── FeatureSetSpec.yaml

Dans cet exemple, la propriété feature_transformation_code.path dans YAML doit être ./code

Remarque

Lorsque vous utilisez la fonction create_feature_set_spec dans azureml-featurestore pour créer un objet Python FeatureSetSpec, elle peut prendre n’importe quel dossier local comme valeur feature_transformation_code.path. Lorsque l’objet FeatureSetSpec est vidé pour former un fichier YAML de spécification d’ensemble de fonctionnalités dans un dossier cible, le chemin du code est copié dans le dossier cible et la propriété feature_transformation_code.path est mise à jour dans le fichier YAML de spécification.

Erreurs CRUD d’un ensemble de fonctionnalités

L’ensemble de fonctionnalités GET échoue en raison d’une entité FeatureStoreEntity non valide

Symptôme

Lorsque vous utilisez le client CRUD du magasin de fonctionnalités pour obtenir (GET) un ensemble de fonctionnalités (par exemple, fs_client.feature_sets.get(name, version)"`), vous pouvez recevoir cette erreur :


Traceback (most recent call last):

  File "/home/trusted-service-user/cluster-env/env/lib/python3.8/site-packages/azure/ai/ml/operations/_feature_store_entity_operations.py", line 116, in get

    return FeatureStoreEntity._from_rest_object(feature_store_entity_version_resource)

  File "/home/trusted-service-user/cluster-env/env/lib/python3.8/site-packages/azure/ai/ml/entities/_feature_store_entity/feature_store_entity.py", line 93, in _from_rest_object

    featurestoreEntity = FeatureStoreEntity(

  File "/home/trusted-service-user/cluster-env/env/lib/python3.8/site-packages/azure/ai/ml/_utils/_experimental.py", line 42, in wrapped

    return func(*args, **kwargs)

  File "/home/trusted-service-user/cluster-env/env/lib/python3.8/site-packages/azure/ai/ml/entities/_feature_store_entity/feature_store_entity.py", line 67, in __init__

    raise ValidationException(

azure.ai.ml.exceptions.ValidationException: Stage must be Development, Production, or Archived, found None

Cette erreur peut également se produire dans le travail de matérialisation FeatureStore, où le travail échoue avec la même trace d’erreur.

Solution

Démarrer une session de notebook avec la nouvelle version de SDKS

  • S’il utilise azure-ai-ml, mettez à jour vers azure-ai-ml==1.8.0.
  • S’il utilise le Kit de développement logiciel (SDK) du plan de données du magasin de fonctionnalités, mettez-le à jour vers azureml-featurestore== 0.1.0b2.

Dans la session du notebook, mettez à jour l’entité de magasin de fonctionnalités pour définir sa propriété stage, comme illustré dans cet exemple :

from azure.ai.ml.entities import DataColumn, DataColumnType
 
account_entity_config = FeatureStoreEntity(

    name="account",

    version="1",

    index_columns=[DataColumn(name="accountID", type=DataColumnType.STRING)],

    stage="Development",

    description="This entity represents user account index key accountID.",

    tags={"data_typ": "nonPII"},

)

poller = fs_client.feature_store_entities.begin_create_or_update(account_entity_config)

print(poller.result())

Lorsque vous définissez FeatureStoreEntity, définissez les propriétés pour qu’elles correspondent aux propriétés utilisées lors de sa création. La seule différence consiste à ajouter la propriété stage.

Une fois l’appel begin_create_or_update() correctement retourné, l’appel feature_sets.get() suivant et le travail de matérialisation suivant doivent réussir.

Erreurs de requête et de travail de récupération de fonctionnalités

Lorsqu’un travail de récupération de fonctionnalité échoue, vérifiez les détails de l’erreur. Accédez à la page détails de l’exécution, sélectionnez l’ongletSorties + journaux, puis examinez le fichier logs/azureml/driver/stdout .

Si l’utilisateur exécute la requête get_offline_feature() dans le notebook, la cellule affiche directement l’erreur.

Erreurs de résolution des spécifications de récupération des fonctionnalités

Symptôme

La requête/travail de récupération des fonctionnalités affiche les erreurs suivantes :

  • Fonctionnalité non valide
code: "UserError"
mesasge: "Feature '<some name>' not found in this featureset."
  • URI du magasin de fonctionnalités non valide :
message: "the Resource 'Microsoft.MachineLearningServices/workspaces/<name>' under resource group '<>>resource group name>'->' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix",
code: "ResourceNotFound"
  • Ensemble de fonctionnalités non valide :
code: "UserError"
message: "Featureset with name: <name >and version: <version> not found."

Solution

Vérifiez le contenu dans le feature_retrieval_spec.yaml que le travail utilise. Vérifiez que tous les noms de magasin de fonctionnalités

  • URI
  • nom/version de l’ensemble de fonctionnalités
  • feature

sont valides et qu’ils existent dans le magasin de fonctionnalités.

Pour sélectionner des fonctionnalités dans un magasin de fonctionnalités et générer le fichier YAML de spécifications de la récupération de fonctionnalités, l’utilisation de la fonction utilitaire est recommandée.

Cet extrait de code utilise la fonction utilitaire generate_feature_retrieval_spec.

from azureml.featurestore import FeatureStoreClient
from azure.ai.ml.identity import AzureMLOnBehalfOfCredential

featurestore = FeatureStoreClient(
credential = AzureMLOnBehalfOfCredential(),
subscription_id = featurestore_subscription_id,
resource_group_name = featurestore_resource_group_name,
name = featurestore_name
)

transactions_featureset = featurestore.feature_sets.get(name="transactions", version = "1")

features = [
    transactions_featureset.get_feature('transaction_amount_7d_sum'),
    transactions_featureset.get_feature('transaction_amount_3d_sum')
]

feature_retrieval_spec_folder = "./project/fraud_model/feature_retrieval_spec"
featurestore.generate_feature_retrieval_spec(feature_retrieval_spec_folder, features)

Fichier feature_retrieval_spec.yaml introuvable lors de l’utilisation d’un modèle comme entrée dans le travail de récupération de fonctionnalité

Symptôme

Lorsque vous utilisez un modèle inscrit comme entrée de travail de récupération de fonctionnalités, le travail échoue avec cette erreur :

ValueError: Failed with visit error: Failed with execution error: error in streaming from input data sources
    VisitError(ExecutionError(StreamError(NotFound)))
=> Failed with execution error: error in streaming from input data sources
    ExecutionError(StreamError(NotFound)); Not able to find path: azureml://subscriptions/{sub_id}/resourcegroups/{rg}/workspaces/{ws}/datastores/workspaceblobstore/paths/LocalUpload/{guid}/feature_retrieval_spec.yaml

Solution :

Lorsque vous fournissez un modèle comme entrée à l’étape de récupération des fonctionnalités, le modèle s’attend à trouver le fichier YAML de spécification de récupération sous le dossier de l’artefact du modèle. Le travail échoue si ce fichier est manquant.

Pour corriger le problème, empaquetez le fichier feature_retrieval_spec.yaml dans le dossier racine du dossier d’artefacts du modèle avant d’inscrire le modèle.

Les données d’observation ne sont jointes à aucune valeur de fonctionnalité

Symptôme

Une fois que les utilisateurs exécutent la requête/travail de récupération des fonctionnalités, les données de sortie n’obtiennent aucune valeur de fonctionnalité. Par exemple, un utilisateur exécute la tâche de récupération de fonctionnalités pour récupérer les fonctionnalités transaction_amount_3d_avg et transaction_amount_7d_avg, avec les résultats suivants :

transactionID accountID timestamp is_fraud transaction_amount_3d_avg transaction_amount_7d_avg
83870774-7A98-43B... A1055520444618950 2023-02-28 04:34:27 0 null null
25144265-F68B-4FD... A1055520444618950 2023-02-28 10:44:30 0 null null
8899ED8C-B295-43F... A1055520444812380 2023-03-06 00:36:30 0 null null

Solution

La récupération des fonctionnalités effectue une requête de jointure à un point dans le temps. Si le résultat de jointure est vide, essayez ces solutions potentielles :

  • Étendez la plage temporal_join_lookback dans la définition de spécification de l’ensemble de fonctionnalités, ou supprimez-la temporairement. Cela permet à la jointure à un point dans le temps de revenir en arrière (ou infiniment) dans le passé, avant l’horodatage de l’événement d’observation, de rechercher les valeurs des caractéristiques.
  • Si source.source_delay est également défini dans la définition de spécification de l’ensemble de fonctionnalités, assurez-vous que temporal_join_lookback > source.source_delay.

Si aucune de ces solutions ne fonctionne, obtenez l’ensemble de fonctionnalités à partir du magasin de fonctionnalités et exécutez <feature_set>.to_spark_dataframe() pour inspecter manuellement les colonnes et timestamps de l’index de fonctionnalité. L’échec peut se produire car :

  • Les valeurs d’index dans les données d’observation n’existent pas dans le dataframe de l’ensemble de fonctionnalités
  • aucune valeur de fonctionnalité, avec une valeur de timestamp avant le timestamp d’observation, n’existe.

Dans ces cas, si la fonctionnalité a activé la matérialisation hors connexion, vous devrez peut-être renvoyer davantage de données de fonctionnalités.

L’identité utilisateur ou managée n’a pas l’autorisation RBAC appropriée sur le magasin de fonctionnalités

Symptôme :

Le travail/requête de récupération des fonctionnalités échoue avec ce message d’erreur dans le fichier logs/azureml/driver/stdout :

Traceback (most recent call last):
  File "/home/trusted-service-user/cluster-env/env/lib/python3.8/site-packages/azure/ai/ml/_restclient/v2022_12_01_preview/operations/_workspaces_operations.py", line 633, in get
    raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat)
azure.core.exceptions.HttpResponseError: (AuthorizationFailed) The client 'XXXX' with object id 'XXXX' does not have authorization to perform action 'Microsoft.MachineLearningServices/workspaces/read' over scope '/subscriptions/XXXX/resourceGroups/XXXX/providers/Microsoft.MachineLearningServices/workspaces/XXXX' or the scope is invalid. If access was recently granted, please refresh your credentials.
Code: AuthorizationFailed

Solution :

  1. Si le travail de récupération de fonctionnalités utilise une identité managée, attribuez le rôle AzureML Data Scientist sur le magasin de fonctionnalités à l’identité.

  2. Si le problème se produit quand

  • l’utilisateur exécute du code dans un notebook Azure Machine Learning Spark
  • ce notebook utilise la propre identité de l’utilisateur pour accéder à Azure Machine Learning service

attribuez le rôle AzureML Data Scientist sur le magasin de fonctionnalités à l’identité Microsoft Entra de l’utilisateur.

Azure Machine Learning Data Scientist est un rôle recommandé. L’utilisateur peut créer son propre rôle personnalisé avec les actions suivantes

  • Microsoft.MachineLearningServices/workspaces/datastores/listsecrets/action
  • Microsoft.MachineLearningServices/workspaces/featuresets/read
  • Microsoft.MachineLearningServices/workspaces/read

Pour plus d’informations sur la configuration RBAC, visitez la ressource Gérer l’accès au magasin de fonctionnalités géré.

L’utilisateur ou l’identité managée ne dispose pas de l’autorisation RBAC appropriée pour lire à partir du stockage source ou du magasin hors connexion

Symptôme

Le travail/requête de récupération des fonctionnalités échoue avec le message d’erreur suivant dans le fichier logs/azureml/driver/stdout :

An error occurred while calling o1025.parquet.
: java.nio.file.AccessDeniedException: Operation failed: "This request is not authorized to perform this operation using this permission.", 403, GET, https://{storage}.dfs.core.windows.net/test?upn=false&resource=filesystem&maxResults=5000&directory=datasources&timeout=90&recursive=false, AuthorizationPermissionMismatch, "This request is not authorized to perform this operation using this permission. RequestId:63013315-e01f-005e-577b-7c63b8000000 Time:2023-05-01T22:20:51.1064935Z"
    at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem.checkException(AzureBlobFileSystem.java:1203)
    at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem.listStatus(AzureBlobFileSystem.java:408)
    at org.apache.hadoop.fs.Globber.listStatus(Globber.java:128)
    at org.apache.hadoop.fs.Globber.doGlob(Globber.java:291)
    at org.apache.hadoop.fs.Globber.glob(Globber.java:202)
    at org.apache.hadoop.fs.FileSystem.globStatus(FileSystem.java:2124)

Solution :

  • Si le travail de récupération des fonctionnalités utilise une identité managée, attribuez le rôle Storage Blob Data Reader sur le stockage source et le stockage de magasin hors connexion à l’identité.
  • Cette erreur se produit lorsque le notebook utilise l’identité de l’utilisateur pour accéder à Azure Machine Learning service pour exécuter la requête. Pour résoudre l’erreur, attribuez le rôle Storage Blob Data Reader à l’identité de l’utilisateur sur le stockage source et le compte de stockage de magasin hors connexion.

Storage Blob Data Reader est la condition d’accès minimale recommandée. Les utilisateurs peuvent également attribuer des rôles , par exemple, Storage Blob Data Contributor ou Storage Blob Data Owner, avec plus de privilèges.

Le travail de formation ne parvient pas à lire les données générées par le composant de récupération de fonctionnalité intégré

Symptôme

Un travail d’apprentissage échoue avec le message d’erreur indiquant que les données d’apprentissage n’existent pas, que le format est incorrect ou qu’une erreur d’analyseur s’affiche :

FileNotFoundError: [Errno 2] No such file or directory
  • le format n’est pas correct.
ParserError:

Solution

Le composant de récupération de fonctionnalité intégré a une sortie, output_data. Les données de sortie sont une ressource de données uri_folder. Il a toujours cette structure de dossiers :

<training data folder>/
├── data/
│ ├── xxxxx.parquet
│ └── xxxxx.parquet
└── feature_retrieval_spec.yaml

Les données de sortie sont toujours au format parquet. Mettez à jour le script de formation pour lire à partir du sous-dossier « data » et lire les données en tant que parquet.

generate_feature_retrieval_spec() échoue en raison de l’utilisation de la spécification de l’ensemble de fonctionnalités local

Symptôme :

Ce code Python génère une spécification de récupération de fonctionnalités sur une liste donnée de fonctionnalités :

featurestore.generate_feature_retrieval_spec(feature_retrieval_spec_folder, features)

Si la liste des fonctionnalités contient des fonctionnalités définies par une spécification d’ensemble de fonctionnalités locale, le generate_feature_retrieval_spec() échoue avec ce message d’erreur :

AttributeError: 'FeatureSetSpec' object has no attribute 'id'

Solution :

Une spécification de récupération de fonctionnalités ne peut être générée qu’à l’aide d’ensembles de fonctionnalités inscrits dans le magasin de fonctionnalités. Pour corriger le problème :

  • Inscrire la spécification de l’ensemble de fonctionnalités local en tant qu’ensemble de fonctionnalités dans le magasin de fonctionnalités
  • Obtenir l’ensemble de fonctionnalités inscrit
  • Créer à nouveau des listes de fonctionnalités en utilisant uniquement les fonctionnalités des ensembles de fonctionnalités inscrits
  • Générer la spécification de récupération des fonctionnalités à l’aide de la liste des nouvelles fonctionnalités

La requête get_offline_features() prend beaucoup de temps

Symptôme :

L’exécution de get_offline_features pour générer des données d’apprentissage, à l’aide de quelques fonctionnalités du magasin de fonctionnalités, prend trop de temps.

Solutions :

Vérifiez ces configurations :

  • Vérifiez que temporal_join_lookback est défini dans la spécification de chaque ensemble de fonctionnalités utilisé dans la requête. Définissez sa valeur sur une valeur plus petite.
  • Si la fenêtre de taille et timestamp sur le cadre de données d’observation est volumineuse, configurez la session de notebook (ou le travail) pour augmenter la taille (mémoire et cœur) du pilote et de l’exécuteur. En outre, augmentez le nombre d’exécuteurs.

Erreurs de travail de matérialisation des fonctionnalités

Lorsque le travail de matérialisation des fonctionnalités échoue, procédez comme suit pour vérifier les détails de l’échec du travail :

  1. Accédez à la page du magasin de fonctionnalités : https://ml.azure.com/featureStore/{your-feature-store-name}.
  2. Accédez à l’onglet feature set, sélectionnez l’ensemble de fonctionnalités approprié, puis accédez à la page de détails de l’ensemble de fonctionnalités.
  3. Dans la page détails de l’ensemble de fonctionnalités, sélectionnez l’onglet Materialization jobs, puis sélectionnez le travail ayant échoué pour l’ouvrir dans la vue détails du travail.
  4. Dans la vue détails du travail, sous la carte Properties, passez en revue l’état du travail et le message d’erreur.
  5. Vous pouvez également accéder à l’onglet Outputs + logs, puis rechercher le fichier stdout à partir du fichierlogs\azureml\driver\stdout.

Après avoir appliqué un correctif, vous pouvez déclencher manuellement une tâche de matérialisation de renvoi pour vérifier que le correctif fonctionne.

Configuration du magasin hors connexion non valide

Symptôme

Le travail de matérialisation échoue avec ce message d’erreur dans le fichierlogs/azureml/driver/stdout :

Caused by: Status code: -1 error code: null error message: InvalidAbfsRestOperationExceptionjava.net.UnknownHostException: adlgen23.dfs.core.windows.net
java.util.concurrent.ExecutionException: Operation failed: "The specified resource name contains invalid characters.", 400, HEAD, https://{storage}.dfs.core.windows.net/{container-name}/{fs-id}/transactions/1/_delta_log?upn=false&action=getStatus&timeout=90

Solution

Utilisez le Kit de développement logiciel (SDK) pour vérifier la cible de stockage hors connexion définie dans le magasin de fonctionnalités :


from azure.ai.ml import MLClient
from azure.ai.ml.identity import AzureMLOnBehalfOfCredential

fs_client = MLClient(AzureMLOnBehalfOfCredential(), featurestore_subscription_id, featurestore_resource_group_name, featurestore_name)

featurestore = fs_client.feature_stores.get(name=featurestore_name)
featurestore.offline_store.target

Vous pouvez également vérifier la cible de stockage hors connexion sur la page vue d’ensemble de l’interface utilisateur du magasin de fonctionnalités. Vérifiez que le stockage et le conteneur existent et que la cible a ce format :

/subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.Storage/storageAccounts/{storage}/blobServices/default/containers/{container-name}

L’identité de matérialisation ne dispose pas de l’autorisation RBAC appropriée sur le magasin de fonctionnalités

Symptôme :

Le travail de matérialisation échoue avec ce message d’erreur dans le fichier logs/azureml/driver/stdout :

Traceback (most recent call last):
  File "/home/trusted-service-user/cluster-env/env/lib/python3.8/site-packages/azure/ai/ml/_restclient/v2022_12_01_preview/operations/_workspaces_operations.py", line 633, in get
    raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat)
azure.core.exceptions.HttpResponseError: (AuthorizationFailed) The client 'XXXX' with object id 'XXXX' does not have authorization to perform action 'Microsoft.MachineLearningServices/workspaces/read' over scope '/subscriptions/XXXX/resourceGroups/XXXX/providers/Microsoft.MachineLearningServices/workspaces/XXXX' or the scope is invalid. If access was recently granted, please refresh your credentials.
Code: AuthorizationFailed

Solution :

Attribuez le rôle Azure Machine Learning Data Scientist sur le magasin de fonctionnalités à l’identité de matérialisation (identité managée affectée par l’utilisateur) du magasin de fonctionnalités.

Azure Machine Learning Data Scientist est un rôle recommandé. Vous pouvez créer votre propre rôle personnalisé avec ces actions :

  • Microsoft.MachineLearningServices/workspaces/datastores/listsecrets/action
  • Microsoft.MachineLearningServices/workspaces/featuresets/read
  • Microsoft.MachineLearningServices/workspaces/read

Pour plus d’informations, consultez la ressource Autorisations requises pour le rôle feature store materialization managed identity.

L’identité de matérialisation ne dispose pas de l’autorisation RBAC appropriée pour lire à partir du stockage

Symptôme

Le travail de matérialisation échoue avec ce message d’erreur dans le fichier logs/azureml/driver/stdout :

An error occurred while calling o1025.parquet.
: java.nio.file.AccessDeniedException: Operation failed: "This request is not authorized to perform this operation using this permission.", 403, GET, https://{storage}.dfs.core.windows.net/test?upn=false&resource=filesystem&maxResults=5000&directory=datasources&timeout=90&recursive=false, AuthorizationPermissionMismatch, "This request is not authorized to perform this operation using this permission. RequestId:63013315-e01f-005e-577b-7c63b8000000 Time:2023-05-01T22:20:51.1064935Z"
    at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem.checkException(AzureBlobFileSystem.java:1203)
    at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem.listStatus(AzureBlobFileSystem.java:408)
    at org.apache.hadoop.fs.Globber.listStatus(Globber.java:128)
    at org.apache.hadoop.fs.Globber.doGlob(Globber.java:291)
    at org.apache.hadoop.fs.Globber.glob(Globber.java:202)
    at org.apache.hadoop.fs.FileSystem.globStatus(FileSystem.java:2124)

Solution :

Attribuez le rôleStorage Blob Data Reader, sur le stockage source, à l’identité de matérialisation (identité managée affectée par l’utilisateur) du magasin de fonctionnalités.

Storage Blob Data Reader est la condition d’accès minimale recommandée. Vous pouvez également attribuer des rôles avec plus de privilèges (par exemple, Storage Blob Data Contributor ou Storage Blob Data Owner).

Pour plus d’informations sur la configuration RBAC, visitez la ressource Autorisations requises pour le rôle feature store materialization managed identity.

L’identité de matérialisation ne dispose pas de l’autorisation RBAC appropriée pour écrire des données dans le magasin hors connexion

Symptôme

Le travail de matérialisation échoue avec ce message d’erreur dans le fichier logs/azureml/driver/stdout :

An error occurred while calling o1162.load.
: java.util.concurrent.ExecutionException: java.nio.file.AccessDeniedException: Operation failed: "This request is not authorized to perform this operation using this permission.", 403, HEAD, https://featuresotrestorage1.dfs.core.windows.net/offlinestore/fs_xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_fsname/transactions/1/_delta_log?upn=false&action=getStatus&timeout=90
    at com.google.common.util.concurrent.AbstractFuture$Sync.getValue(AbstractFuture.java:306)
    at com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:293)
    at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:116)
    at com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly(Uninterruptibles.java:135)
    at com.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2410)
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2380)
    at com.google.common.cache.LocalCache$S

Solution

Attribuez le rôle Storage Blob Data Reader sur le stockage source à l’identité de matérialisation (identité managée affectée par l’utilisateur) du magasin de fonctionnalités.

Storage Blob Data Contributor est la condition d’accès minimale recommandée. Vous pouvez également attribuer des rôles avec plus de privilèges (par exemple, Storage Blob Data Owner).

Pour plus d’informations sur la configuration RBAC, visitez la ressource Autorisations requises pour le rôle feature store materialization managed identity.

La sortie du travail de diffusion en continu vers un notebook entraîne un échec

Symptôme :

Lors de l’utilisation du client CRUD du magasin de fonctionnalités pour diffuser en continu les résultats du travail de matérialisation vers un notebook à l’aide de fs_client.jobs.stream("<job_id>"), l’appel du SDK échoue avec une erreur.

HttpResponseError: (UserError) A job was found, but it is not supported in this API version and cannot be accessed.

Code: UserError

Message: A job was found, but it is not supported in this API version and cannot be accessed.

Solution :

Lorsque le travail de matérialisation est créé (par exemple, par un appel de remplissage), la tâche peut prendre quelques secondes pour que le travail s’initialise correctement. Réexécutez la commande jobs.stream() quelques secondes plus tard. Cela devrait résoudre le problème.

Configuration Spark invalide

Symptôme :

Un travail de matérialisation échoue avec ce message d’erreur :

Synapse job submission failed due to invalid spark configuration request

{

"Message":"[..] Either the cores or memory of the driver, executors exceeded the SparkPool Node Size.\nRequested Driver Cores:[4]\nRequested Driver Memory:[36g]\nRequested Executor Cores:[4]\nRequested Executor Memory:[36g]\nSpark Pool Node Size:[small]\nSpark Pool Node Memory:[28]\nSpark Pool Node Cores:[4]"

}

Solution :

Mettez à jour le materialization_settings.spark_configuration{} de l’ensemble de fonctionnalités. Assurez-vous que ces paramètres utilisent à la fois des quantités de mémoire et un nombre total de cœurs, ces deux valeurs devant être inférieures à ce que le type d’instance, tel que défini par materialization_settings.resource, fournit :

spark.driver.cores spark.driver.memory spark.executor.cores spark.executor.memory

Par exemple, pour le type d’instance standard_e8s_v3, cette configuration Spark est l’une des options valides :


transactions_fset_config.materialization_settings = MaterializationSettings(

    offline_enabled=True,

    resource = MaterializationComputeResource(instance_type="standard_e8s_v3"),

    spark_configuration = {

        "spark.driver.cores": 4,

        "spark.driver.memory": "36g",

        "spark.executor.cores": 4,

        "spark.executor.memory": "36g",

        "spark.executor.instances": 2

    },

    schedule = None,

)

fs_poller = fs_client.feature_sets.begin_create_or_update(transactions_fset_config)

Étapes suivantes