En tant que programmeur, les noyaux de datacenter ont écrit


Peu de gens croient que la pile moderne de science des données ne peut pas être construite sur Python, mais il existe de tels précédents :). La pile Odnoklassniki a été formée pendant de nombreuses années, principalement par des programmeurs qui sont passés à la science des données, mais est toujours restée proche du produit, elle est donc basée sur les technologies ouvertes de la pile JVM: Hadoop, Spark, Kafka, Cassandra, etc. Cela nous aide à réduire le temps et le coût de mise en service des modèles, mais cela crée parfois des difficultés. Par exemple, lors de la préparation de solutions de base pour les participants au SNA Hackathon 2019 , ils ont dû comprimer leur volonté et plonger dans le monde de la frappe dynamique. Détails (et pêche à la traîne facile) sous la coupe :)


L'installation



Il existe une sorte de python sur presque toutes les machines de développement. Il a été retrouvé sur le mien, déjà en double - 2.7 et 3.4. Après avoir fouillé dans les poubelles de la mémoire, je me suis souvenu avoir installé la version 3.4 il y a trois ans, après que les participants aient rencontré des problèmes épiques au SNA Hackathon 2016, essayant d'étendre un graphique d'un demi-gigaoctet en mémoire (à la suite d'une petite vidéo de formation et d'un concours séparé ), mais aujourd'hui c'est l'économie est déjà moralement obsolète et a besoin d'être mise à jour.


Dans le monde Java, chaque projet lors de l'assemblage indique tout ce qu'il souhaite incorporer en lui-même et continue de le faire. En théorie, tout est simple et beau, mais en pratique, lorsque vous avez besoin de la bibliothèque A et de la bibliothèque B, il s'avérera sûrement qu'ils ont tous les deux besoin de la bibliothèque C, avec deux versions incompatibles différentes :). En vain pour briser ce cercle vicieux, certaines bibliothèques regroupent toutes leurs dépendances en elles - mêmes et se cachent du reste, tandis que les autres tournent comme elles le peuvent.


Qu'est-ce qui se passe avec python? Il n'y a pas de projet en tant que tel, mais il y a un «environnement», et au sein de chaque environnement, un écosystème indépendant peut être formé à partir de packages de certaines versions. Dans le même temps, il existe des outils pour les paresseux , à l'aide desquels il n'est pas plus difficile de gérer l'environnement Python local, qu'un cluster hétérogène distribué de Clauder ou Horton. Mais les conflits mutuels entre les versions de packages n'iront nulle part. J'ai immédiatement fait face au fait que la version Pandas 0.24 a transféré la méthode privée _maybe_box_datetimelike à l'API publique, et soudainement, il s'est avéré que beaucoup de gens l'avaient utilisée dans sa forme précédente et sont maintenant tombés :) (et oui, dans Le monde Java est le même ). Mais à la fin, tout a été réparé, à part les terribles avertissements concernant les nouveaux depriycheyshin, cela a fonctionné.


Base de référence collaborative


image

Les tâches du SNA Hackathon 2019 sont divisées en trois domaines - recommandations sur les journaux, les textes et les images. Commençons par les journaux (spoiler - megapattern Cmd + C / Cmd + V avec stackoverflow fonctionne également avec python). Les données ont été collectées à partir d'une production en direct - chaque utilisateur au hasard, sans pesée, a été montré certains aliments de son environnement, après quoi tous les signes au moment du spectacle et la réaction finale ont été enregistrés dans le journal. La tâche du gâteau: nous prenons des pancartes, nous poussons dans une logg , profit!


Mais le plan a flashé au premier stade, sur la lecture des données. En théorie, il existe un merveilleux paquet Apache Arrow , qui était censé unifier le travail avec les données dans différents écosystèmes et, en particulier, permettre de lire les fichiers "parquet" en python sans étincelles. En pratique, cela s'est avéré. que même avec la lecture de structures imbriquées simples, il a des problèmes , et notre belle hiérarchie s'est transformée en une misère plate :(.


Mais il y avait des aspects positifs. Jupyter , en général, était content, il est presque aussi confortable, mais pas aussi joli que Zeppelin . Il y a même un noyau rock ! Eh bien, la vitesse de la régression logistique sur un petit morceau de données dans la mémoire a plu - elle n'atteint pas la puissance de l'option distribuée, mais elle apprend instantanément sur quatre signes et quelques centaines de milliers d'exemples.


Ensuite, cependant, l'enthousiasme qui a surgi a été durement touché: si la transformation des données nécessaire (grouper par clé et assembler dans une liste) n'est pas dans la liste standard et appliquer ou mapper apparaît, alors la vitesse diminue par ordre de grandeur. En conséquence, 80% du temps de la ligne de base ne consiste pas à lire les données, les jointures, la formation et le tri des modèles, mais la compilation banale de la liste.


Au fait, c'est précisément à cause de cette fonctionnalité que je suis toujours surpris par les utilisateurs de pySpark - après tout, presque toutes les fonctionnalités standard sont disponibles sous la forme de Spark SQL, qui est le même en python et rock, et après le premier yudf-in de type python avec quelque chose de personnel à dix cœurs le cluster se transforme en citrouille ...


Mais au final, tous les obstacles ont été surmontés et neuf points ont suffi pour marquer 0,65!


Ligne de base du texte



Eh bien, maintenant notre tâche est plus compliquée - si le logreg peut être trouvé dans des centaines d'implémentations pour toutes les plates-formes, alors il existe une plus grande variété d'outils pour travailler avec des textes sous python. Heureusement, les textes sont déjà envoyés non seulement sous forme brute, mais également traités par notre système de prétraitement régulier basé sur Spark et Lucene . Par conséquent, vous pouvez immédiatement prendre la liste des jetons et ne vous souciez pas de la tokenisation / lématisation / stemming.


Pendant un certain temps, j'ai douté de ce qu'il fallait prendre: BigARTM domestique ou Gensim importé. En conséquence, je me suis installé sur le second et j'ai copié le tutoriel doc2vec :). J'espère que les collègues de l'équipe BigARTM ne manqueront pas de saisir l'occasion et de montrer les avantages de leur bibliothèque lors du concours.


Nous avons à nouveau un plan simple: nous prenons tous les textes du test, formons le modèle Doc2Vec, puis le déduisons dans le train et apprenons le logreg sur ses résultats (l'empilage est notre tout!). Mais, comme d'habitude, les problèmes ont commencé tout de suite. Malgré la quantité relativement modeste de textes dans l'échantillon de formation (seulement un gigaoctet et demi), lorsqu'ils essayaient de les faire glisser dans la rampe, le python a mangé 20 (20 Karl!) Gigaoctets de mémoire, est entré dans un échange et n'est pas revenu. J'ai dû manger un éléphant en morceaux.


Lors de la lecture, nous indiquons toujours les colonnes à soulever du sol, ce qui nous permet de ne pas lire le texte brut en mémoire. Cela économise son utilisation de moitié, les documents de l'ensemble de test sont chargés dans la mémoire pour une formation sans problème. Avec un ensemble d'entraînement d'une telle astuce ne suffit pas, donc à la fois nous ne téléchargeons pas plus d'un fichier "parquet". De plus, dans le fichier téléchargé, nous ne laissons que l'ID des jours que nous voulons utiliser pour la formation, et nous les déduisons déjà sur eux.


La connexion en plus de cela fonctionne tout aussi rapidement, et à la fin, nous obtenons 14 paragraphes et obtenons un score de 0,54 :)


Ligne de base de l'image



Quoi de plus populaire que le deep learning? Seuls les chats! Par conséquent, pour l'image de base, nous avons fait un plan brillamment simple: exécutez un détecteur de chat sur les images de l'ensemble de test, puis classez le contenu en fonction du score :)


Et encore une fois, il y a beaucoup de choix. Classification ou détection? pyTorch ou Tensorflow? Le critère principal est la facilité de mise en œuvre par la méthode copier-coller. Et le gagnant est ... YOLOv3 sur MXNet :). La concision de leur démo a captivé à première vue, mais comme d'habitude, les problèmes ont commencé.


Avec quoi commence généralement le Big Data? Avec des estimations de performances et le temps machine nécessaire! Je voulais rendre la référence aussi autonome que possible, alors ils lui ont appris à travailler directement avec le fichier tar et ont rapidement réalisé qu'à une vitesse d'extraction de 200 photos par seconde de tar en tmpfs, il faudrait environ une demi-heure, les normes pour traiter 352758 images. Ajoutez le chargement et le prétraitement des photos - 100 par seconde, environ une heure pour tout, les normes. Ajoutez le calcul du réseau neuronal - 20 photos par seconde, 5 heures, eh bien ... ok Ajoutez l'extraction du résultat - 1 photo par seconde, semaine, WTF?


Après quelques heures de danse avec des tambourins, la compréhension vient que le NDArray que nous observons n'est jamais engourdi, mais la structure interne de MXNet, qui fait tous les calculs paresseusement. Bingo! Que faire? Tout diplomate débutant sait que tout dépend de la taille du lot! Si MXNet calcule le score paresseusement, alors si nous leur demandons d'abord quelques dizaines de photos, puis que nous commençons à les extraire, alors peut-être que le traitement des photos se fera par lots? Et oui, après avoir ajouté le batching à une vitesse de 10 photos par seconde, j'ai réussi à retrouver tous les chats :).


Ensuite, nous appliquons l'ingénierie bien connue et en 10 paragraphes, nous obtenons un score de 0,504 :).


Conclusions



Lorsqu'on a demandé à un sensei sage: "Qui va gagner, maître d'Aïkido ou karaté?", Il a répondu "Maître va gagner." Nous avons été amenés à peu près aux mêmes conclusions par cette expérience: il n'y a pas et ne peut pas être un langage idéal pour toutes les occasions. Avec Python, vous pouvez rapidement assembler une solution à partir de blocs prêts à l'emploi, mais essayer de vous en éloigner avec des quantités de données suffisamment importantes entraînera beaucoup de difficultés. En Java et Scala, vous pouvez également trouver de nombreux outils prêts à l'emploi et implémenter facilement vos propres idées, mais les langages eux-mêmes seront plus exigeants sur la qualité du code.


Et bien sûr, bonne chance à tous les membres du SNA Hackathon 2019 !

Source: https://habr.com/ru/post/fr439394/


All Articles