
Nur wenige Leute glauben, dass der moderne Data Science Stack nicht auf Python aufgebaut werden kann, aber es gibt solche Präzedenzfälle :). Der Odnoklassniki-Stack wurde viele Jahre lang hauptsächlich von Programmierern entwickelt, die auf Data Science umgestiegen sind, aber dennoch in der Nähe des Produkts blieben. Daher basiert er auf den offenen Technologien des JVM-Stacks: Hadoop, Spark, Kafka, Cassandra usw. Dies hilft uns, Zeit und Kosten für die Inbetriebnahme von Modellen zu reduzieren, führt jedoch manchmal zu Schwierigkeiten. Bei der Vorbereitung grundlegender Lösungen für Teilnehmer des SNA Hackathon 2019 mussten sie beispielsweise ihre Willenskraft komprimieren und in die Welt des dynamischen Schreibens eintauchen. Details (und einfaches Trolling) unter dem Schnitt :)
Installation

Auf fast jeder Entwicklungsmaschine gibt es eine Art Python. Er wurde auf meiner bereits doppelt gefunden - 2.7 und 3.4. Nachdem ich in den Speicherfächern gestöbert hatte, erinnerte ich mich, dass ich vor drei Jahren Version 3.4 installiert hatte, nachdem die Teilnehmer beim SNA Hackathon 2016 auf epische Probleme gestoßen waren und versucht hatten, ein halbes Gigabyte-Diagramm im Speicher zu erweitern (als Ergebnis eines kleinen Trainingsvideos und eines separaten Wettbewerbs ), aber heute ist es so Die Wirtschaft ist moralisch bereits veraltet und muss aktualisiert werden.
In der Java-Welt zeigt jedes Projekt während der Montage alles an, was es in sich integrieren möchte, und lebt damit weiter. Theoretisch ist alles einfach und schön, aber in der Praxis wird sich herausstellen, dass beide die C-Bibliothek mit zwei verschiedenen inkompatiblen Versionen benötigen, wenn Sie Bibliothek A und Bibliothek B benötigen :). Bei vergeblichen Versuchen, diesen Teufelskreis zu durchbrechen, packen einige Bibliotheken alle ihre Abhängigkeiten in sich und verstecken sich vor den anderen, während sich die anderen drehen, wie sie können.
Was ist damit in Python los? Es gibt kein Projekt als solches, aber es gibt eine „Umgebung“, und innerhalb jeder Umgebung kann aus Paketen bestimmter Versionen ein unabhängiges Ökosystem gebildet werden. Gleichzeitig gibt es Tools für Faule , mit deren Hilfe die lokale Python-Umgebung nicht schwieriger zu verwalten ist als ein verteilter heterogener Cluster von Clauder oder Horton. Aber gegenseitige Konflikte zwischen Paketversionen werden nirgendwo hingehen. Ich sah mich sofort mit der Tatsache konfrontiert, dass die Pandas 0.24-Version die private _maybe_box_datetimelike-Methode auf die öffentliche API übertrug, und plötzlich stellte sich heraus, dass viele Leute sie in ihrer vorherigen Form verwendet hatten und jetzt abfielen :) (und ja, in Java-Welt ist die gleiche ). Aber am Ende wurde alles repariert, abgesehen von den schrecklichen Warnungen um neues Depriycheyshin, es funktionierte.
Kollaborative Basislinie

Die Aufgaben beim SNA Hackathon 2019 sind in drei Bereiche unterteilt - Empfehlungen zu Protokollen, Texten und Bildern. Beginnen wir mit den Protokollen (Spoiler - Megapattern Cmd + C / Cmd + V mit Stackoverflow funktioniert auch mit Python). Die Daten wurden aus einer Live-Produktion gesammelt - jedem Benutzer wurde zufällig, ohne zu wiegen, ein Feed aus seiner Umgebung angezeigt, wonach alle Zeichen zum Zeitpunkt der Show und die endgültige Reaktion im Protokoll aufgezeichnet wurden. Das Stück Kuchen Aufgabe: Wir nehmen Zeichen, wir schieben in einem Logg , Gewinn!
Aber der Plan blitzte in der ersten Phase beim Lesen von Daten auf. Theoretisch gibt es ein wunderbares Apache Arrow- Paket, das die Arbeit mit Daten in verschiedenen Ökosystemen vereinheitlichen und insbesondere das Lesen von "Parkett" -Dateien aus Python ohne Funken ermöglichen soll. In der Praxis stellte sich heraus. dass er selbst beim Lesen einfacher verschachtelter Strukturen Probleme hat und unsere schöne Hierarchie sich in einen flachen Elend verwandelt hat :(.
Aber es gab positive Aspekte. Jupyter war im Allgemeinen erfreut, es ist fast so bequem, wenn auch nicht so hübsch wie Zeppelin . Es gibt sogar einen Felskern ! Nun, die Geschwindigkeit der logistischen Regression für ein kleines Datenelement im Speicher ist erfreulich - es erreicht nicht die Leistung der verteilten Option, lernt jedoch sofort anhand von vier Zeichen und ein paar hunderttausend Beispielen.
Dann wurde jedoch die Begeisterung hart getroffen: Wenn die erforderliche Datentransformation (Gruppieren nach Schlüssel und Zusammenstellen zu einer Liste) nicht in der Standardliste enthalten ist und angewendet wird oder eine Karte angezeigt wird, sinkt die Geschwindigkeit um Größenordnungen. Infolgedessen lesen 80% der Basiszeit nicht Daten, Verknüpfungen, Modelltraining und -sortierung, sondern die Erstellung banaler Listen.
Übrigens, gerade wegen dieser Funktion bin ich immer wieder überrascht von pySpark-Benutzern - schließlich ist fast die gesamte Standardfunktionalität in Form von Spark SQL verfügbar, das in Python und Rock gleich ist, und nach dem ersten pythonähnlichen Yudf-In mit etwas Persönlichem Zehntausendstel Der Cluster verwandelt sich in einen Kürbis ...
Aber am Ende waren alle Hindernisse überwunden und neun Punkte reichten für eine Punktzahl von 0,65!
Textgrundlinie

Nun ist unsere Aufgabe komplizierter - wenn das Logreg in Hunderten von Implementierungen für alle Plattformen zu finden ist, gibt es eine größere Auswahl an Tools für die Arbeit mit Texten unter Python. Glücklicherweise werden die Texte bereits nicht nur in Rohform gesendet, sondern auch von unserem regulären Vorverarbeitungssystem auf Basis von Spark und Lucene verarbeitet . Daher können Sie sofort die Liste der Token übernehmen und müssen sich keine Gedanken über Tokenisierung / Lematisierung / Stemming machen.
Für einige Zeit bezweifelte ich, was ich nehmen sollte: inländisches BigARTM oder importiertes Gensim . Infolgedessen habe ich mich für das zweite entschieden und das doc2vec-Tutorial kopiert :). Ich hoffe, dass Kollegen aus dem BigARTM-Team die Chance nutzen und beim Wettbewerb die Vorteile ihrer Bibliothek zeigen.
Wir haben wieder einen einfachen Plan: Wir nehmen alle Texte aus dem Test, trainieren das Doc2Vec-Modell, schließen es dann im Zug ab und lernen das Logreg über seine Ergebnisse (Stapeln ist unser Alles!). Aber wie immer begannen die Probleme sofort. Trotz der relativ bescheidenen Menge an Texten im Trainingssatz (nur eineinhalb Gigabyte) hat der Python beim Versuch, sie in die Pandas zu ziehen, 20 (20 Karl!) Gigabyte Speicherplatz verbraucht, wurde ausgetauscht und kehrte nicht zurück. Ich musste teilweise einen Elefanten essen.
Beim Lesen geben wir immer an, welche Spalten vom Boden abgehoben werden sollen, sodass wir den Rohtext im Speicher nicht lesen können. Dies spart die Hälfte der Nutzung, die Dokumente des Testsatzes werden problemlos zum Training in den Speicher geladen. Mit einem Trainingssatz reicht ein solcher Trick nicht aus, daher laden wir zu einem Zeitpunkt nicht mehr als eine "Parkett" -Datei hoch. Außerdem belassen wir in der heruntergeladenen Datei nur die ID der Tage, die wir für das Training verwenden möchten, und schließen sie bereits daraus ab.
Darüber hinaus funktioniert das Anmelden genauso schnell, und am Ende erhalten wir 14 Absätze und eine Punktzahl von 0,54 :)
Bildgrundlinie

Was könnte beliebter sein als Deep Learning? Nur Katzen! Aus diesem Grund haben wir für das Basisbild einen genial einfachen Plan erstellt: Führen Sie einen Katzendetektor für die Bilder aus dem Test-Set aus und ordnen Sie den Inhalt nach der Punktzahl :)
Und wieder gibt es eine große Auswahl. Klassifizierung oder Erkennung? pyTorch oder Tensorflow? Das Hauptkriterium ist die einfache Implementierung durch Copy-Paste-Methode. Und der Gewinner ist ... YOLOv3 auf MXNet :). Die Prägnanz ihrer Demo faszinierte auf den ersten Blick, aber dann begannen wie üblich Probleme.
Womit beginnt die Arbeit mit Big Data normalerweise? Mit Leistungsschätzungen und der notwendigen Maschinenzeit! Ich wollte die Grundlinie so autonom wie möglich gestalten, deshalb haben sie ihr beigebracht, direkt mit der TAR-Datei zu arbeiten, und schnell erkannt, dass es bei einer Geschwindigkeit von 200 Fotos pro Sekunde von TAR zu TMPFS ungefähr eine halbe Stunde dauern würde, um 352.758 Bilder zu verarbeiten. Fügen Sie das Laden und Vorverarbeiten von Fotos hinzu - 100 pro Sekunde, ungefähr eine Stunde für alles, Normen. Fügen Sie die Berechnung des neuronalen Netzwerks hinzu - 20 Fotos pro Sekunde, 5 Stunden, na ja ... ok. Fügen Sie die Ergebnisextraktion hinzu - 1 Foto pro Sekunde, Woche, WTF?
Nach ein paar Stunden Tanzen mit Tamburinen kommt das Verständnis, dass das NDArray, das wir beobachten, niemals numpy ist, und die interne Struktur von MXNet, die alle Berechnungen träge durchführt. Bingo! Was tun? Jeder unerfahrene Diplerner weiß, dass es nur um die Größe der Charge geht! Wenn MXNet die Punktzahl träge berechnet, wenn wir sie zuerst für ein paar Dutzend Fotos anfordern und dann mit dem Extrahieren beginnen, wird die Verarbeitung der Fotos möglicherweise stapelweise durchgeführt? Und ja, nachdem ich die Stapelverarbeitung mit einer Geschwindigkeit von 10 Fotos pro Sekunde hinzugefügt hatte, gelang es mir, alle Katzen zu finden :).
Dann wenden wir die bekannte Technik an und in 10 Absätzen erhalten wir die Punktzahl 0,504 :).
Schlussfolgerungen

Als ein weiser Sensei gefragt wurde: "Wer wird gewinnen, Aikido-Meister oder Karate?", Antwortete er: "Meister wird gewinnen." Wir wurden durch dieses Experiment zu ungefähr den gleichen Schlussfolgerungen geführt: Es gibt keine und kann nicht für alle Gelegenheiten eine ideale Sprache sein. Mit Python können Sie schnell eine Lösung aus vorgefertigten Blöcken zusammenstellen. Der Versuch, sich mit ausreichend großen Datenmengen von diesen zu entfernen, ist jedoch sehr schmerzhaft. In Java und Scala finden Sie auch viele vorgefertigte Tools, mit denen Sie problemlos Ihre eigenen Ideen umsetzen können. Die Sprachen selbst stellen jedoch höhere Anforderungen an die Qualität des Codes.
Und natürlich viel Glück an alle SNA Hackathon 2019 Mitglieder!