Welches Basismodell soll ich für’s Transfer Learning für Bilderkennung verwenden? (Deep Learning)

TL;DR; Benutzt ResNet50. Es ist am schnellsten und günstigsten.

TS;WM – Too Short; Want More

Wenn ihr euch diese Frage auch stellt, dann schlage ich vor einmal auf Standfords DAWNBench vorbeizuschauen: https://dawn.cs.stanford.edu/benchmark/index.html.

Im Menü links unter Image Classification (ImageNet) oder Image Classification (CIFAR10) könnnt ihr jeweils sehen, welches Basismodell gerade auf ImageNet bzw. CIRFAR10 am schnellsten (Training Time), am günstigen (Training Cost: Kosten in USD) trainiert werden kann, für welches die Erkennungsgeschwindigkeit eines Bildes am höchsten (Inference Latency) und wie teuer die Erkennung von 10.000 Bildern im Licht aktuelle Clouddienstleisterkosten ist (Inference Cost).

Der klare Gewinner ist ResNet50.

Ich würde daher für den Bau eines Bilderkennungsmodells immer mit ResNet50 beginnen. 

Ausnahme: Mobile Geräte. Wenn das Modell unbedingt auf einem Smartphone oder einem Raspberry Pi verwendet werden muss, weil  der der Einsatz einer API nicht infrage kommt, gibt es spezielle andere Architekturen. Ein Beispiel ist Mobilenet V2.

Bau meiner extendable Deep Learning Machine – “Deep Al”

Seit ich mich mit Deep Learning beschäftige habe ich bis auf bei kleineren Modelle immer auf Cloud Services gesetzt (vor allem AWS, aber auch GCP, Azure und zuletzt auch Google Colab). In letzter Zeit ist jedoch mein Wunsch nach  einer eigenen (erweiterbaren) Deep Learning Machine gewachsen. Um Modelle für meine Kunden zu rechnen, aber auch für meinen weiteren Lernfortschritt. Nach einem Monat Recherche habe ich mir nun letzte Woche (Januar 2019) folgendes Setup bestellt:

Wichtige Kritieren waren für mich:

  • Preis möglichst nicht mehr als 2000 Euro
  • gutes Preis/Performance-Verhältnis
  • gutes Performance/Energieverbrauchsverhältnis
  • niedrige Lautstärke
  • Erweiterbarkeit hin zu einem Multi-GPU-System

Zur GPU: Für Deep Learning ist die GPU entscheidend. Ich habe mich für die RTX 2070 entschieden, da diese laut diesem Artikel von Tim Dettmers das beste Preis Leistungsverältnis bietet. Das  besondere an den NVIDIA RTX 20XX-Grafikkarten, ist, dass man auf ihnen Deep Learning Modelle mit 16 Bit rechnen kann. Genug Genaugigkeit für Deep Learning und mit dem angenehmen Nebeneffekt, dass so aus 8 GB DDR6 RAM auf der Karte effektiv 16 GB werden! Daher ist auch die Performance der 20XX-RTX-Karten besser als die der GTX 10XX Karten.

Mehrere GPUs und PCIe Lanes. Um mehr als eine GPU betreiben zu können ist die Anzahl unterstützter PCIe-Lanes relevant. Bei einer GPU beträgt der Performance-Verlust von 8x gegen 16x allerdings nur wenige Prozent. PCIe Lanes transportieren Daten aus dem CPU RAM zum GPU RAM. Laut Tim Dettmers betragen die Ladezeite für ein Batch aus 32 ImageNet-Bilder (32x225x225x3) bei 32 Bit mit 16 Lanes 1,1 Millisekunden, mit 8 Lanes 2,3 Millisekunden und mit 4 Lanes 4,5 Millisekunden. Wenn man nun bedenkt, dass ein Forward- + ein Backward-Pass durch ein ResNet-152-Netzwerk 216 Millisekunden dauert, dann machen 18 zu 8 Lanes eine Geschwindigkeitsdifferenz von 0,55% bzw. 1,56%. Für eine GPU ist die Anzahl Lanes also ziemlich egal.

Anders ist das bei mehreren GPUs. Dettmers empfiehlt bei 4 GPUs 8 Lanes pro GPU. Also allein 32 Lanes für die GPUs – mehr, als die meisten Prozessoren liefern.

Prozessor. “Reguläre” Intel Prozessoren haben nur circa 16 bis 28 PCIe-Lanes. Und schon SSD, Netzwerkadapter benötigen manchmal 4 Lanes. Für einen Gaming-PC kein Problem, wohl aber für ein Multi-GPU Deep Learning System.

Damit kommen eigentlich nur Intel Xeon oder AMD Threadripper Prozessoren infrage. Neue Xeon Prozessoren sind zu teuer (>1000 EUR). Da mir auch wichtig ist bei der Vorverarbeitung (Preprocessing) von Daten nicht zu lange warten zu müssen und dafür auch die CPU eine Rolle spielt, wollte ich lieber einen aktuelleren Prozessor und habe daher den kleinsten Threadripper, das Modell 1900x, gewählt, der wie alle anderen Threadripper auch 64 PCIe Lanes unterstützt.

Motherboard: Das Aorus Pro Motherboard hat genug Platz und Steckplätze für ein 4xGPU Setup und unterstützt 16x / 16x / 8x / 8x PCIe Lanes pro Karte und ist mit circa 300 EUR Kostenpunkt das günstigste Modell für diese Kriterien.

RAM. Wieder bei Tim Dettmers habe ich gelernt, dass CPU RAM nicht besonders relevant ist. Es reicht völlig aus, wenn man soviel CPU RAM hat wie GPU RAM. Warum habe ich nun also 16 GB RAM und nicht etwa 8 GB RAM? Das liegt eben daran, dass der RTX RAM doppelt zählt (s. unter Grafikkarte).

Auch der RAM-Taktgeschwindigkeit wird oft zuviel Gewicht beigemessen: die meisten Motherboards unterstützen überaupt nur bis 2666 MHz RAM. Und da RAM für Deep Learning eh eine untergeordnete Rolle spielt, sollte man sein Geld statt in mehr und schnelleren CPU RAM zu stecken, lieber in weitere GPUs investieren! Genau das habe ich vor. Schon in ein paar Monaten stecke ich entweder eine zweite RTX 2070 dazu oder verkaufe die RTX 2070 und schaffe dafür zwei RTX 2080 an, wenn diese bis dahin im Preis gefallen sein sollten.

Zum Kühler: der Artic 33 TR, den ich gekauft habe, ist solide, sieht gut aus und macht sehr wenig Geräusche. Allerdings war die Montage nicht ganz so einfach und er deckt mit seiner Kühlfinne nicht den ganzen CPU Headspread ab. Daher würde ich von ihm zugunsten des Noctua NH-U14S TR4-SP3 Kühlers abraten. Ich werde den in den nächsten Wochen tauschen. Einen interessanten Test dazu könnt ihr hier lesen.

Zu den Speichermedien. SSD 500 GB: einfach, weil es schnell ist. Da laufen Betriebssystem und dort liegen jeweils die Daten für das aktuell in der Entwicklung befindliche Modell. HDD 3 TB: für Datensätze für frühere oder spátere Modelle.

Zum Netzteil. Ihr solltet für alle eure Komponenten den Energiebedarf vorausberechnen. Das sind bei mir:

  • Threadripper 1900X: max. 180Watt
  • ARCTIC – Freezer 33 TR (Black/White) CPU Cooler: 5Watt – 10Watt
  • Corsair – Vengeance LPX 16 GB (2 x 8 GB) DDR4-2400 Memory: 11 Wattatt
  • Seagate – Barracuda 3 TB 3.5″ 7200RPM Internal Hard Drive: 4 Watt – 20Watt
  • Samsung – 970 Evo 500 GB M.2-2280 Solid State Drive: 2 Watt – 10 Watt
  • Zotac – GeForce RTX 2070 8 GB Video Card: 46 Watt – 185 Watt
  • Insgesamt: 90 Watt – 416 Watt

Ich habe dennoch ein 1000 Watt Netzteil genommen, da dies noch 3 weitere RTX 2070 Grafikkarten mitversorgen könnte. Das wird, sofern ich auch 2080 Karten upgraden sollte schon zu knapp, da diese jeweils 225 Watt brauchen. Allerdings, will ich das nun doch erst noch einmal abwarten. Ich habe das Platinum Modell genommen, da dies im Vergleich den höchsten Leistungsgrad im Vergleich zu anderen Modellen (Gold oder Silber) hat. Warum das relevant ist? Wenn das Gerät bei mir in Zukunft für größere Kundenmodelle oder auch meine Experimente mal einen Monat durchläuft, dann wären das bei 4GPUs und einem Strompreis von circa 30 Cent pro KWh 216 EUR Stromkosten – bei einem Leistungsgrad von 100%. In Wahrheit liegt dieser natürlich niedriger. Jede PSU Klasse macht in etwa 3 % Leistungsgradunterschied. Macht auf einen Monat dann schon einmal 6.5 Euro zur nächsten Stufe (Platinum vs Gold). Für mich ist das der Anschaffungspreis von +50 EUR mehr in Ordnung. Das Netzteil soll ja auch viele Jahre halten.

Zum Gehäuse. Wichtig ist, dass das Gehäuse volle ATX Größe hat, damit alle Komponenten Platz finden. Darüberhinaus hat mir das 750D Airflow Modell mit Glasscheibe von Corsair einfach gut gefallen.

Betriebssystem: Ich habe Ubuntu 18.04 LTS intalliert.

Zusammengebaut habe ich die Maschine mit Joachim Tecklenburg, der mich auch in puncto Online Marketing berät und unterstützt.

Wenn ihr Gedanken, Feedback, Vorschläge oder Kritik zu meinem Setup habt, freue ich mich von euch zu hören! Auch höre oder lese ich gerne über eure Setups!

In meinem nächsten beiden Artikel berichte ich jeweils einmal  über die Installation von fastai und pytorch sowie keras mit tensorflow Backend auf dieser Maschine.

Mit besten Grüßen und bis dahin: Forward-Pass!

Frank

Udacity – Deep Learning Nanodegree: Was ist Deep Learning?

Seit November 2017 nehme ich am Deep Learning Nanodegree von Udacity teil. Deep Learning ist ein Machine Learning Ansatz, der auf künstlichen neuronalen Netzwerken (KNN) aufbaut. Inspiriert wurde dieser Ansatz von natürlichen Neuronensystemen, aus denen Nervengewebe und vor allem das Gehirn besteht. Im Gegensatz zum “Shallow Learning”, in dem nur eine Schicht künstlicher Neuronen zur Datenanalyse verwendet werde, verwenden “Deep Nets” (“tiefe oder besser: vielschichte Netzwerke) mehrere übereinander gestapelte Schichten aus Neuronen. So können, die Informationen – z.B. die eines Bildes, dessen Inhalt erkannt werden soll – auf der einen Seite als Pixel in das Netzwerk eingegeben werden und von Schicht so zu Schicht können so aus abstrakteren Einheiten konkreter Bildelemente erkannt werden. Im Beispiel können das z.B. in der ersten Ebene die groben Pixel, in der zweiten Ebene, Kanten und Ecken sein, in der zweiten Ebene einfache Formen wie Kreise, Ovale, Rechtecke und Trapeze und noch eine Ebene höher konkrete Bildeinheiten wie Haare, Stuhllehnen, Knöpfe, Wangen und Nasen und noch eine ebene höher, dann z.B. ein Hund von einem Huhn unterschieden werden. Die Vielschichtigkeit ist das Geheimnis und die Innovation von Deep Learning.

Heute gehören die diversten KNN-Verfahren – darunter Convolutional neural networks, rekurrente neuronale Netzwerke, Generative adversarial networks oder Deep reinforcement learning zu den Go-To-Methoden für die Lösung verschiedenster Probleme: darunter Spracherkennung, Spracherzeugung, Texterkennung, automatische Textübersetzung, Bilderkennung, Computer-KI-Systeme für Computerspiele, selbstfahrende Autos u.v.m. – konkret sind das Sprachassistenten wie Googles Assistent oder Amazons Echo oder die automatische Erkennung von Stimmungen in Chattexten oder Rezensionen (sog. Sentiment Analyse), in Bildern können Hunde, Hunderassen erkannt aber auch bösartige Tumore entdeckt werden, in Computerspielen haben zunehmend die Computer die Hosen an: die Schachtrophäe ging ja bereits 1998 von Kasparov an Deep Blue über, seit 2015 triumphieren aber auch Computer im intuitiven Spiel Go über Fähigkeiten menschlicher Weltmeister, auch sind autonome Fahrzeuge auf den Vormarsch – z.B. in den Logistikzentren und Lagerhallen großer Online-Versandhäuser.

Die Theorie neuronaler Netzwerke (KNN) beginnt  im Jahr 1943 mit Warren McCulloch und Walter Pitts. Sie berschreiben, das KNN theoretisch beliebige Berechnungen anstellen könnten. Trotz erster Erfolge – beispielsweise die kommerzielle Anwendung erster KNN zur automatischen Echofilterung in Telefonaten im Jahr 1960, die auf Arbeiten von Bernard Widrow und Marcian E. Hoff das ADALINE (ADAptive LInear NEuron) zurückgingen, geriet die Forschung um KNN zunächst in Stocken. Grund dafür waren mathematische Probleme, die Seymour Papert und Marvin Minsky 1969 identifizierten: darunter die Unmöglichkeit der damals zur Verfügung stehenden Netzkwerke, den recht einfachen logischen Operator XOR abzubilden. Infolgedessen wurden zunächst die meisten Forschungsgelder gestrichen. Wenn auch gebremst, ging die Forschung weiter. 1974 beschrieb Paul Werbos das heute wichtige Backpropagation oder Fehlerrückführungsverfahren. Seine Renaissance erlebten die KNN jedoch erst wieder ab 1985, als man entdeckte, dass mehrschichtige KNN, paralell via Backprogation trainiert werden konnten, und mit diesen das Problem der linearen Separierbarkeit gelöst und das XOR- Gatter simuliert konnte. Damit waren Papert und Minsky wiederlegt.

Als Data Scientist bin ich zwar ebenfalls diverse Male mit neuronalen Netzwerken in Berührung gekommen, aber einen umfassenden Überblick konnte ich mir noch nicht verschaffen. Das ist mein Ziel für die Teilnahme am Deep Learning Kurs von Udacity. Der Kurs ist mit 600 EUR zwar nicht billig, ich versprach und verspreche mir davon aber eine Aktualisierung und Erweiterung meines aktuellen Wissens zum Thema Deep Learning sowie eine vertiefte Anwendung in meinen Arbeitskontext. Ich habe mittlerweile den ersten Teil abgeschlossen. Neu waren für mich in dem Zusammenhang u.a. die beiden Python Bibliotheken Keras und Tensorflow, die den Bau von mehrlagigen neuronalen Netzwerken (=deep neural nets) ermöglichen. Ich habe bislang mit der MLLIB von Scala neuronale Netzwerke trainiert. Auch habe ich bisher keine Regression mit KNNs gemacht, das hat sich im Wege der ersten Projekts im Rahmen des Kurs geändert. Dafür mussten wir Daten eines Jahres analysieren und den Bedarf eines bestimmten Produktes an bestimmten Standorten in Abhängigkeit diverster Faktoren vorhersagen. Das hat mit wenigen Ausnahmen sehr gut geklappt. Ein weitere schöne Sache war die Sentiment-Analyes in Texten mit NLTK. Das ist auch ein sehr schönes Kit, um Texte zu minen. Im nächsten Teil, an dem ich bereits arbeite geht es um convoluted neuronale Netzwerke und hauptsächlich Bilderkennung. Ich bin schon sehr gespannt!