Profiling von PyTorch-Modellen auf AWS Trainium mit TorchNeuron
Erfahren Sie, wie Sie torch.profiler und Neuron Explorer nutzen, um Leistungsengpässe bei der ML-Inferenz auf AWS-Trainium-Hardware zu identifizieren.
Automatisch aus dem englischen Original übersetzt.
AWS Trainium ist ein speziell für Deep Learning entwickelter Chip, doch die Optimierung von Modellen dafür erfordert spezifische Profiling-Techniken. Ein neues Tutorial von Hugging Face zeigt, wie Sie TorchNeuron, das native PyTorch-Backend für Trainium, zur systematischen Analyse der Inferenzleistung einsetzen können. Der Leitfaden führt Ingenieure durch das Erfassen von Traces, das Lesen von Systemdaten und den Vergleich verschiedener Implementierungsstrategien für eine gängige Operation.
Was passiert ist
Viele Praktiker im Bereich maschinelles Lernen verlassen sich auf Intuition, um Modelle zu beschleunigen, aber nur wenige verfügen über die Werkzeuge, um genau zu diagnostizieren, warum ein Modell langsam ist. Um diese Lücke zu schließen, hat Hugging Face den ersten Teil einer Serie veröffentlicht, die sich auf das System-Level-Profiling für AWS Trainium konzentriert. Das Tutorial setzt keine Vorkenntnisse im Profiling auf dieser Hardware voraus und beginnt bei Null, wobei RMSNorm als Fallstudie dient.
Die Anleitung nutzt TorchNeuron, ein Open-Source-Backend, das Standard-PyTorch-Workflows auf Trainium mit minimalen Codeänderungen ermöglicht. Es unterstützt eager Execution, torch.compile und benutzerdefinierte Operatoren über die Neuron Kernel Interface. Ziel ist es, Ingenieuren beizubringen, wie sie den Profiler konfigurieren, saubere Traces erfassen und die resultierenden Daten interpretieren, um zeitaufwändige Operationen zu identifizieren.
Am Ende des Leitfadens lernen Leser, CPU-Zeit mit Gerätezeit zu korrelieren, Operationen durch den Software-Stack hindurch zu verfolgen und zu verstehen, wie verschiedene Codierungsmuster die Hardwareauslastung beeinflussen. Dieses Grundwissen bereitet Entwickler darauf vor, größere Modelle zu optimieren, indem sie Hotspots identifizieren und geeignete Fusions- oder Kompilierungstechniken anwenden.
Wie es funktioniert
Das Profiling auf Trainium basiert auf zwei Hauptkomponenten: NeuronConfig und NeuronProfiler. Das NeuronConfig-Objekt steuert, welche Datenströme erfasst werden sollen, z. B. Geräteanweisungen und Runtime-Traces, und gibt das Ausgabeverzeichnis an. Es wird als experimentelle Konfiguration an torch.profiler.profile übergeben. Der NeuronProfiler nutzt diese Konfiguration, um sowohl den Standard-Framework-Trace als auch Neuron-spezifische Systemtraces zu exportieren.
Zur Visualisierung der Daten verwenden Ingenieure Neuron Explorer, einen browserbasierten Viewer, der über einen SSH-Tunnel oder eine VS Code-Erweiterung zugänglich ist. Dieses Tool zeigt den Systemtrace, die Geräte-Timeline und die Aufschlüsselung pro Engine an. Es ordnet kompilierte ausführbare Dateien (NEFF-Dateien) ihren Hardware-Anweisungstraces (NTFF-Dateien) anhand eines gemeinsamen numerischen Hashes zu. So können Nutzer genau sehen, wie High-Level-PyTorch-Operationen auf Low-Level-Hardware-Ausführung abgebildet werden.
Der Profiling-Prozess umfasst die Synchronisation des Geräts innerhalb der Profiler-Schleife, um genaue Zeitmessungen sicherzustellen. Ohne Aufruf von torch.neuron.synchronize() könnte der Profiler Daten exportieren, bevor das Gerät seine Arbeit beendet hat, was zu leeren oder falschen Zeitspalten führt. Die resultierenden Traces zeigen den Lebenszyklus jeder Operation vom Framework-Dispatch über die Runtime-Scheduling bis hin zur endgültigen Hardware-Ausführung auf einem NeuronCore.
Wichtige Details
- TorchNeuron integriert sich in PyTorch über den Erweiterungspunkt
PrivateUse1, wodurch kein dedizierter Dispatch-Key wie bei CUDA erforderlich ist. - Der Parameter
correlate_device_time=TrueinNeuronConfigpropagiert die Gerätezeit in die Tabellekey_averages()für einen direkten Vergleich mit der CPU-Zeit. - Naive Implementierungen von RMSNorm unter Verwendung einzelner PyTorch-Operationen führen zu mehreren separaten Hardware-Dispatches und der Materialisierung von Zwischentensoren.
- Die Verwendung von
torch.rms_norm()senkt die Operation auf einen einzigen fusionierten Neuron-Kernel ab, was die Gerätezeit erheblich reduziert, indem Lücken zwischen den Operationen eliminiert werden. torch.compilemit dem Neuron-Backend kann naive Operationen automatisch zu einem einzelnen Graphen fusionieren und erreicht so eine Leistung ähnlich der manuellen Fusion, ohne die ursprüngliche Python-Code-Struktur zu ändern.- Neuron Explorer organisiert Ereignisse in Spuren (Lanes) für Framework-Dispatch, Geräteinteraktion, Runtime-API-Aufrufe und Hardware-Ausführung, was eine detaillierte Analyse der Abhängigkeitsketten ermöglicht.
Warum das wichtig ist
Für Ingenieure, die Produkte auf AWS Trainium entwickeln, ist das Verständnis des Unterschieds zwischen CPU-Overhead und tatsächlicher Geräteberechnung entscheidend für die Kosten- und Latenzoptimierung. Naiver Code sieht in Python oft effizient aus, erzeugt jedoch auf dem Beschleuniger aufgrund häufiger Dispatches und Speicherübertragungen übermäßigen Overhead. Durch die Visualisierung dieser Lücken können Entwickler fundierte Entscheidungen darüber treffen, wann sie eingebaute fusionierte Operationen nutzen sollten, anstatt sich auf Compiler-Optimierungen zu verlassen.
Die Möglichkeit, eine Operation vom PyTorch-Framework bis zur NeuronCore-Hardware nachzuverfolgen, bietet eine Transparenz, die bei Black-Box-Beschleunigern oft fehlt. Diese Sichtbarkeit hilft Teams dabei, Leistungsregressionen zu debuggen und zu validieren, dass ihre Optimierungsmaßnahmen tatsächlich die Hardware wie vorgesehen erreichen. Es verschiebt die Optimierung von Schätzungen hin zu evidenzbasierter Ingenieursarbeit.
Darüber hinaus wird der kumulative Effekt kleiner Ineffizienzen mit zunehmender Komplexität der Modelle erheblich. Die frühzeitige Identifizierung und Fusion von Operationen im Entwicklungszyklus verhindert technische Schulden im Zusammenhang mit der Leistung. Die hier beschriebenen Techniken bieten einen wiederholbaren Workflow zur Überprüfung der Modelleffizienz und stellen sicher, dass die Infrastrukturkosten mit den Rechenbedürfnissen übereinstimmen.
Was Sie tun können
- Installieren Sie das Paket
torch_neuronxund konfigurieren SieNeuronConfigmitProfileMode.DEVICEundProfileMode.RUNTIME, um umfassende Traces zu erfassen. - Verwenden Sie
torch.profiler.schedulemit Warmup-Schritten, um Initialisierungs-Overhead aus Ihren Leistungsmessungen auszuschließen. - Rufen Sie
torch.neuron.synchronize()innerhalb Ihrer Profiling-Schleife auf, um sicherzustellen, dass Gerätetasks abgeschlossen sind, bevor der Trace exportiert wird. - Analysieren Sie die Tabelle
key_averages(), sortiert nachself_privateuse1_time_total, um die teuersten Operationen auf dem Neuron-Gerät zu identifizieren. - Laden Sie die generierten
.neff- und.ntff-Dateien in Neuron Explorer hoch, um die Ausführungs-Timeline zu visualisieren und die Operator-Fusion zu überprüfen. - Vergleichen Sie naive Implementierungen mit Varianten von
torch.rms_normodertorch.compile, um die Leistungsvorteile der Operationsfusion zu quantifizieren.



