L'autre jour, nous avons décidé de parler avec Dmitry Bugaychenko ( dmitrybugaychenko ), l'un de nos professeurs du programme d'analyse de données sur Scala, et de discuter avec lui des problèmes réels d'utilisation de Scala dans les tâches de science des données et d'ingénierie des données. Dmitry est ingénieur analytique à Odnoklassniki.

- Dima, tu travailles à Odnoklassniki. Dites-moi, que faites-vous là-bas?
À Odnoklassniki, j'ai commencé à travailler en 2011 sur un projet de recommandation musicale. C'était une tâche très intéressante et difficile - la plupart des services de recommandation musicale à cette époque étaient basés sur du contenu de publication bien catalogué, alors que nous avions un vrai UGC (contenu généré par l'utilisateur), qui devait d'abord être peigné et trié en étagères. En général, le système résultant s'est révélé assez bon et ils ont décidé d'étendre l'expérience à d'autres sections du site: recommandations de groupe, amitiés, classement du flux, etc. Parallèlement, l'équipe s'est agrandie, l'infrastructure s'est développée, de nouveaux algorithmes et technologies ont été introduits. Maintenant, j'ai un éventail assez large de responsabilités: coordination des données des scientifiques, développement de l'infrastructure DS, projets de recherche, etc.
- Depuis combien de temps utilisez-vous Spark? Quel est le besoin?
Les premières tentatives de se faire des amis avec Spark remontaient à 2013, mais sans succès. Nous avions un besoin urgent d'un puissant outil interactif qui nous permettait de tester rapidement des hypothèses, mais Spark de cette époque ne pouvait pas fournir la stabilité et l'évolutivité dont nous avions besoin. La deuxième tentative que nous avons faite un an plus tard, en 2014, et cette fois, tout s'est bien passé. La même année, nous avons commencé à mettre en œuvre des outils d'analyse de streaming basés sur Kafka et Samza, avons essayé Spark Streaming, mais cela n'a pas pu démarrer. En raison de la mise en œuvre relativement précoce, en 2017, nous étions en mesure de rattraper un certain temps - une grande quantité de code sur le premier Spark nous a empêché de passer au second, mais à l'été 2018, nous avons résolu ce problème et travaillons maintenant sur 2.3.3. Dans cette version, le streaming a déjà fonctionné plus stable et nous avons déjà fait de nouvelles tâches de production dessus.
- Si je comprends bien, vous utilisez l'API Scala, pas Python, comme la plupart. Pourquoi
Je ne vois sincèrement aucune raison d'utiliser Python pour travailler avec Spark, sauf pour la paresse. L'API Scala est plus flexible et beaucoup plus efficace, mais pas plus compliquée. Si vous utilisez les fonctionnalités standard de Spark SQL, le code Scala est presque identique au code Python correspondant et la vitesse sera identique. Mais si vous essayez de créer la fonction définie par l'utilisateur la plus simple, la différence devient évidente - le travail du code Scala reste aussi efficace, et le code Python transforme un cluster multicœur en citrouille et commence à brûler des kilowatts / heures pour une activité complètement improductive. À l'échelle avec laquelle nous devons travailler, nous ne pouvons tout simplement pas nous permettre un tel gaspillage.
- C Python est compréhensible. Et par rapport à Java, Scala est-il quelque chose de mieux pour l'analyse des données? En Java, beaucoup de choses sont écrites dans la pile de Big Data.
Nous utilisons Java très largement, y compris dans l'apprentissage automatique. Nous essayons de ne pas nous lancer dans les applications Scala les plus chargées. Mais en matière d'analyse interactive et de prototypage rapide, le laconicisme de Scala devient un plus. Certes, vous devez toujours garder à l'esprit que lors de la programmation dans Scala, il est très facile de tirer les jambes jusqu'aux oreilles - de nombreux modèles peuvent ne pas se comporter comme vous vous attendez d'une position de bon sens, et certaines opérations simples provoquent des copies inutiles et des tentatives de matérialisation jeux de données en mémoire.
- Avec tous ces avantages, pourquoi Scala n'est-il pas encore si populaire? Surpasse-t-il clairement Python et Java?
Scala est un outil très puissant qui nécessite une qualification suffisamment élevée de celui qui l'utilise. De plus, avec le développement en équipe, des exigences supplémentaires sont également imposées au niveau général de la culture de développement: le code sur Scala est très facile à écrire, mais pas toujours lu avec succès par l'auteur après un certain temps, et sous le capot d'une API simple, il peut créer une sorte de jeu. Par conséquent, une attention particulière doit être accordée au maintien d'un style unifié, de tests fonctionnels et de stress de la solution.
Eh bien, lorsque l'on compare les langages JVM, on ne peut que mentionner Kotlin - il gagne en popularité, est considéré par beaucoup comme plus «vérifié idéologiquement», et prend même en charge Spark dans le cadre du projet sparklin, bien qu'il soit encore très limité. Nous-mêmes ne l'utilisons pas encore pour Spark, mais nous suivons de près l'évolution.
- Retour à Spark. Si je comprends bien, vous n'aimiez toujours pas cette fonctionnalité de l'API Scala et vous avez écrit une sorte de fork pour Spark?
Il serait faux d'appeler notre fork de projet PravdaML : cette bibliothèque ne remplace pas, mais complète la fonctionnalité SparkML avec de nouvelles fonctionnalités. Nous sommes arrivés aux décisions qui y ont été mises en œuvre, en essayant de mettre à l'échelle et de mettre sur les rails reproductibles les modèles de classement des bandes. Le fait est que lors du développement d'algorithmes efficaces d'apprentissage automatique distribué, vous devez prendre en compte de nombreux facteurs «techniques»: comment décomposer correctement les données en nœuds, à quel moment mettre en cache, sous-échantillonner, etc. Il n'y a aucun moyen de gérer ces aspects dans le SparkML standard, et ils doivent être déplacés au-delà du pipeline ML, ce qui affecte négativement la gérabilité et la reproductibilité.
- Je me souviens que tu avais deux options pour le nom ...
Oui, le nom d'origine ok-ml-pipelines semblait ennuyeux pour les gars, nous sommes donc en train de «rebranding» avec le nouveau nom PravdaML.
- Beaucoup de gens l'utilisent en dehors de votre équipe?
Je ne pense pas beaucoup, mais nous y travaillons. J
- Parlons des rôles et des professions dans le domaine du travail avec les données. Dites-moi, un scientifique des données devrait-il écrire du code en production ou est-ce déjà un autre métier et rôle?
La réponse à cette question est mon avis, et il y a une dure réalité. J'ai toujours cru que pour une implémentation réussie des solutions ML, une personne doit comprendre où et pourquoi tout cela est implémenté (qui est l'utilisateur, quels sont ses besoins et quels besoins l'entreprise a), il doit comprendre quelles méthodes mathématiques peuvent être appliquées pour développer la solution, et comment ces méthodes peuvent fonctionner d'un point de vue technique. Par conséquent, à Odnoklassniki, nous essayons toujours d'adhérer au modèle de la responsabilité unique, lorsqu'une personne propose une initiative, la met en œuvre et la met en œuvre. Bien sûr, pour résoudre des problèmes privés individuels, qu'il s'agisse d'un SGBD efficace ou d'une mise en page interactive, vous pouvez toujours attirer des personnes ayant une vaste expérience dans ces domaines, mais l'intégration de tout cela dans un seul mécanisme reste avec le scientifique, en tant que personne qui comprend le mieux exactement quoi et comment cela devrait fonctionner. sortie.
Mais il existe également une dure réalité sur le marché du travail, qui est désormais très surchauffé dans le domaine du blanchiment d'argent, ce qui conduit à ce que de nombreux jeunes spécialistes ne jugent pas nécessaire d'étudier autre chose que le blanchiment lui-même. En conséquence, il devient de plus en plus difficile de trouver un spécialiste du cycle complet. Bien qu'une bonne alternative soit apparue récemment: la pratique a montré que les bons programmeurs apprennent le ML assez rapidement et assez bien. J
- L'ingénieur de datation a besoin de connaître Scala? Comment ça va au fait? Dois-je entrer dans la jungle de la programmation fonctionnelle?
Il est absolument nécessaire de connaître Scala, ne serait-ce que parce que deux outils fondamentaux tels que Kafka et Spark sont écrits dessus, et vous devez pouvoir lire leur code source. Quant à la «jungle de la programmation fonctionnelle», je leur déconseille fortement d'en abuser: plus les développeurs peuvent lire et comprendre le code, mieux c'est. Même si pour cela il faut parfois déployer un design fonctionnel «élégant» dans un cycle banal.
- L'univers des métiers dans ce domaine a déjà cessé de s'étendre, ou faut-il encore attendre l'émergence de nouveaux métiers?
Je pense que dans un avenir prévisible en ML et DS, il y aura un tournant lié à l'automatisation: les principaux modèles que les gens suivent lorsqu'ils travaillent avec des attributs, choisissent un modèle et ses paramètres et vérifient la qualité seront automatisés. Cela conduira au fait que la demande de spécialistes qui «sélectionnent les paramètres» diminuera considérablement, mais les ingénieurs AutoML capables de mettre en œuvre et de développer des solutions automatisées seront en demande.
"Vous enseignez activement, si je comprends bien." Pourquoi considérez-vous cela important? Quelle est la motivation derrière cela?
Nous allons tous un jour prendre notre retraite et la qualité de notre vie dépendra grandement de qui nous remplacera. Par conséquent, l'investissement dans l'éducation de la prochaine génération est l'un des plus importants.
- Sur notre programme "Data Analysis on Scala" vous animerez plusieurs cours. Parlez-moi brièvement d'eux. Quelle est leur importance?
Dans ces cours, nous étudierons simplement comment l'ingénierie et les mathématiques s'imbriquent: comment organiser correctement le processus, sans introduire de barrières inutiles à ETL-> ML-> Prod. Le cours sera construit autour des capacités de Spark ML: concepts de base, conversions prises en charge, algorithmes implémentés et leurs limites. Nous aborderons la zone où les fonctionnalités SparkML existantes ne sont pas suffisantes, et il devient nécessaire d'utiliser des extensions telles que PravdaML. Eh bien, il y aura certainement de la pratique, non seulement au niveau de «l'assemblage d'une solution à partir de cubes prêts à l'emploi», mais aussi sur la façon de comprendre qu'un nouveau «cube» est nécessaire ici et comment le mettre en œuvre.
- Y a-t-il un jeu de mots préféré avec Scala? Mur d'escalade, grimpeur, art rupestre - utilisez-vous dans votre routine quotidienne?
À moins que l'épithète «indoskal», que nous utilisons pour aborder des morceaux d'open source particulièrement remarquables, dont l'auteur voulait clairement démontrer la capacité remarquable de construire du code illisible en utilisant des abstractions fonctionnelles.
- Moscou ou Peter?
Chaque ville a son zeste. Moscou est une ville riche et bien entretenue avec un rythme rapide. Peter est plus calme et rempli du charme de l'ancienne capitale européenne. Par conséquent, j'aime venir à Moscou pour visiter, mais je préfère vivre à Saint-Pétersbourg.