TensorFlow ist ein Open-Source Machine Learning Framework. Es ist im Grunde eine Library für numerische Berechnungen anhand von Datenstrom-Graphen. Die Graph-Knoten repräsentieren mathematische Rechenoperationen, während die Kanten des Graphen multidimensionale Daten-Arrays (Tensors) repräsentieren, die zwischen ihnen fließen.
Tools in TensorFlow
Diese flexible Architektur ermöglicht es, Berechnungen auf einer oder mehreren CPUs oder GPUs in einem Desktop-PC, Server oder Mobilgerät bereitzustellen, ohne Code umschreiben zu müssen. TensorFlow beinhaltet auch TensorBoard, ein Toolkit für Datenvisualisierung.
Während mit TensorFlow immer noch Datenfluss-Graphen gebaut und später in Sessions ausgeführt werden können, unterstützt es ab Version 2.0 in vollem Umfang den Eager-Execution-Modus. Das ist ein imperatives Define-by-run-Interface, das Operationen sofort berechnet, ohne einen Graphen zu bauen. Der Eager-Execution-Modus unterstützt automatische Differenzierung über die tf.GradientTape-API. Eine der Verbesserungen in tf.keras (s. Keras unten) ist Support für Eager Execution.
Während einige andere APIs in TensorFlow 2.0 fallen gelassen wurden, ist ein Konversions-Tool für bestehenden Code eingebaut worden, zusätzlich zu einer Kompatibilitäts-Library.
Estimators sind die skalierbarsten und produktionsorientiertesten Modell-Typen für Machine Learning von TensorFlow. Unternehmen können entweder die vorgefertigten Estimators von Google verwenden oder eigene schreiben. Estimators selber sind auf tf.keras.layers gebaut, was die Individualisierung vereinfacht. Normalerweise ist es komfortabler, Modelle mit Estimators zu bauen, statt mit den Low-level-APIs von TensorFlow. Vorgefertigte Estimators ermöglichen es, auf einer höheren konzeptionellen Ebene zu arbeiten als mit den Basis-TensorFlow-APIs
Keras
TensorFlow unterstützt zwar noch seine ursprüngliche Low-level-API. Mittlerweile ist jedoch tf.keras die bevorzugte High-level-API, eine Implementierung des Keras API-Standards, die TensorFlow-spezifische Verbesserungen enthält. "High" und "Low" bezieht sich darauf, wie tief und "hardwarenah" die API ansetzt. Low-Level bedeutet, dass detailliertere aber auch komplexere Einstellungen vorgenommen werden können. Auf dem High-Level werden die Funktionen abstrahiert, so dass zwar weniger Optionen zur Verfügung stehen, die API aber einfacher zu bedienen ist.
Keras ist eine High-level-API für neuronale Netze. Sie ist in Python geschrieben und kann auf TensorFlow, CNTK, oder Theano aufsetzend laufen. Zusätzliche Backends wie MXNet oder PlaidML werden von Drittanbietern unterstützt.
Keras wurde im Hinblick auf Nutzerfreundlichkeit entwickelt. Es sollte modular und leicht auszubauen sowie in Python geschrieben sein. Die API sei für "Menschen und nicht Maschinen entwickelt" und folge Best Practices, die die kognitive Belastung bei der Bedienung reduzieren sollen.
Neuronale Schichten, Kostenfunktionen, Optimierer, Initialisierungsschemata, Aktivierungsfunktionen und Regulierungsschemata sind in Keras alles eigenständige Module. Sie können kombiniert werden, um neue Modelle zu erstellen. Neue Modelle lassen sich wiederum einfach als neue Klassen und Funktionen hinzufügen. Modelle sind in Python-Code definiert anstatt als separate Modell-Konfigurations-Dateien.
Die Hauptgründe für die Verwendung von Keras liegen in den verfolgten Design-Prinzipien, allen voran der Fokus auf Nutzerfreundlichkeit. Es ist leicht zu lernen und Modelle lassen sich einfach bauen. Darüber hinaus bietet Keras die Vorteile einer großen Nutzerbasis, unterstützt eine breite Palette von Bereitstellungsoptionen, mehrere GPUs und verteiltes Training. Google, Microsoft, Amazon, Apple, Nvidia, Uber und viele andere unterstützen das Tool.
Pruning-API
Das Optimierungstool Pruning-API von Google basiert technisch auf Keras. Daher soll es leicht in bestehende Keras-Projekte eingebunden werden können. Das Tool soll Machine-Learning-Modelle bereits in der Trainingsphase optimieren.
Gemäß dem Namen stutzt die API ML-Modelle zurecht. Sie bewertet im Training die Verbindungen der verschiedenen Ebenen des Modells. Unwichtige oder irrelevante Verbindungen werden aus dem Netzwerk entfernt. Damit sinkt sowohl die nötige Speicherkapazität beim Abspeichern des Modells als auch der zum Ausführen des Modells nötige Arbeitsspeicher sowie die erforderlichen CPU-Operationen.
Horovod
Horovod ist ein von Uber entwickeltes verteiltes Trainings-Framework für TensorFlow, Keras und die Open-Source-Programmbibliothek PyTorch. Horovod soll verteiltes Deep Learning schnell und einfach in der Handhabung machen. Es stützt sich auf Ideen von Baidus Versuchsimplementierung des TensorFlow Ring-Allreduce-Algorithmus'.
Uber versuchte ursprünglich, Distributed TensorFlow mit Parameter-Servern zu verwenden. Die Ingenieure fanden heraus, dass das Message-Passing-Interface (MPI)-Modell unkomplizierter war und weniger Code-Anpassungen brauchte. Uber behauptet, das Horovod-System ermögliche es, ein KI-Modell ungefähr doppelt so schnell trainieren zu können wie eine traditionelle TensorFlow-Implementierung.
Horovod benutzt Open MPI (oder eine andere MPI-Implementierung), um Nachrichten zwischen Knoten auszutauschen, und Nvidia NCCL für seine hoch-optimierte Version von Ring Allreduce. Horovod erreicht 90 Prozent Scaling-Effizienz für Inception-v3 und ResNet-101. Für VGG-16 erzielt es auf bis zu 512 Nvidia Pascal GPUs eine Scaling-Effizienz von 68 Prozent.
Im Dezember 2018 kündigte Uber an, dass sie das Horovod-Projekt unter die Ägide der LF Deep Learning Foundation für Open-Source-KI-Software der Linux-Foundation gibt.
Das Tony-Project
LinkedIn machte den Code für ihr Projekt Tony Ende 2018 öffentlich. Laut Serdar Yegulalp von der InfoWorld dient das Open-Source-Tool dazu, Deep-Learning-Jobs in TensorFlow zu verwalten und zu skalieren. Dazu nutzt es das YARN (Yet Another Resource Negotiator)-Jobplanungs-System in Hadoop.
Zwar gibt es bereits einige andere Planungs-Tools, allerdings stellte LinkedIn ein paar Einschränkungen fest. TensorFlow on Spark etwa betreibt das Framework auf der Job-Engine von Apache Spark, ist damit aber sehr eng an Spark gekoppelt. TensorFlowOnYARN bietet zwar dieselben grundlegenden Features wie Tony, wird aber nicht gewartet und bietet keine Fehlertoleranz.
Tony nutzt laut LinkedIn das Planungssystem für Ressourcen und Aufgaben von YARN, um TensorFlow-Jobs in einem Hadoop-Cluster aufzusetzen. Zudem soll das Tool ermöglichen
GPU-basierte TensorFlow-Jobs über Hadoop zu planen;
verschiedene Arten von Ressourcen (CPUs oder GPUs) anzufordern;
Memory unterschiedlich für TensorFlow-Knoten zu allokieren;
Job-Ergebnisse regelmäßig im Hadoop Distributed File System (HDFS) zu speichern und an einem Punkt wiederaufzunehmen, wenn sie unterbrochen werden oder abstürzen.
Tony teilt die Arbeit auf drei verschiedene interne Komponenten auf: einen Client, einen Anwendungs-Master und eine, die die Aufgabe ausführt. Der Client empfängt eingehende TensorFlow-Jobs. Der Master koordiniert mit dem Ressourcen-Manager von YARN, wie der Job in YARN provisioniert werden soll. Die ausführende Komponente ist das, was tatsächlich auf dem YARN-Cluster ausgeführt wird, um den TensorFlow-Job zu verarbeiten.
Laut LinkedIn bringt Tony keinen merklichen Overhead für TensorFlow mit sich, da es sich in dem Layer befindet, der verteiltes TensorFlow orchestriert. Daher beeinflusst es nicht die eigentliche Ausführung des TensorFlow-Jobs.
Tony funktioniert auch mit der TensorBoard-App um TensorFlow zu visualisieren, optimieren und von Fehlern zu befreien (Debugging).
Inkling
Inkling ist eine kommerzielle High-Level-Programmiersprache von Bonsai (mittlerweile eine Microsoft-Tochter), die es einfacher macht, KI-Anwendungen zu bauen. Laut Paul Krill von der InfoWorld kompiliert sie herunter auf die TensorFlow-Library. Inkling soll KI in einer Weise darstellen, dass Programmierer sich darauf konzentrieren können, einem System etwas beizubringen, anstatt sich auf die Low-Level-Mechaniken fokussieren zu müssen.
Inkling abstrahiert dynamische KI-Algorithmen, die normalerweise Fachwissen im Bereich Machine Learning voraussetzen. Laut Bonsai ist die Sprache beschreibend und erinnert in der Syntax an eine Mischung aus Python und SQL. Ziel der Sprache ist es, Machine Learning für Entwickler und Ingenieure zugänglich zu machen, die keinen ML-Hintergrund haben, die Technologie aber in ihren jeweiligen Fachbereichen einsetzen wollen.
Tensor2Tensor
Googles Open-Source-Projekt Tensor2Tensor (T2T) soll den Arbeitsaufwand verringern, um ein Deep-Learning-Modell für das Training zu konfigurieren. Es ist eine auf Python basierende Library zur Workflow-Optimierung von TensorFlow-Trainingsaufgaben. Entwickler können damit die Schlüsselelemente in einem TensorFlow-Modell spezifizieren und deren Beziehungen untereinander definieren.
Die Schlüsselelemente laut InfoWorld-Redakteur Serdar Yegulalp sind:
Datensätze: T2T unterstützt von sich aus bereits zahlreiche Datensätze für das Training. Neue Datensätze lassen sich dem individuellen Workflow oder per Pull Request dem Kern-T2T-Projekt hinzufügen.
Probleme und Modalitäten: Diese beschreiben, für welche Aufgabe trainiert wird (etwa Spracherkennung oder Übersetzung) und welche Daten sowohl dafür empfangen als auch daraus generiert werden sollen. Eine Bilderkennungssystem würde beispielsweise Bilddaten empfangen und Text-Beschreibungen ausgeben.
Modelle: Viele gängige Modelle sind bereits bei T2T registriert und weitere lassen sich hinzufügen.
Hyperparameter: Ein Hyperparameter ist ein Parameter, der zur Steuerung des ML-Trainingsalgorithmus verwendet wird und dessen Wert im Gegensatz zu anderen Parametern nicht im eigentlichen Training des Modells erlernt wird. In T2T können verschiedene Sets von Einstellungen erstellt werden, die den Trainingsprozess steuern. Diese lassen sich nach Bedarf wechseln oder zusammenschalten.
Trainer: Die Parameter, die an die eigentliche Trainingsbinärdatei übergeben werden, können separat spezifiziert werden.
Für jedes Element bietet T2T Voreinstellungen. Zahlreiche gängige Modelle und Datensätze sind bereits enthalten. Dadurch kann schnell mit dem Training begonnen werden, indem sie wiederverwendet oder erweitert werden. Was T2T nicht liefert, ist ein breiterer Kontext jenseits von TensorFlow, wie das Deep-Learning-Projekt organisiert sein sollte. Es macht es "lediglich" leichter, das Framework zu nutzen.
Ludwig
Ein weiteres Tool, dass das Deep-Learning-Training vereinfachen soll, kommt als Open-Source von den Horovod-Machern Uber. Mit Ludwig sollen ML-Modelle ganz ohne Programmieraufwand trainiert und getestet werden können.
Laut Heise verfolgt das Tool einen datentypbezogenen Ansatz bei der Modellentwicklung, mit spezifischen Encodern und Decodern für jeden Datentyp. Für jeden Typ sollen aber auch unterschiedliche Encoder und Decoder zum Einsatz kommen können. Der gewünschte Encoder soll samt Hyperparameter direkt in der Modell-Konfigurationsdatei (im YAML-Format) festgelegt werden können, ohne dafür Code schreiben zu müssen. In der aktuellen Version biete Ludwig Encoder und Decoder für gängige Datentypen wie Binärwerte, Fließkommazahlen, Kategorien, diskrete Sequenzen, Bilder, Texte und Zeitreihen, die sich bei Bedarf um vortrainierte Modelle ergänzen lassen sollen.
TensorWatch
Mit TensorWatch veröffentlichte Microsoft Research ein Open-Source-Debugging-Tool für Machine Learning, das auch bei komplexen Problemen helfen soll.
Häufig werden beim Modell-Training keine Log-Dateien angelegt, weil sie, je nach Größe der Datensätze, hohe Speicherkosten verursachen können. Dadurch fehlt jedoch ein Gesamtüberblick zu Fehlern im Modell.
TensorWatch soll interaktives Echtzeit-Debugging in Jupyter Notebook visualisieren sowie benutzerdefinierte UIs und die Einbindungsmöglichkeit in das Python-Ökosystem bieten. Jupyter Notebook ist eine Open-Source Web-Anwendung, mit der Dokumente erstellt und geteilt werden können, die Live-Code, -Formeln, -Visualisierungen oder -Text enthalten. Als unterstützte Visualisierungstypen gibt Microsoft unter anderem Balkendiagramme, Histogramme, Kuchendiagramme und 3D-Variationen an.
Daten und andere Objekte werden in TensorWatch generell als Ströme behandelt - inklusive Dateien, Konsolen, Sockets, Cloud-Speicher und die Visualisierungen selbst. Diese Ströme können anderen Strömen "zuhören", so dass beispielsweise mehrere davon in eine Visualisierung zusammengefügt werden können oder ein Strom in mehrere Visualisierungen gleichzeitig.
Mit dem "Lazy Logging Mode" kann TensorWatch ohne explizites Logging die Variablen des Modells überwachen. Nutzer können in Echtzeit interaktive Anfragen stellen, die im Kontext dieser Variablen laufen und einen Strom als Resultat zurückgeben. Die wiederum können visualisiert, gespeichert oder verarbeitet werden.
MorphNet
Die quelloffene TensorFlow-Erweiterung MorphNet von Google ist ein Tool, um tiefe neuronale Netze zu verbessern, indem die Netz-Architektur an neue Anforderungen angepasst wird. Dazu analysiert das Tool die neuronalen Netze und optimiert sie anschließend, indem es deren Aufbau verändert.
Laut JAXenter geht das Tool dabei in zwei Schritten vor:
Die Schrumpfung: MorphNet analysiert die Struktur eines Netzes und die Effizienz der einzelnen Neuronen anhand eines zu optimierenden Kriteriums. Als ineffizient bewertete Neuronen werden aus dem Netz entfernt.
Die Erweiterung: Nach der Entfernung der ineffizienten Neuronen erweitert das Tool alle Schichten des Netzes um einen identischen Faktor. Effiziente Schichten, aus denen weniger Neuronen entfernt wurden, gewinnen so verhältnismäßig an Größe. Die Erweiterung fällt geringer aus als die Schrumpfung, so dass Ressourcen eingespart werden während gleichzeitig die Effizienz erhöht und die Genauigkeit beibehalten wird.