PyTorch in der Produktion: die 5 wichtigsten Fehler und ihre Korrektur

3 min read

PyTorch in der Produktion

Maschinelles Lernen bringt Freude, maschinelles Lernen gewinnt allgemeine Beliebtheit, maschinelles Lernen ist überall. Die meisten Firmen können sich ihre Tätigkeit ohne TensorFlow oder PyTorch nicht vorstellen. Meistens handelt es sich jedoch um den Kampf von Google gegen Facebook.

Wie bekannt verwenden die meisten Tutorials und Online-Tutorials TensorFlow. Wir verfügen über reiche Erfahrungen in der Arbeit mit PyTorch. Heute ist PyTorch schon 1.0. Wir haben mit der Version 0.3 angefangen, die einfach und robust war. Die meisten Fehler waren leicht zu korrigieren und brachten uns keine Schwierigkeiten.

In diesem Artikel geben wir einen Überblick über die fünf häufigsten Fehler bei der Verwendung von PyTorch in der Produktion. Überlegen Sie sich, ob die Verwendung einer CPU sinnvoll ist? Multithreading? Wird mehr GPU-Speicher verwendet? Da wir dies alles schon einmal durchgemacht haben, möchten wir unsere Erfahrungen mit Ihnen teilen.

Fehler 1: Der dynamische Graph wird im Inferenzmodus gespeichert

Wenn Sie schon früher mit TensorFlow gearbeitet haben, sollten Sie die wichtigsten Unterschiede zwischen TF und PT kennen – statische und dynamische Graphen. Es ist ziemlich schwer, TensorFlow zu debuggen, da der Graph jedes Mal bei der Änderung Ihres Modells neu erstellt wurde. Es hat Sie viel Zeit, Mühe sowie auch Ihre Hoffnung gekostet. Heutzutage ist TensorFlow viel besser als früher.

Mit dem Ziel, das Debugging zu erleichtern, verwenden ML-Frameworks dynamische Graphen, die mit den sogenannten variables in PyTorch verbunden sind. Jede von Ihnen verwendete Variable ist mit der vorhergehenden Variable verbunden, die die Beziehungen für Backpropagation aufbaut.

Praktisch sieht es so aus:

Nachdem das Modell trainiert worden ist, möchten Sie meistens alle Berechnungen optimieren. Wenn Sie sich Torch-Interface ansehen, finden Sie viele Optionen, insbesondere im Optimierungsbereich. Der eval-Modus, detach- und no_grad -Methoden verursachen viele Verwirrungen. Nun sehen wir uns an, wie sie funktionieren. Nach dem Training und Einsatz des Modells können Sie sich mit folgenden Punkten auseinandersetzen: Geschwindigkeit, Geschwindigkeit und Ausnahme von CUDA-Out-of-Memory.

Zum Beschleunigung des Pytorch-Modells muss es in den eval-Modus umgeschaltet werden. Er benachrichtigt alle Schichten, Batchnorm- und Dropout-Schichten im Inferenzmodus zu verwenden (einfach gesagt geht es um die Deaktivierung der Dropouts). Jetzt gibt es eine detach-Methode, mit Hilfe derer die Variable aus ihrem Berechnungsgraphen herausgeschnitten wird. Dies ist nützlich, wenn ein Modell von Grund auf erstellt wird, aber nicht so sehr, wenn ein State-of-Art-Modell wiederverwendet wird. Eine globalere Lösung würde im Weiterleiten in den torch.no_grad –Kontext bestehen, der den Speicherverbrauch reduziert, ohne dass Graphlinks in den Ergebnissen gespeichert werden. Dies führt dazu, dass Speicher gespart wird und somit die Berechnungen vereinfacht werden. Und es sorgt für mehr Geschwindigkeit und weniger Speicherverbrauch. Bingo!

Fehler 2: Cudnn-Optimierungsalgorithmen werden nicht aktiviert

In einem nn.Modul können Sie viele boolesche Flags einstellen. Dabei beachten Sie, dass sie im cudnn-Namensraum gespeichert sind. Zur Aktivierung der cudnn-Optimierung dient cudnn.benchmark = True. Stellen Sie dann cudnn.enabled = True ein, um sicherzustellen, dass cudnn wirklich nach optimalen Algorithmen sucht. NVIDIA stellt Ihnen viele Optimierungen zur Verfügung, von der Sie profitieren könnten.

Denken Sie bitte daran, dass sich Ihre Daten in der GPU befinden müssen und sich die Modelleingabegröße nicht ändern sollte. Je mehr Vielfalt in Form von Daten es gibt, desto weniger Optimierungen können durchgeführt werden. Möchten Sie beispielsweise Daten normalisieren, so können Sie die Bilder vorverarbeiten. Seien Sie im Allgemeinen kreativ, aber nicht zu sehr.

3. Fehler: JIT-Kompilierung wird wiederverwendet

PyTorch stellt eine einfache Methode zur Optimierung und Wiederverwendung Ihrer Modelle in verschiedenen Sprachen bereit (lesen Sie über Python-To-Cpp). Seien Sie kreativer und implementieren Sie Ihr Modell in anderen Sprachen, wenn Sie mutig genug sind.

Anhand der JIT-Kompilierung kann man einen Berechnungsgraphen optimieren, wenn sich die Eingabe in Form nicht ändert. Dies bedeutet, dass JIT der richtige Weg ist, wenn sich Ihre Daten nicht zu sehr verändern (Sehen Sie den 1. Fehler). Ehrlich gesagt, machte es keinen großen Unterschied zu den oben beschriebenen no_grad  und cudnn, aber es könnte. Dies ist nur die erste Version, die ein großes Potenzial hat.

Zum Schluss sollte noch darauf hingewiesen werden, dass dies nicht funktioniert, wenn Sie in Ihrem Modell conditions haben, die bei RNNs sehr oft vorkommen.

Die vollständige Dokumentation befindet sich auf pytorch.org/docs/stable/jit

4. Fehler: Skalierungsversuch mithilfe von CPU-Instanzen

Wie bekannt sind GPUs so teuer wie virtuelle Maschinen in der Cloud. Beim AWS kostet eine Instanz ungefähr 100 $/Tag (der niedrigste Preis beträgt 0,7 $/ST). Vergleichen Sie die Angaben dieser zwei Referenzen: aws.amazon.com/ec2/pricing/on-demand/ und www.ec2instances.info. Jeder Schüler, der die Grundschule beendet hat, könnte sagen: „Ok, was wäre, wenn ich 5 CPU-Instanzen anstatt 1 GPU kaufen würde.“ Jeder, der mindestens einmal versucht hat, ein NN-Modell auf einer CPU auszuführen, ist in eine Sackgasse geraten. Selbstverständlich kann ein Modell für die CPU optimiert werden. Es ist aber damit zu rechnen, dass es am Ende immer noch langsamer als ein GPU-Modell sein wird. Wir empfehlen Ihnen dringend, sich von dieser Idee loszulösen. Vertrauen Sie unserer Erfahrung.

5. Fehler: Anstelle von Matrizen werden Vektoren verarbeitet

  • cudnn – Überprüfen
  • no_grad – Überprüfen
  • GPU with correct version of CUDA – Überprüfen
  • JIT-compilation – Überprüfen

Wenn alles schon fertig ist, was ist dann noch zu tun?

Zum Schluss noch ein wenig Mathematik. Erinnern Sie sich noch daran, wie die meisten neuronalen Netzwerke mithilfe von sogenannten Tensoren trainiert werden? In der Mathematik ist unter einem Tensor ein N-dimensionales Array oder multilineare geometrische Vektoren gemeint. Was könnten Sie in dieser Hinsicht tun? Wenn Sie sich den Luxus leisten können, gruppieren Sie die Eingabedaten in Tensoren oder Matrix und sättigen Sie damit Ihr Modell. Beispielsweise kann Ihnen ein Array von Bildern als eine an PyTorch gesendete Matrix nützlich sein. Die Leistungssteigerung kommt dann der Anzahl der gleichzeitig übertragenen Objekte gleich.

Dies scheint eine offensichtliche Lösung zu sein. In der Tat wird sie jedoch selten verwendet. Es liegt daran, dass die Objekte meistens einzeln verarbeitet werden und die architektonische Einstellung eines solchen Flusses ziemlich schwierig sein kann. Keine Sorge, Sie schaffen das schon!

Bestimmt gibt es mehr Tipps, wie die Modelle in PyTorch optimiert werden können. In diesem Artikel haben wir aufgrund unserer Erfahrung die wichtigsten Fehler bei der Arbeit in PyTorch beschrieben und einige Ratschläge zu ihrer Verbesserung gegeben.

Wie sieht es bei Ihnen aus? Was sind Ihre Tipps, wie eine bessere Leistung bei Inferenz erreicht werden kann? Diese und weitere Fragen beantwortet gerne das AI United Team per Email oder in dem Q&A Bereich.

Quelle

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.