Industrielles maschinelles Lernen: 10 Konstruktionsprinzipien

Industrielles maschinelles Lernen: 10 Konstruktionsprinzipien



Heutzutage werden jeden Tag neue Dienste, Anwendungen und andere wichtige Programme erstellt, mit denen Sie unglaubliche Dinge erstellen können: von der Software zur Steuerung einer SpaceX-Rakete bis zur Interaktion mit einem Wasserkocher im nächsten Raum über ein Smartphone.



Und manchmal stellt jeder unerfahrene Programmierer, ob er nun ein leidenschaftlicher Startup oder ein gewöhnlicher Full Stack- oder Data Scientist ist, früher oder später fest, dass es bestimmte Regeln für das Programmieren und Erstellen von Software gibt, die das Leben erheblich vereinfachen.



In diesem Artikel werde ich kurz 10 Prinzipien beschreiben, wie industrielles maschinelles Lernen so programmiert werden kann, dass es leicht in eine Anwendung / einen Dienst integriert werden kann, basierend auf der vom Heroku-Team vorgeschlagenen 12-Faktor-App-Methode .... Meine Initiative ist es, das Bewusstsein für diese Technik zu schärfen, was vielen Entwicklern und Menschen aus Data Science helfen kann.



Dieser Artikel ist der Prolog zu einer Reihe von Artikeln über industrielles maschinelles Lernen. In ihnen werde ich weiterhin darüber sprechen, wie man tatsächlich ein Modell erstellt und in der Produktion ausführt, eine API dafür erstellt sowie Beispiele aus verschiedenen Bereichen und Unternehmen, in deren Systeme ML integriert ist.



Prinzip 1. Eine Codebasis



Einige Programmierer vergessen in der ersten Phase aus Faulheit, es herauszufinden (oder aus irgendeinem Grund), Git. Sie vergessen entweder das Wort vollständig, das heißt, sie werfen Dateien im Laufwerk aufeinander zu / werfen einfach Text / senden Tauben, oder sie denken nicht über ihren Workflow nach und verpflichten sich jeweils zu ihrem eigenen Zweig und dann zum Master.



Dieses Prinzip besagt: eine Codebasis und viele Bereitstellungen haben.



Git kann sowohl in der Produktion als auch in Forschung und Entwicklung (F & E) eingesetzt werden, wo es seltener eingesetzt wird.



In der F & E-Phase können Sie beispielsweise Commits mit verschiedenen Datenverarbeitungsmethoden und -modellen hinterlassen, um dann die beste auszuwählen und problemlos weiter daran zu arbeiten.



Zweitens ist dies in der Produktion eine unersetzliche Sache - Sie müssen ständig überprüfen, wie sich Ihr Code ändert, und wissen, welches Modell die besten Ergebnisse erzielt hat, welcher Code am Ende funktioniert hat und was passiert ist, weil es nicht mehr funktioniert oder Probleme verursacht hat falsche Ergebnisse. Dafür sind Commits da!



Sie können auch ein Paket Ihres Projekts erstellen, indem Sie es beispielsweise auf Gemfury platzieren und dann einfach Funktionen für andere Projekte daraus importieren, um sie nicht 1000 Mal neu zu schreiben, sondern später mehr.



Prinzip 2. Abhängigkeiten klar deklarieren und isolieren



Jedes Projekt verfügt über verschiedene Bibliotheken, die Sie von außen importieren, um sie irgendwo anzuwenden. Ob es sich um Python-Bibliotheken oder Bibliotheken anderer Sprachen für andere Zwecke oder Systemtools handelt - Ihre Aufgabe ist:





Auf diese Weise können sich Entwickler, die in Zukunft Ihrem Team beitreten werden, schnell mit den Bibliotheken und deren Versionen vertraut machen, die in Ihrem Projekt verwendet werden, und Sie können die Versionen und Bibliotheken selbst steuern, die für ein bestimmtes Projekt installiert sind, um dies zu vermeiden Inkompatibilität von Bibliotheken oder deren Versionen.



Ihre App muss sich auch nicht auf Systemtools verlassen, die möglicherweise auf einem bestimmten Betriebssystem installiert sind. Diese Tools müssen auch im Abhängigkeitsmanifest deklariert werden. Dies ist erforderlich, um Situationen zu vermeiden, in denen die Version der Tools (sowie deren Verfügbarkeit) nicht mit den Systemtools eines bestimmten Betriebssystems übereinstimmt.



Selbst wenn Sie Curl auf fast allen Computern verwenden können, sollten Sie es dennoch in Abhängigkeiten deklarieren, da es bei der Migration auf eine andere Plattform möglicherweise nicht vorhanden ist oder die Version nicht die ursprünglich benötigte ist.



Zum Beispiel könnte Ihre Anforderung.txt folgendermaßen aussehen:



# Model Building Requirements
numpy>=1.18.1,<1.19.0
pandas>=0.25.3,<0.26.0
scikit-learn>=0.22.1,<0.23.0
joblib>=0.14.1,<0.15.0

# testing requirements
pytest>=5.3.2,<6.0.0

# packaging
setuptools>=41.4.0,<42.0.0
wheel>=0.33.6,<0.34.0

# fetching datasets
kaggle>=1.5.6,<1.6.0


Prinzip 3. Konfigurationen



Viele haben von Geschichten gehört, in denen verschiedene Entwickler versehentlich Code mit Passwörtern und anderen Schlüsseln von AWS in offene Repositories auf GitHub hochgeladen haben und am nächsten Tag mit einer Verschuldung von 6.000 USD oder sogar mit allen 50.000 USD aufwachen.







Natürlich sind diese Fälle extrem, aber sehr aufschlussreich. Wenn Sie Ihre Anmeldeinformationen oder andere für die Konfiguration erforderliche Daten im Code speichern, machen Sie einen Fehler, und ich denke, es lohnt sich nicht zu erklären, warum.



Eine Alternative dazu besteht darin, Konfigurationen in Umgebungsvariablen zu speichern. Weitere Informationen zu Umgebungsvariablen finden Sie hier .



Beispiele für Daten, die normalerweise in Umgebungsvariablen gespeichert werden:



  • Domain Namen
  • API-URLs / URIs
  • Öffentliche und private Schlüssel
  • Kontakte (Post, Telefon usw.)


Auf diese Weise müssen Sie den Code nicht ständig ändern, wenn sich Ihre Konfigurationsvariablen ändern. So sparen Sie Zeit, Mühe und Geld.



Wenn Sie beispielsweise die Kaggle-API zum Durchführen von Tests verwenden (z. B. das Modell herunterladen und ausführen, um zu testen, ob das Modell beim Start gut funktioniert), sollten private Schlüssel von Kaggle wie KAGGLE_USERNAME und KAGGLE_KEY in Umgebungsvariablen gespeichert werden.



Prinzip 4: Dienste von Drittanbietern



Hier geht es darum, das Programm so zu gestalten, dass hinsichtlich des Codes kein Unterschied zwischen lokalen und Ressourcen von Drittanbietern besteht. Beispielsweise können Sie sowohl lokales MySQL als auch Drittanbieter verbinden. Gleiches gilt für verschiedene APIs wie Google Maps oder Twitter API.



Um einen Dienst eines Drittanbieters zu deaktivieren oder einen anderen zu verbinden, müssen Sie nur die Schlüssel in der Konfiguration in den Umgebungsvariablen ändern, über die ich im obigen Absatz gesprochen habe.



Anstatt beispielsweise jedes Mal den Pfad zu den Dateien mit Datasets im Code anzugeben, ist es besser, die pathlib-Bibliothek zu verwenden und den Pfad zu den Datasets in config.py zu deklarieren, damit das Programm unabhängig davon, welchen Dienst Sie verwenden (z. B. CircleCI) Ich konnte den Pfad zu den Datensätzen unter Berücksichtigung der Struktur des neuen Dateisystems im neuen Dienst herausfinden.



Prinzip 5. Erstellen, Freigeben, Ausführen



Viele Leute in Data Science finden es nützlich, Software-Schreibfähigkeiten zu erlernen. Wenn unser Programm so selten wie möglich abstürzen und so lange wie möglich reibungslos funktionieren soll, müssen wir den Veröffentlichungsprozess der neuen Version in drei Phasen unterteilen:



  1. . , . .
  2. — config, . .
  3. . .


Ein solches System zum Freigeben neuer Versionen eines Modells oder der gesamten Pipeline ermöglicht die Aufteilung von Rollen zwischen Administratoren und Entwicklern, ermöglicht das Verfolgen von Versionen und verhindert unerwünschte Programmstopps.



Für die Release-Aufgabe wurden viele verschiedene Dienste erstellt, in denen Sie Prozesse schreiben können, um sich selbst in einer .yml-Datei auszuführen (in CircleCI ist dies beispielsweise config.yml, um den Prozess selbst zu unterstützen). Wheely ist großartig darin, Pakete für Projekte zu erstellen.



Sie können Pakete mit verschiedenen Versionen Ihres maschinellen Lernmodells erstellen, diese dann verpacken und auf die erforderlichen Pakete und deren Versionen verweisen, um die Funktionen zu verwenden, die Sie von dort aus geschrieben haben. Auf diese Weise können Sie eine API für Ihr Modell erstellen, und Ihr Paket kann beispielsweise auf Gemfury platziert werden.



Prinzip 6. Wir führen Ihr Modell als einen oder mehrere Prozesse aus.



Darüber hinaus sollten die Prozesse keine gemeinsamen Daten haben. Das heißt, die Prozesse müssen separat vorhanden sein, und alle Arten von Daten müssen separat vorhanden sein, z. B. für Dienste von Drittanbietern wie MySQL oder andere, je nachdem, was Sie benötigen.



Das heißt, es lohnt sich definitiv nicht, Daten im Dateisystem des Prozesses zu speichern, da dies sonst dazu führen kann, dass diese Daten bei der nächsten Veröffentlichung / Änderung von Konfigurationen oder bei der Übertragung des Systems, auf dem das Programm ausgeführt wird, gelöscht werden.



Es gibt jedoch eine Ausnahme: Bei Projekten für maschinelles Lernen können Sie den Bibliothekscache so speichern, dass Sie ihn nicht jedes Mal neu installieren, wenn Sie eine neue Version starten, wenn keine zusätzlichen Bibliotheken oder Änderungen an ihren Versionen vorgenommen wurden. So verkürzen Sie die Startzeit Ihres Modells in der Branche.



Um das Modell als mehrere Prozesse auszuführen, können Sie eine .yml-Datei erstellen, in der Sie nur die erforderlichen Prozesse und deren Reihenfolge angeben.



Prinzip 7. Recyclingfähigkeit



Die Prozesse, die auf dem Modell in Ihrer Anwendung ausgeführt werden, sollten leicht zu starten und zu stoppen sein. Auf diese Weise können Sie Codeänderungen und Konfigurationsänderungen schnell bereitstellen, schnell und flexibel skalieren und mögliche Ausfälle der Produktionsversion verhindern.



Das heißt, Ihr Prozess mit einem Modell sollte:



  • . ( , , ) . , — .
  • . , , , . DevOps , , (, , , , !)


Prinzip 8: Kontinuierliche Bereitstellung / Integration



Viele Unternehmen verwenden die Trennung zwischen Anwendungsentwicklung und Bereitstellungsteam (Bereitstellung der Anwendung für Endbenutzer). Dies kann die Softwareentwicklung erheblich verlangsamen und Fortschritte bei deren Verbesserung machen. Es verdirbt auch die DevOps-Kultur, in der Entwicklung und Integration grob kombiniert werden.



Daher besagt dieses Prinzip, dass Ihre Entwicklungsumgebung so nah wie möglich an Ihrer Produktionsumgebung sein sollte.



Dies ermöglicht:



  1. Reduzieren Sie die Release-Zeit um das Zehnfache
  2. Reduzieren Sie die Anzahl der Fehler aufgrund von Code-Inkompatibilität.
  3. Dies reduziert auch die Belastung der Mitarbeiter, da die Entwickler und Mitarbeiter, die die Anwendung bereitstellen, jetzt ein Team bilden.


Die Tools, mit denen Sie damit arbeiten können, sind CircleCI, Travis CI, GitLab CI und andere.



Sie können das Modell schnell ergänzen, aktualisieren und sofort starten, während es im Fehlerfall einfach ist, sehr schnell zur Arbeitsversion zurückzukehren, ohne dass der Endbenutzer es bemerkt. Dies ist besonders schnell und einfach möglich, wenn Sie gute Tests haben.



Unterschiede minimieren !!!



Prinzip 9. Ihre Protokolle



Protokolle (oder "Protokolle") sind Ereignisse, die normalerweise im Textformat aufgezeichnet werden und innerhalb der Anwendung auftreten (Ereignisstrom). Einfaches Beispiel: "2020-02-02 - Systemebene - Prozessname". Sie sind so konzipiert, dass der Entwickler buchstäblich sehen kann, was passiert, wenn das Programm ausgeführt wird. Er sieht den Fortschritt der Prozesse und versteht, ob er als Entwickler selbst beabsichtigt ist.



Dieses Prinzip besagt, dass Sie Ihre Protokolle nicht in Ihrem Dateisystem speichern sollten - Sie müssen sie nur "anzeigen", z. B. in der Standardausgabe des System-Standards. Auf diese Weise kann der Durchfluss im Terminal während der Entwicklung überwacht werden.



Bedeutet dies, dass Sie die Protokolle überhaupt nicht speichern müssen? Natürlich nicht. Es ist nur so, dass Ihre Anwendung dies nicht tun sollte - überlassen Sie es den Diensten von Drittanbietern. Ihre Anwendung kann die Protokolle nur zur Live-Anzeige in eine bestimmte Datei oder ein bestimmtes Terminal umleiten oder auf ein Allzweckspeichersystem (z. B. Hadoop) umleiten. Ihre Anwendung selbst sollte keine Protokolle speichern oder mit diesen interagieren.



Prinzip 10. Test!



Für das industrielle maschinelle Lernen ist diese Phase äußerst wichtig, da Sie verstehen müssen, dass das Modell ordnungsgemäß funktioniert und das bietet, was Sie möchten.



Tests können mit pytest erstellt und mit einem kleinen Datensatz getestet werden, wenn Sie eine Regressions- / Klassifizierungsaufgabe haben.



Vergessen Sie nicht, den gleichen Startwert für Deep-Learning-Modelle festzulegen, damit diese nicht ständig zu unterschiedlichen Ergebnissen führen.



Dies war eine kurze Beschreibung von 10 Prinzipien, und natürlich ist es schwierig, sie zu verwenden, ohne zu versuchen und zu sehen, wie sie funktionieren. Daher ist dieser Artikel nur ein Prolog zu einer Reihe interessanter Artikel, in denen ich zeigen werde, wie man industrielle Modelle für maschinelles Lernen erstellt. wie man sie in Systeme integriert und wie diese Prinzipien uns allen das Leben erleichtern können.



Ich werde auch versuchen, coole Prinzipien zu verwenden, die jemand in den Kommentaren hinterlassen kann, wenn er möchte.



All Articles