Cet article partage principalement la pratique de la plate-forme et l'expérience de construction de l'équipe du projet Alibaba Cloud FeatHub dans le développement de l'ingénierie des fonctionnalités.
Ce partage est divisé en quatre parties. La première partie présente généralement les scénarios, les objectifs, les points faibles et les défis rencontrés par FeatHub dans le processus de développement, de déploiement, de surveillance et de partage de fonctionnalités ; . et les concepts de base associés ; la troisième partie présente l'utilisation de base des API, les fonctions informatiques de base et les pratiques de code d'exemples de scénarios lors de l'utilisation de FeatHub, ainsi que l'optimisation des performances, les objectifs d'expansion futurs et la co-construction de l'open. communauté source, fournissant le projet Pour apprendre, développer et utiliser, nous partagerons également la fonction de lecture des données historiques de FeatHub, la prise en charge du traitement hors ligne, quasi-ligne et en ligne et la prise en charge des composants en amont et en aval d'Alibaba Cloud.
La plupart des programmes d'inférence et de formation d'apprentissage automatique populaires d'aujourd'hui sont essentiellement écrits par des scientifiques de données utilisant Python Written. par, par exemple, les populaires TensorFlow, PyTorch et scikit-learn utilisés dans certains scénarios d'apprentissage automatique traditionnels, etc. Nous espérons aider les data scientists à continuer à utiliser Python familier pour écrire du code d'ingénierie de fonctionnalités afin de terminer le développement et le déploiement de liens d'apprentissage automatique de bout en bout, et à utiliser les bibliothèques de l'écosystème Python qu'ils connaissent.
De plus en plus d'applications d'apprentissage automatique se développent dans le sens du temps réel, et l'efficacité et la précision de l'apprentissage automatique peuvent être améliorées grâce au traitement en temps réel. Pour atteindre cet objectif, des fonctionnalités en temps réel doivent être générées. Il ne s’agit pas seulement d’obtenir des fonctionnalités de requête en temps réel, mais également de générer des fonctionnalités en temps réel. Par exemple, si vous devez obtenir le nombre de clics des utilisateurs au cours des deux dernières minutes en temps réel, vous devez utiliser un moteur informatique de streaming pour effectuer les calculs de fonctionnalités en temps réel.
De plus en plus de petites et moyennes entreprises espèrent réaliser un déploiement multi-cloud pour obtenir des garanties de sécurité de production et obtenir des avantages en matière d'appels d'offres parmi les fournisseurs de cloud. Par conséquent, notre solution n'exige pas que les utilisateurs se lient à un fournisseur de cloud, mais permet aux utilisateurs de choisir librement entre différents fournisseurs de cloud, et même de déployer des opérations d'ingénierie de fonctionnalités dans des cloud privés.
Voici quelques-unes des conditions que le projet FeatHub espérait remplir lors de sa création.
Aujourd'hui, de nombreuses entreprises développent des opérations d'ingénierie de fonctionnalités en temps réel. Il existe certains problèmes qui couvrent l'ensemble du cycle de vie des fonctionnalités, y compris le développement, le déploiement, la surveillance et le partage ultérieur.
① Traversée des fonctionnalités
Dans la phase de développement, le cadre de fonctionnalités en temps réel Apache Flink est principalement utilisé, car Flink est fondamentalement la norme de facto pour le calcul de flux en temps réel, mais en utilisant Flink ou Il est nécessaire de résoudre la difficulté de traversée des fonctionnalités lors de l'utilisation d'un cadre similaire pour développer des fonctionnalités en temps réel. De nombreux data scientists n'ont pas l'expérience nécessaire pour résoudre la traversée de fonctionnalités, et il faut beaucoup de temps et d'argent pour résoudre de tels problèmes, ce qui constitue le principal problème de la phase de développement.
① Une traduction manuelle est requise
De nombreuses entreprises disposeront d'une équipe de plate-forme dédiée pour traduire les tâches Python à processus unique écrites par des data scientists en tâches Flink ou Spark qui peuvent être exécutées de manière distribuée pour atteindre des performances élevées Déploiement hautement disponible. Son processus de traduction augmentera la durée de tout le cycle de vie du développement. Et comme cela nécessite une main d’œuvre supplémentaire pour effectuer le travail de traduction, cela augmente les coûts de développement et entraîne en outre la possibilité d’introduire des bugs. La logique après qu'un autre groupe de personnes traduise le travail des data scientists peut ne pas être cohérente avec la logique d'origine, ce qui entraînera une charge de travail de débogage plus importante.
① Modifications dans la distribution des fonctionnalités
La qualité et l'efficacité globales du travail d'ingénierie des fonctionnalités dépendent non seulement de la présence ou non de bogues dans le travail, mais dépendent également de la distribution numérique des données d'entrée en amont répondant à certaines caractéristiques, comme la proximité de la distribution numérique des données pendant la formation. Les performances d'inférence de nombreuses tâches diminuent, souvent en raison de changements dans la distribution des données produites par les tâches en amont. Dans ce cas, les développeurs doivent suivre l'intégralité du lien, segment par segment, pour voir où la distribution des données de fonctionnalités a changé et voir si un recyclage ou des corrections de bogues sont nécessaires en fonction de la situation spécifique. La charge de travail excessive de cette partie du personnel est également un problème.
① Duplication du travail de développement
Bien que les équipes de développement et les scénarios de nombreux travaux de calcul de fonctionnalités soient différents, des définitions de fonctionnalités similaires ou même identiques sont en réalité utilisées. De nombreuses entreprises ne disposent pas d'un bon canal permettant aux différentes équipes au sein de l'entreprise d'interroger et de réutiliser les fonctionnalités existantes. Cela oblige souvent différentes équipes à effectuer des développements répétés, et même à exécuter des tâches à plusieurs reprises pour générer certaines fonctionnalités pour les mêmes fonctionnalités. Cela entraîne un gaspillage de main d'œuvre et de ressources de calcul/stockage, car plus de calcul, de mémoire et d'espace de stockage sont nécessaires pour générer les mêmes fonctionnalités.
② Sémantique correcte à un moment donné
Afin que tout le monde comprenne ce qu'est le traversage de fonctionnalités, la figure ci-dessus donne un exemple simple pour montrer ce problème. Le tableau en haut à gauche de la figure est une caractéristique comportementale de l'utilisateur, qui exprime le nombre de clics au cours des deux dernières minutes pour un utilisateur avec un identifiant donné à différents nœuds temporels. Ce nombre de clics peut nous aider à déterminer si un utilisateur cliquera sur une annonce. Afin d'utiliser ces fonctionnalités pour la formation, il est généralement nécessaire de regrouper les fonctionnalités dans certains ensembles de données utilisateur avec des étiquettes. Le tableau en bas à gauche de la figure montre un ensemble de données de certains échantillons positifs et négatifs indiquant si un utilisateur a réellement cliqué sur la publicité, marquant les échantillons positifs ou négatifs générés par l'utilisateur à différents moments. Afin de fusionner les fonctionnalités de ces deux ensembles de données pour former un ensemble de données de formation, il est généralement nécessaire de fusionner les fonctionnalités en fonction de l'ID utilisateur comme clé. Si vous effectuez simplement une jointure de table sans tenir compte de l'horodatage, des problèmes de croisement de fonctionnalités peuvent survenir. Par exemple, à 6h03 minutes, le nombre de clics de l'utilisateur au cours des 2 dernières minutes devrait être de 10, mais la valeur de fonctionnalité obtenue par épissage peut être de 6 à partir de 7h00. Ce type de croisement de fonctionnalités entraînera une diminution de l’effet de raisonnement réel. Un résultat de jointure avec une sémantique correcte à un moment précis doit être tel qu'indiqué dans la figure ci-dessous :
Afin d'éviter le croisement de fonctionnalités lors de l'épissage des échantillons, pour chaque élément de données dans le tableau de gauche dans la figure ci-dessus, il devrait être dans la table des dimensions Parmi les fonctionnalités de plusieurs versions, recherchez la valeur de la fonctionnalité dont l'horodatage est plus petit et le plus proche de l'horodatage dans le tableau de gauche, et insérez-la dans l'ensemble de données d'entraînement généré final. Une telle concaténation avec une sémantique correcte à un moment donné produira l'ensemble de données d'entraînement illustré sur le côté droit de la figure ci-dessus. Pour différents moments, des valeurs de caractéristiques correspondantes sont générées au cours des deux dernières minutes. L'ensemble de données de formation généré de cette manière peut améliorer les performances de la formation et de l'inférence. 3. Scénarios de base du Feature Store
Ensuite, FeatHub en tant que Feature Store sera présenté, les problèmes qu'il tente de résoudre et les outils qu'il fournit à chaque étape de l'ensemble du cycle de développement des fonctionnalités.
(1) Développement de fonctionnalitésDans la phase de développement de fonctionnalités, FeatHub fournira un SDK très facile à utiliser basé sur Python, permettant aux utilisateurs d'exprimer de manière concise la logique de calcul des fonctionnalités. Le calcul des fonctionnalités est essentiellement l’ETL d’une fonctionnalité. La chose la plus importante pendant la phase de développement est la facilité d’utilisation et la simplicité du SDK. (2) Déploiement de fonctionnalitésDans la phase de déploiement de fonctionnalités, FeatHub fournira un moteur d'exécution pour mettre en œuvre le déploiement d'une logique de calcul de fonctionnalités hautes performances et à faible latence, et pourra se connecter à différents magasins de fonctionnalités. La chose la plus importante dans la phase de déploiement est la performance du moteur d'exécution et la possibilité de connecter différents magasins de fonctionnalités.Dans la phase de surveillance des fonctionnalités, afin de permettre aux développeurs de détecter rapidement les changements dans la distribution de la valeur des fonctionnalités et d'y répondre, FeatHub générera à l'avenir des indicateurs communs pour couvrir les problèmes courants de qualité des fonctionnalités, tels que les fonctionnalités avec des valeurs illégales. Des proportions, ou moyennes de caractéristiques, et des alarmes sont émises sur la base de ces indicateurs pour informer rapidement la personne responsable d'enquêter sur les causes des changements dans la distribution des caractéristiques pertinentes et de prendre des réponses pour maintenir l'effet des liens recommandés de bout en bout.
Dans la phase de partage de fonctionnalités, FeatHub fournira à l'avenir des fonctionnalités d'enregistrement et de recherche de fonctionnalités, permettant aux développeurs de différentes équipes au sein de la même entreprise de demander si les fonctionnalités qu'ils souhaitent existent déjà et de les réutiliser. Définitions de fonctionnalités et des données de fonctionnalités générées.
L'image ci-dessus illustre les principales fonctionnalités de FeatHub. Pendant la phase de développement, FeatHub peut fournir un SDK facile à utiliser qui prend en charge l'épissage de fonctionnalités, l'agrégation de fonctionnalités et d'autres logiques avec une sémantique correcte à un moment précis. Pendant la phase de déploiement, FeatHub peut prendre en charge la génération de fonctionnalités à haut débit et à faible latence, prendre en charge l'utilisation de Flink comme moteur d'exécution pour calculer les fonctionnalités et prendre en charge plusieurs systèmes de stockage de fonctionnalités, permettant aux utilisateurs de choisir librement le type de stockage qu'ils souhaitent utiliser. Pendant la phase de surveillance, FeatHub sera en mesure de fournir des indicateurs en temps réel pour surveiller les changements dans la distribution des fonctionnalités, y compris une surveillance hors ligne et en temps réel, afin de permettre aux développeurs de détecter les problèmes en temps opportun. Lors de la phase de partage, FeatHub fournira une interface utilisateur Web et un SDK faciles à utiliser pour aider les développeurs à enregistrer, rechercher et réutiliser des fonctionnalités.
Il existe déjà quelques projets Feature Store représentatifs dans le domaine du Feature Store, tels que Feathr, qui a été open source par LinkedIn au début de cette année, et Feast, qui est open source depuis de nombreuses années. Nous avons étudié ces projets et constaté qu'ils n'étaient pas bien adaptés pour réaliser les scénarios cibles que nous avions proposés.
Par rapport aux solutions existantes, FeatHub apporte une valeur supplémentaire, notamment :
① SDK Python simple et facile à utiliser. Le SDK de FeatHub fait référence aux SDK des projets Feature Store existants, prend en charge les fonctions principales de ces projets et améliore encore les capacités d'abstraction et la facilité d'utilisation du SDK
② prend en charge le développement et les expériences sur une seule machine. Les développeurs n'ont pas besoin de se connecter à des clusters Flink ou Spark distribués pour exécuter des expériences, mais doivent uniquement utiliser les ressources CPU ou mémoire d'une seule machine pour mener le développement et les expériences, et peuvent utiliser des bibliothèques d'algorithmes d'apprentissage automatique sur une seule machine, telles que scikit-learn.
③ Vous pouvez changer de moteur d'exécution sans modifier le code. Une fois que l'utilisateur a terminé le développement sur une seule machine, il peut passer du moteur d'exécution sur une seule machine à un moteur d'exécution distribué tel que Flink ou Spark sans modifier le code exprimant la logique de calcul des fonctionnalités. L'utilisation de Flink comme moteur d'exécution permet à Feathhub de prendre en charge des calculs de fonctionnalités en temps réel à haut débit et à faible latence. FeatHub prendra davantage en charge l'utilisation de Spark comme moteur d'exécution à l'avenir, permettant aux utilisateurs d'obtenir des performances de débit potentiellement meilleures dans des scénarios hors ligne et de choisir librement le moteur d'exécution le plus approprié en fonction du scénario.
④ Fournit les capacités d'extension du moteur d'exécution. FeatHub prend non seulement en charge Flink et Spark en tant que moteurs d'exécution, mais aide également les développeurs à personnaliser les moteurs d'exécution et à utiliser les moteurs d'exécution développés en interne par l'entreprise pour les fonctionnalités ETL.
⑤ Le code est open source, permettant aux utilisateurs de choisir librement le fournisseur de cloud pour déployer FeatHub, ou de le déployer dans un cloud privé.
Ce qui précède est un schéma d'architecture contenant les principaux modules de FeatHub. La couche supérieure fournit un ensemble de SDK Python pour prendre en charge les sources de données définies par l'utilisateur, les points finaux de données et la logique de calcul des fonctionnalités. Les fonctionnalités définies par le SDK peuvent être enregistrées dans le centre de métadonnées des fonctionnalités, permettant ainsi à d'autres utilisateurs et tâches d'interroger et de réutiliser les fonctionnalités, et même d'analyser plus en détail le lignage des fonctionnalités en fonction des métadonnées des fonctionnalités. La définition de la fonctionnalité inclut la source et le récepteur de la fonctionnalité, ainsi que la logique de calcul commune, telle que les appels UDF, l'épissage des fonctionnalités, l'agrégation basée sur des fenêtres superposées et des fenêtres glissantes, etc. Lorsqu'il est nécessaire de générer des fonctionnalités définies par l'utilisateur, FeatHub fournira des processeurs de fonctionnalités intégrés, c'est-à-dire des moteurs d'exécution, pour exécuter la logique de calcul des fonctionnalités existantes. Lorsque les utilisateurs doivent effectuer des expériences sur une seule machine, ils peuvent utiliser le processeur local pour utiliser les ressources de la seule machine sans se connecter à un cluster distant. Lorsque vous avez besoin de générer des fonctionnalités en temps réel, vous pouvez utiliser le processeur Flink pour effectuer des calculs de fonctionnalités de streaming à haut débit et à faible latence.
À l'avenir, un service de fonctionnalités similaire à la fonction Lambda pourra également être pris en charge pour implémenter le calcul de fonctionnalités en ligne, et il pourra être connecté à Spark pour effectuer un calcul de fonctionnalités hors ligne à haut débit. Le moteur d'exécution peut s'interfacer avec différents systèmes de stockage de fonctionnalités hors ligne et en ligne, tels que l'utilisation de Redis pour le stockage de fonctionnalités en ligne, HDFS pour le stockage de fonctionnalités hors ligne et Kafka pour le stockage de fonctionnalités en ligne.
La figure ci-dessus montre comment FeatHub est utilisé par les utilisateurs et se connecte aux programmes de formation et d'inférence d'apprentissage automatique en aval. Les utilisateurs ou les développeurs exprimeront les fonctionnalités qu'ils souhaitent calculer via le SDK, puis les soumettront au moteur d'exécution. déploiement. Une fois les fonctionnalités calculées, elles doivent être exportées vers des magasins de fonctionnalités, tels que Redis et HDFS. Un programme de formation hors ligne d'apprentissage automatique peut lire directement les données dans HDFS pour une formation par lots. Un programme d'inférence d'apprentissage automatique en ligne peut lire directement les données dans Redis pour une inférence en ligne.
L'image ci-dessus montre la relation entre les concepts de base de FeatHub. Un TableDescriptor représente une collection de fonctionnalités. TableDescriptor peut produire un nouveau TableDescriptor par transformation logique.
TableDescriptor est divisé en deux catégories. FeatureTable exprime une table avec une adresse physique spécifique, par exemple, il peut s'agir d'une table dans Redis ou d'une table dans HDFS. Les FeatureViews sont des tables logiques qui n'ont pas nécessairement d'adresses physiques. Elles sont généralement obtenues à partir d'un FeatureTable après une série de conversions de chaînes logiques.
FeatureView a les 3 sous-classes suivantes :
① DerivedFeatureView Les lignes de la table des fonctionnalités de sortie et de sa table des fonctionnalités d'entrée (c'est-à-dire la source) sont essentiellement un à un. Il peut prendre en charge l'expression d'une logique de conversion sur une seule ligne (par exemple, addition, soustraction, multiplication et division), sur une logique d'agrégation de fenêtres et une logique d'épissage de fonctionnalités. Il peut être utilisé pour générer des données de formation. Par exemple, dans l'exemple présenté précédemment, si vous devez fusionner des échantillons d'entraînement avec des fonctionnalités de différentes tables de dimensions pour obtenir des données d'entraînement réelles, vous pouvez utiliser DerivedFeatureView pour effectuer cette opération.
② SlidingFeatureView prend en charge l'expression de caractéristiques calculées par des fenêtres coulissantes. Les lignes de la table de fonctionnalités qu'il génère et de la table de fonctionnalités qu'il entre ne sont pas nécessairement identiques. En effet, les valeurs des caractéristiques calculées par la fenêtre glissante changeront avec le temps même s'il n'y a pas de nouvelle entrée. SlidingFeatureView peut être utilisé pour conserver les fonctionnalités générées en temps réel et les exporter vers un magasin de fonctionnalités en ligne, tel que Redis, pour une inférence en ligne. Par exemple, nous pouvons utiliser SlidingFeatureView pour calculer le nombre de fois que chaque utilisateur clique sur une certaine page Web au cours des deux dernières minutes et mettre à jour la valeur de la fonctionnalité vers Redis en temps réel. Le lien de recommandation publicitaire peut ensuite interroger la valeur de cette fonctionnalité. en ligne pour un raisonnement en ligne.
③ OnDemandFeatureView peut être utilisé avec Feature Service pour prendre en charge le calcul des fonctionnalités en ligne. Par exemple, lors de l'utilisation d'Amap, les développeurs peuvent souhaiter calculer la vitesse et la direction du mouvement de l'utilisateur en fonction de son emplacement physique actuel et de son emplacement physique au moment de l'envoi de la dernière demande, après réception de la demande de l'utilisateur, pour faciliter les recommandations d'itinéraire. décisions. Ces fonctionnalités doivent être calculées en ligne dès réception d’une demande utilisateur. OnDemandFeatureView peut être utilisé pour prendre en charge de tels scénarios.
Transform exprime la logique de calcul des fonctionnalités. FeatHub prend actuellement en charge les 5 types de logique de calcul de fonctionnalités suivants :
① Expression permet aux utilisateurs d'exprimer une seule ligne de logique de calcul de fonctionnalités basée sur un langage DSL. Sa capacité d'expression est proche de l'instruction select du langage SQL et peut prendre en charge l'addition, la soustraction, la multiplication et la division ainsi que les appels de fonctions intégrés, permettant aux développeurs familiarisés avec SQL de démarrer rapidement.
② Join exprime la logique d'épissage des fonctionnalités. Les développeurs peuvent spécifier des informations telles que le nom de la table de dimensions et le nom des fonctionnalités à épisser.
③ PythonUDF Prend en charge les fonctions Python définies par l'utilisateur pour calculer les fonctionnalités.
④ OverWindow exprime la logique d'agrégation Over window. Par exemple, lors de la réception d'une ligne de données, l'utilisateur souhaite agréger les 5 lignes de données précédentes et calculer combien d'éléments de données correspondent à une certaine règle.
⑤ SlidingWindow exprime la logique d'agrégation de fenêtres glissantes.
Comme vous pouvez le voir sur la figure ci-dessus, généralement un travail ETL de fonctionnalités lira les fonctionnalités de la table source des fonctionnalités, générera de nouvelles fonctionnalités via plusieurs logiques de calcul de fonctionnalités et affichera les fonctionnalités générées dans la table des résultats des fonctionnalités. La table source de fonctionnalités peut être connectée à différents magasins de fonctionnalités, tels que FileSystem, Kafka, Hive, etc. De même, la table des résultats des fonctionnalités peut également être connectée au stockage de fonctionnalités tel que FileSystem, Kafka et Redis.
Processor comprend LocalProcessor, FlinkProcessor et SparkProcessor, qui peuvent utiliser des ressources physiques autonomes, un cluster Flink distribué et un cluster Spark distribué pour exécuter une logique de calcul de fonctionnalités définie par l'utilisateur.
Après avoir présenté l'architecture et les concepts de base de FeatHub, nous utiliserons quelques exemples de programmes pour démontrer l'expressivité et la facilité d'utilisation du SDK FeatHub. Pour le SDK de développement de fonctionnalités, sa capacité principale est de savoir comment exprimer une nouvelle logique de calcul de fonctionnalités. Le SDK FeatHub prend en charge l'épissage de fonctionnalités, l'agrégation de fenêtres, les appels de fonctions intégrés et les fonctionnalités Python personnalisées. À l'avenir, il prendra également en charge les appels UDF basés sur JAVA ou C++.
L'image ci-dessus montre un extrait de code d'épissage de fonctionnalités. Dans cet exemple, on suppose qu'il existe des échantillons de données positifs et négatifs originaux dans HDFS, qui enregistrent le comportement d'achat de l'utilisateur. Nous aimerions obtenir davantage le prix du produit lorsque l'utilisateur achète chaque produit. Une table price_updates conserve les données sur les changements de prix des produits. Chaque fois que le prix du produit change, une ligne de données sera générée dans la table price_updates, y compris l'ID du produit et le dernier prix du produit. Nous pouvons utiliser JoinTransform et définir table_name=price_updates, feature_name=price et key=item_id pour exprimer la logique d'épissage des fonctionnalités correspondante. De cette façon, FeatHub peut trouver la ligne avec l'item_id donné dans price_updates et trouver la valeur de prix la plus appropriée en fonction de l'horodatage pour la fusionner dans l'exemple de table de données.
L'extrait de code pour l'agrégation Over window montre comment utiliser OverWindowTransform pour calculer les fonctionnalités. Les utilisateurs peuvent utiliser expr=”item_counts * price” et agg_fun=”SUM” pour calculer la consommation totale dans la dernière fenêtre horaire en fonction de la quantité et du prix des articles achetés. La durée de la fenêtre est de 2 minutes. group_by_keys=["user_id"] signifie que nous calculerons la consommation totale correspondante séparément pour chaque utilisateur.
L'agrégation par fenêtre coulissante est similaire à l'agrégation par fenêtre. La seule différence dans l'API est que step_size peut être spécifié en plus. Si step_size=1 minute, la fenêtre glissera et générera de nouvelles valeurs de fonctionnalités chaque minute.
Des extraits de code pour les appels de fonctions intégrés montrent comment utiliser le langage DSL pour exprimer les appels d'addition, de soustraction, de multiplication, de division et UDF. Supposons que les données d'entrée contiennent des horodatages indiquant le moment où les taxis prennent et déposent les passagers. Nous pouvons convertir l'horodatage de prise en charge et de dépôt des passagers en une heure de type entier en appelant la fonction intégrée UNIX_TIMESTAMP, puis soustraire l'heure obtenue pour obtenir la durée de chaque voyage, qui peut être utilisée comme fonctionnalité. pour une formation et une inférence ultérieures.
Dans l'extrait de code appelé par PythonUDF, l'utilisateur peut personnaliser une fonction Python pour effectuer un traitement arbitraire sur les fonctionnalités d'entrée, comme la génération de chaînes minuscules.
Grâce aux extraits de code ci-dessus, nous pouvons voir que l'API de FeatHub est relativement simple et facile à utiliser. Les utilisateurs doivent uniquement définir les paramètres nécessaires à la logique de calcul sans connaître les détails du moteur de traitement.
Dans l'exemple de scénario ci-dessus, l'utilisateur dispose de deux sources de données. Ses événements d'achat contiennent des exemples de données de produits achetés par les utilisateurs, qui peuvent provenir de Kafka ou de FileSystem ; les événements de prix des articles contiennent des données sur les changements de prix des produits. Chaque fois que le prix d'un article change, une ligne de données sera générée dans les événements de prix de l'article, y compris l'ID de l'article et le dernier prix de l'article. Nous espérons que pour chaque échantillon de données d'un utilisateur achetant un produit, nous pourrons calculer la consommation totale de l'utilisateur au cours des deux dernières minutes au cours desquelles le comportement s'est produit, et l'utiliser comme fonctionnalité pour aider à déduire si l'utilisateur achètera un certain produit. . Afin de générer cette fonctionnalité, vous pouvez utiliser la logique de calcul décrite dans la figure ci-dessus pour d'abord relier la fonctionnalité de prix dans les événements de prix d'article aux événements d'achat en utilisant item_id comme join_key. Ensuite, agrégez en fonction de la fenêtre de temps et en utilisant user_id comme group_by _keys pour calculer la consommation totale de chaque utilisateur au cours des deux dernières minutes.
L'extrait de code ci-dessus montre les étapes à suivre pour un exemple d'application FeatHub.
① Tout d'abord, l'utilisateur doit créer un FeatHubClient et définir le type de processeur. S'il s'agit d'une expérience locale, elle peut être définie sur Local. S'il s'agit d'un déploiement de production distribuée à distance, elle peut être définie sur Flink.
② Les utilisateurs doivent créer une source pour lire les données. Par exemple, vous pouvez utiliser FileSystemSource pour lire des données dans un système de stockage hors ligne, ou utiliser KafkaSource pour lire des données en temps réel dans un système de stockage en ligne. Dans FileSystemSource, les utilisateurs peuvent spécifier des informations telles que data_format, schéma, emplacement du fichier, etc. Il convient de noter que les utilisateurs peuvent fournir time_stamp_field et time_stamp_format pour exprimer respectivement la colonne représentant l'heure dans la table source de données et le format d'analyse correspondant. FeatHub utilisera ces informations pour effectuer des calculs de fonctionnalités corrects à un moment précis afin d'éviter les problèmes de croisement de fonctionnalités.
③ Les utilisateurs peuvent créer un FeatureView pour exprimer la logique de l'épissage et de l'agrégation des fonctionnalités. Si vous souhaitez épisser, l'utilisateur peut utiliser item_price_events.price pour exprimer les fonctionnalités que vous souhaitez épisser. FeatHub trouvera la table nommée item_price_events et en obtiendra la fonctionnalité nommée price. Les utilisateurs peuvent également utiliser OverWindowTransform pour terminer l'agrégation sur fenêtre et définir une caractéristique nommée total_payment_last_two_minutes. Où window_size=2 minutes signifie appliquer l’expression spécifiée et la fonction d’agrégation pour calculer les caractéristiques des données dans un délai de deux minutes.
④ Pour le FeatureView défini, si l'utilisateur souhaite développer et expérimenter localement, et utiliser la bibliothèque d'algorithmes scikit-learn pour s'entraîner sur une seule machine, l'API to_pandas() peut être utilisée pour obtenir les données dans Pandas. Format DataFrame sur une seule machine en mémoire.
⑤ Lorsque les utilisateurs doivent terminer le déploiement de fonctionnalités en production, ils peuvent utiliser FileSystemSink pour spécifier le stockage de fonctionnalités hors ligne pour stocker les données. Appelez ensuite execute_insert() pour afficher les fonctionnalités vers le récepteur spécifié.
La valeur fondamentale de FeatHub est de fournir un SDK pour faciliter le développement de fonctionnalités par les utilisateurs et un moteur d'exécution pour calculer les fonctionnalités. De plus, FeatHub fournira également une optimisation des performances du moteur d'exécution, permettant aux utilisateurs de bénéficier de plus d'avantages pendant la phase de déploiement des fonctionnalités. Par exemple, pour les fonctionnalités basées sur l'agrégation de fenêtres glissantes, si vous utilisez actuellement l'API Flink native pour calculer, Flink affichera la valeur de fonctionnalité correspondante à chaque step_size glissant, que la valeur de fonctionnalité ait changé ou non. Pour une fenêtre glissante avec window_size=1 hour et step_size=1 seconde, Flink peut générer la même valeur de fonctionnalité dans la plupart des cas. Cela gaspillera le trafic réseau, le stockage en aval et d’autres ressources. FeatHub aide les utilisateurs à configurer le comportement de la fenêtre coulissante, permettant à la fenêtre coulissante de générer uniquement des fonctionnalités lorsque la valeur de la fonctionnalité change afin d'optimiser l'utilisation des ressources du travail de calcul des fonctionnalités.
De plus, FeatHub optimisera davantage l'utilisation de la mémoire et du processeur des fenêtres coulissantes. Dans certains scénarios, les utilisateurs optent pour de nombreuses fonctionnalités de fenêtre coulissante similaires. Ces fonctionnalités diffèrent uniquement par la taille de la fenêtre. Par exemple, nous souhaitons peut-être obtenir le montant total dépensé par chaque utilisateur en achats au cours des dernières 1 minute, 5 minutes et 10 minutes. Si l'API Flink native est utilisée pour le calcul, la tâche peut utiliser trois opérateurs d'agrégation pour calculer ces trois fonctionnalités respectivement. Chaque opérateur d'agrégation aura un espace mémoire distinct. Étant donné que les données et la logique de calcul traitées par ces opérateurs se chevauchent largement, FeatHub peut utiliser un opérateur personnalisé pour compléter uniformément le calcul de ces fonctionnalités afin d'atteindre l'objectif d'économie de mémoire et de ressources CPU.
FeatHub est actuellement open source sur GitHub et peut prendre en charge certaines fonctions de base de LocalProcessor et FlinkProcessor. Nous améliorerons encore les fonctions de base de FeatHub pour faciliter le développement et la mise en œuvre de l'ingénierie des fonctionnalités utilisateur. Il s'agit notamment de la prise en charge du stockage hors ligne et du stockage en ligne les plus couramment utilisés, de l'amarrage avec Notebook, de la fourniture d'une interface utilisateur Web pour visualiser les métadonnées des fonctionnalités, de l'assistance aux utilisateurs pour l'enregistrement, la recherche et la réutilisation des fonctionnalités, et de la prise en charge de l'utilisation de Spark comme moteur d'exécution de FeatHub.
Base de code FeatHub : https://github.com/alibaba/FeatHub
Exemples de code FeatHub : https://github.com/flink-extended/FeatHub-examples
La base de code FeatHub est actuellement placée dans le répertoire github/alibaba. Afin de permettre à chacun d'apprendre plus facilement à utiliser FeatHub et de trouver et de s'y référer rapidement des extraits de code qui répondent aux besoins des scénarios requis, nous fournissons des exemples de code supplémentaires dans la bibliothèque de code flink-extended/feathub-examples, que vous pouvez utiliser et essayer librement. Tout le monde est invité à fournir des commentaires et à contribuer aux relations publiques.
A1 : En principe, même si les données ne sont pas en désordre, si le champ d'horodatage n'est pas pris en compte lors de l'adhésion, cela peut conduire à un désordre. Dans des scénarios réels, les données sources peuvent également être en panne. À l'heure actuelle, vous pouvez utiliser une stratégie de filigrane similaire à celle de Flink pour attendre les données arrivant tardivement et réduire l'impact du désordre. De plus, nous pouvons utiliser des tâches hors ligne régulières pour remplir les données des fonctionnalités en ligne, réduisant ainsi davantage l'impact du désordre des données.
A2 : L'API FeatHub peut prendre en charge la lecture, mais cette partie de la fonction n'a pas encore été vérifiée en production. FeatHub prendra en charge l'utilisation de Flink et Spark comme moteurs d'exécution, afin que les capacités informatiques de Flink et Spark puissent être réutilisées pour terminer la lecture des données historiques. Par exemple, nous pouvons démarrer une tâche Spark, définir la source pour traiter toutes les données sur HDFS au cours du mois dernier, exécuter la logique d'épissage et d'agrégation des fonctionnalités définie, puis générer les fonctionnalités calculées.
A3 : Le calcul des fonctionnalités est divisé en hors ligne, en ligne et en ligne Flink est un moteur d'exécution en ligne qui peut calculer des fonctionnalités telles que le nombre de clics de l'utilisateur au cours des 5 dernières minutes en temps réel. prendre en charge les calculs hors ligne. Par conséquent, FeatHub peut prendre en charge les calculs de fonctionnalités hors ligne et quasi-ligne. FeatHub prévoit de prendre en charge le calcul de fonctionnalités en ligne à l'avenir, en utilisant une architecture basée sur Feature Service pour calculer les fonctionnalités exprimées par OnDemandFeatureView.
A4 : FeatHub prendra en charge tous les Source/Sink pris en charge par Flink, y compris ODPS, Holo et d'autres services fournis par Alibaba Cloud. Actuellement, FeatHub ne prend en charge que Kafka et FileSystem. Nous ajouterons progressivement davantage de support de stockage.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!