Mit KI entwickeln

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.

Ein Glaswürfel mit leuchtenden Schaltkreisen, der KI-Hardware-Profiling auf einem Schreibtisch darstellt.
Für diesen Artikel generierte Illustration

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=True in NeuronConfig propagiert die Gerätezeit in die Tabelle key_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.compile mit 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_neuronx und konfigurieren Sie NeuronConfig mit ProfileMode.DEVICE und ProfileMode.RUNTIME, um umfassende Traces zu erfassen.
  • Verwenden Sie torch.profiler.schedule mit 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 nach self_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_norm oder torch.compile, um die Leistungsvorteile der Operationsfusion zu quantifizieren.
  • #aws trainium
  • #pytorch
  • #performance profiling
  • #machine learning
  • #optimization

Tools aus dem Bytechap-Shop

$89

DocBento

Selbst gehostetes Dokumentenmanagement, das jeden Scan liest und mit Seitenzitaten antwortet.

Live-Demo

Weiterlesen

Alle Artikel