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