AI-United » Allgemein » PyTorch in der Produktion: die 5 wichtigsten Fehler und ihre Korrektur

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

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

AI-United-Redaktion

Kommentar hinzufügen

Your email address will not be published. Required fields are marked *

300-101   400-101   300-320   300-070   300-206   200-310   300-135   300-208   810-403   400-050   640-916   642-997   300-209   400-201   200-355   352-001   642-999   350-080   MB2-712   400-051   C2150-606   1Z0-434   1Z0-146   C2090-919   C9560-655   642-64   100-101   CQE   CSSLP   200-125   210-060   210-065   210-260   220-801   220-802   220-901   220-902   2V0-620   2V0-621   2V0-621D   300-075   300-115   AWS-SYSOPS   640-692   640-911   1Z0-144   1z0-434   1Z0-803   1Z0-804   000-089   000-105   70-246   70-270   70-346   70-347   70-410