Installation und Erfahrung mit pytorch2.0

Installation und Erfahrung mit pytorch2.0

Der persönliche Blog einer fetten Orange

einführen

pytorch2.0 wurde im Vergleich zu 1.x einem größeren Versionsupdate unterzogen.Abwärtskompatibel! ! ! !Wenn wir die offizielle Website lesen, können wir sehen, dass sein größtes Update darin besteht, torch.compile()die stabile Beschleunigung des Modells durch Kompilierung mit einer Codezeile zu realisieren.

compiled_model = torch.compile(model)

Diese Anweisung gibt einen Verweis auf das ursprüngliche Modell zurück, kompiliert die Vorwärtsfunktion jedoch in eine optimiertere Version.

Der Beamte stellt auch einige Parameter bereit, die verwendet werden können:

def torch.compile(model: Callable,
*,
mode: Optional[str] = "default",
dynamic: bool = False,
fullgraph:bool = False,
backend: Union[str, Callable] = "inductor",
# advanced backend options go here as kwargs
**kwargs
) -> torch._dynamo.NNOptimizedModule

Kann verwendet werden, um detailliertere Spezifikationen vorzunehmen.

  • Der Modus gibt an, was der Compiler beim Kompilieren optimieren soll.
    • Der Standardmodus ist eine Voreinstellung, die versucht, effizient zu kompilieren, ohne dass das Kompilieren zu lange dauert oder zusätzlicher Speicher benötigt wird.
    • Andere Modi wie z. B. reduzieren den Framework-Overhead um einiges mehr, kosten aber eine kleine Menge zusätzlichen Speichers. kompiliert lange und versucht, Ihnen den schnellstmöglichen Code zu liefern, den es generieren kann.reduce-overhead max-autotune
  • „Dynamic“ gibt an, ob der Codepfad für dynamische Formen aktiviert werden soll. Bestimmte Compileroptimierungen können nicht auf dynamisch geformte Programme angewendet werden. Wenn Sie explizit angeben, ob Sie ein kompiliertes Programm mit dynamischen Formen oder mit statischen Formen wünschen, kann der Compiler Ihnen besser optimierten Code liefern.
  • Fullgraph ähnelt Numbas . Es kompiliert das gesamte Programm in einem einzigen Diagramm oder gibt eine Fehlermeldung aus, die erklärt, warum dies nicht möglich war. Die meisten Benutzer müssen diesen Modus nicht verwenden. Wenn Sie sehr leistungsbewusst sind, dann versuchen Sie es zu nutzen.nopython
  • Backend gibt an, welches Compiler-Backend verwendet werden soll. Standardmäßig wird TorchInductor verwendet, es stehen jedoch auch einige andere zur Verfügung.

offizieller Test

Zu den neuesten Technologien, die Torch.compile in PyTorch 2.0 unterstützen, gehören:

TorchDynamo, AOTAutograd, PrimTorch und TorchInductor.

Um diese Technologien zu verifizieren, nutzte PyTorch offiziell 163 Open-Source-Modelle im Bereich des maschinellen Lernens, darunter Aufgaben wie Bildklassifizierung, Objekterkennung und Bildgenerierung sowie verschiedene NLP-Aufgaben wie Sprachmodellierung, Beantwortung von Fragen und Sequenzierung Klassifizierung, Empfehlungssysteme und Verstärkung. Studie. Diese Benchmarks sind in drei Kategorien unterteilt:

* 46 Modelle von HuggingFace Transformers

* 61 Modelle von TIMM: SoTA PyTorch-Bildmodelle, gesammelt von Ross Wightman

* 56 Modelle von TorchBench: Eine Sammlung beliebter Code-Repositories, gesammelt auf GitHub.

Für das Open-Source-Modell hat PyTorch es nicht offiziell geändert, sondern einen Torch.compile-Aufruf zur Kapselung hinzugefügt.

Als nächstes messen die PyTorch-Ingenieure die Geschwindigkeit und überprüfen die Genauigkeit dieser Modelle. Da die Beschleunigung vom Datentyp abhängen kann, wird die Beschleunigung offiziell sowohl auf float32 als auch auf automatischer gemischter Präzision (AMP) gemessen. Da AMP in der Praxis häufiger vorkommt, ist die Testskala auf 0,75 * AMP + 0,25 * float32 festgelegt.

Unter den 163 Open-Source-Modellen kann Torch.compile auf 93 % der Modelle normal ausgeführt werden. Nach dem Ausführen läuft das Modell auf der NVIDIA A100-GPU 43 % schneller. Bei der Float32-Präzision wird die Laufgeschwindigkeit um durchschnittlich 21 % erhöht; bei der AMP-Präzision wird die Laufgeschwindigkeit um durchschnittlich 51 % erhöht.

Hinweis: Auf einer GPU der Desktop-Klasse (z. B. NVIDIA 3090) ist die gemessene Geschwindigkeit niedriger als auf einer GPU der Server-Klasse (z. B. A100). Ab sofort unterstützt das Standard-Backend TorchInductor von PyTorch 2.0 bereits CPUs und NVIDIA Volta- und Ampere-GPUs und unterstützt keine anderen GPUs, xPUs oder ältere NVIDIA-GPUs.

Vier neue Technologien hinter dieser neuen API

TorchDynamo erfasst PyTorch-Programme sicher mithilfe von Python Frame Evaluation Hooks, einer wichtigen Innovation, die wir über 5 Jahre im Bereich der sicheren Diagrammerfassung entwickelt haben.
AOTAutograd überlastet die Autograd-Engine von PyTorch als verfolgtes Autodiff zum Generieren von Rückwärtsverfolgungen im Voraus.
PrimTorch verallgemeinert etwa 2000+ PyTorch-Operatoren in einen geschlossenen Satz von etwa 250 primitiven Operatoren, anhand derer Entwickler ein vollständiges PyTorch-Backend erstellen können. Dadurch wird die Hürde beim Schreiben von PyTorch-Funktionen oder Backends erheblich gesenkt.
TorchInductor ist ein Deep-Learning-Compiler, der schnellen Code für mehrere Beschleuniger und Backends generiert. Für Nvidia-GPUs wird OpenAI Triton als Schlüsselbaustein verwendet.

1. TorchDynamo

TorchDynamo verwendet eine in PEP-0523 eingeführte CPython-Funktion namens Frame Evaluation API. Der Beamte wählte einen datengesteuerten Ansatz, um die Wirksamkeit von Graph Capture zu überprüfen, indem er mehr als 7.000 in PyTorch geschriebene Github-Projekte als Validierungssatz verwendete.

Experimente zeigen, dass TorchDynamo die Diagrammstruktur in 99 % der Fälle korrekt und sicher mit vernachlässigbarem Overhead abruft, da keine Änderungen am Originalcode erforderlich sind.

2. AOTAutograd

Um das Training zu beschleunigen, muss PyTorch 2.0 nicht nur Code auf Benutzerebene, sondern auch Backpropagation erfassen. Noch besser wäre es, wenn Sie das bewährte PyTorch-Autograd-System verwenden könnten.

AOTAutograd verwendet den PyTorch-Erweiterungsmechanismus „torch_dispatch“, um die Autograd-Engine zu verfolgen. Dadurch können Entwickler Rückwärtsdurchgänge (Rückwärtsdurchgänge) „im Voraus“ erfassen und so TorchInductor verwenden, um Vorwärts- und Rückwärtsdurchgänge zu beschleunigen.

3. PrimTorch

Es ist nicht einfach, ein Backend für PyTorch zu schreiben. PyTorch verfügt über mehr als 1200 Operatoren, und wenn man die verschiedenen Überladungen jedes Operators berücksichtigt, beträgt die Zahl bis zu 2000+.

Bild

Dadurch wird das Schreiben eines Backends oder einer bereichsübergreifenden Funktion zu einem arbeitsintensiven Unterfangen. PrimTorch ist bestrebt, einen kleineren und stabileren Satz von Operatoren zu definieren. PyTorch-Programme können kontinuierlich auf diese Operatorsätze herabgestuft (niedriger) werden. Das offizielle Ziel besteht darin, zwei Sätze von Operatoren zu definieren:

* Prim Ops enthält etwa 250 Operatoren auf relativ niedriger Ebene. Da sie niedrig genug sind, eignen sich diese Operatoren besser für Compiler. Entwickler müssen diese Operatoren integrieren, um eine gute Leistung zu erzielen.

* ATen ops enthält etwa 750 kanonische Operatoren, die für die direkte Ausgabe geeignet sind. Diese Operationen gelten für Backends, die auf der ATen-Ebene integriert wurden, oder für Backends, die nicht kompiliert wurden, um die Leistung aus dem zugrunde liegenden Satz von Operationen wiederherzustellen (z. B. Prim-Ops).

4. TorchInductor

Immer mehr Entwickler verwenden die Triton-Sprache, wenn sie leistungsstarke benutzerdefinierte Kernel schreiben. Darüber hinaus hofft der Beamte, dass das neue Compiler-Backend von PyTorch 2.0 eine ähnliche Abstraktion wie PyTorch verwenden kann und über genügend allgemeine Leistung verfügt, um eine Vielzahl von Funktionen in PyTorch zu unterstützen.

TorchInductor verwendet Pythonic Definieren-für-Lauf-Loop-Level-IR, um PyTorch-Modelle automatisch generiertem Triton-Code auf GPUs und C++/OpenMP auf CPUs zuzuordnen.

Die Kern-Loop-Level-IR von TorchInductor enthält nur etwa 50 Operatoren und ist in Python implementiert, was sie in hohem Maße hackbar und erweiterbar macht.

TorchDynamo, AOTAutograd, PrimTorch und TorchInductor sind in Python geschrieben und unterstützen Dynamic Shape (die Möglichkeit, Vektoren unterschiedlicher Größe ohne Neukompilierung zu senden), wodurch sie flexibel und leicht zu erlernen sind und die Eintrittsbarriere für Entwickler und Lieferanten senkt.

Installieren

Da pytorch_1.x zuvor in Conda installiert wurde, verfügt Cuda auch über Version 11.7

Dieses Mal müssen Sie nur eine Umgebung direkt in Conda erstellen, um die Version pytorch2.0-cuda11.7 zu installieren

Der offizielle Installationsbefehl

Wunder 11.6

pip3 install numpy --pre torch[dynamo] torchvision torchaudio --force-reinstall --extra-index-url https://download.pytorch.org/whl/nightly/cu116

Wunder 11.7

pip3 install numpy --pre torch[dynamo] torchvision torchaudio --force-reinstall --extra-index-url https://download.pytorch.org/whl/nightly/cu117

Zentralprozessor

pip3 install numpy --pre torch torchvision torchaudio --force-reinstall --extra-index-url https://download.pytorch.org/whl/nightly/cpu

Spezifische Installationsschritte:

  1. neue Umgebung schaffen

    conda create -n pytorch2 python=3.8
    
  2. Wechseln Sie zu Pytorch2

    conda activate pytorch2
    
  3. Installieren Sie pytorch2.0 mit dem entsprechenden Befehl oben

Bild-20221203172823415

Bild-20221203172830895

verwenden

Die Verwendung hier besteht hauptsächlich darin, eine Codezeile zu verwenden

Das offizielle Beispiel:

Sehen wir uns nun ein vollständiges Beispiel für das Kompilieren und Ausführen eines realen Modells an (mit Zufallsdaten).

import torch
import torchvision.models as models

model = models.resnet18().cuda()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
compiled_model = torch.compile(model)

x = torch.randn(16, 3, 224, 224).cuda()
optimizer.zero_grad()
out = compiled_model(x)
out.sum().backward()
optimizer.step()

Bei der ersten Ausführung wird das Modell kompiliert. Daher ist die Laufzeit länger. Nachfolgende Läufe sind schnell.compiled_model(x)

verschiedene Modi

Der Compiler verfügt über Voreinstellungen, die das kompilierte Modell auf unterschiedliche Weise optimieren. Möglicherweise führen Sie ein kleines Modell aus, das aufgrund des Framework-Overheads langsam ist. Oder Sie führen ein großes Modell aus, das kaum in den Speicher passt. Abhängig von Ihren Anforderungen müssen Sie möglicherweise andere Modi verwenden.

# API NOT FINAL
# default: optimizes for large models, low compile-time
#默认值:针对大型模型进行优化,编译时间短
#          and no extra memory usage
#	  并且没有额外的内存使用
torch.compile(model)

# reduce-overhead: optimizes to reduce the framework overhead
#减少开销:优化以减少框架开销
#                and uses some extra memory. Helps speed up small models
#	        并且使用一些额外的内存。有助于加快小型模型的速度
torch.compile(model, mode="reduce-overhead")

# max-autotune: optimizes to produce the fastest model,
#最大自动调谐:优化以产生最快的模型,
#               but takes a very long time to compile
#	        但编译需要很长时间
torch.compile(model, mode="max-autotune")

Notiz

  1. Gibt es Anwendungen, bei denen ich PT 2.0 NICHT verwenden sollte?
    Die aktuelle Version von PT 2.0 ist noch experimentell und in den Kinderschuhen. Die Unterstützung dynamischer Formen in Torch.compile befindet sich noch im Anfangsstadium, und Sie sollten sie noch nicht verwenden und warten, bis die Veröffentlichung von Stable 2.0 im März 2023 erscheint. Allerdings entwickeln wir selbst bei statisch geformten Workloads immer noch den kompilierten Modus und Es könnte Fehler geben. Deaktivieren Sie den kompilierten Modus für Teile Ihres Codes, die abstürzen, und melden Sie ein Problem (sofern es nicht bereits aufgetreten ist).

おすすめ

転載: blog.csdn.net/qq_39125451/article/details/128164435