Heim  >  Artikel  >  Technologie-Peripheriegeräte  >  Speicherreduzierung um 3–7 %! Google schlägt das Machine-Learning-Framework MLGO zur Compiler-Optimierung vor

Speicherreduzierung um 3–7 %! Google schlägt das Machine-Learning-Framework MLGO zur Compiler-Optimierung vor

PHPz
PHPznach vorne
2023-05-01 13:19:061597Durchsuche

Mit der Geburt moderner Computer tauchte das Problem auf, wie man schnelleren und kleineren Code kompilieren kann.

Kompilierungsoptimierung ist die Optimierungsmethode mit dem höchsten Kosten-Nutzen-Verhältnis. Eine bessere Codeoptimierung kann die Betriebskosten großer Rechenzentrumsanwendungen erheblich senken. Die Größe des kompilierten Codes ist für mobile und eingebettete Systeme oder Software, die auf einer sicheren Boot-Partition bereitgestellt wird, von entscheidender Bedeutung, da kompilierte Binärdateien strenge Budgets für die Codegröße einhalten müssen. Mit der Weiterentwicklung des Fachgebiets wird der begrenzte Systemraum durch immer komplexere Heuristiken stark eingeschränkt, was die Wartung und weitere Verbesserungen erschwert.

Neueste Forschungsergebnisse zeigen, dass maschinelles Lernen mehr Möglichkeiten bei der Compileroptimierung eröffnen kann, indem komplexe Heuristiken durch maschinelle Lernstrategien ersetzt werden. Allerdings bleibt die Einführung maschineller Lernstrategien in universell einsetzbaren Compilern auf Industrieniveau eine Herausforderung.

Um dieses Problem zu lösen, schlugen zwei leitende Ingenieure bei Google, Yundi Qian und Mircea Trofin, „MLGO, ein durch maschinelles Lernen gesteuertes Compiler-Optimierungsframework“ vor. Dies ist das erste allgemeine Framework in Industriequalität für die Konvertierung von maschinellem Lernen Techniken werden systematisch in LLVM integriert, eine industrielle Open-Source-Compiler-Infrastruktur, die bei der Entwicklung geschäftskritischer Hochleistungssoftware allgegenwärtig ist.

内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

Papieradresse: https://arxiv.org/pdf/2101.04808.pdf

MLGO nutzt Reinforcement Learning, um neuronale Netze zu trainieren, Entscheidungen zu treffen und heuristische Algorithmen in LLVM zu ersetzen. Laut Beschreibung des Autors gibt es zwei MLGO-Optimierungen für LLVM:

1) Reduzieren Sie die Codegröße durch Inlining.

2) Verbessern Sie die Codeleistung durch Registerzuweisung.

Beide Optimierungen sind im LLVM-Repository verfügbar und wurden in der Produktion eingesetzt.

1 Wie funktioniert MLGO?

Inlining hilft, die Codegröße zu reduzieren, indem es Entscheidungen trifft, die redundanten Code entfernen. Im folgenden Beispiel ist die Aufruferfunktion ​<code style="font-family: monospace; font-size: 12px; background-color: rgba(0, 0, 0, 0.06); padding: 0px 2px; border-radius: 6px; line-height: inherit; overflow-wrap: break-word; text-indent: 0px;">​<span style="font-size: 15px;">foo()</span>​调用被调用者函数 ​<span style="font-size: 15px;">bar()</span>​,而 ​<span style="font-size: 15px;">bar()</span>​本身又调用了 ​<span style="font-size: 15px;">baz()</span>​。内联这两个调用站点将返回一个简单的 ​<code style="font-family: monospace; font-size: 12px; background-color: rgba(0, 0, 0, 0.06); padding: 0px 2px; border-radius: 6px; line-height: inherit; overflow-wrap: break-word; text-indent: 0px;">​<span style="font-size: 15px;">foo()</span>​foo()​Aufgerufene Funktion

​<p style="text-align: center;">bar()<img src="https://img.php.cn/upload/article/000/000/164/168291834816871.png" alt="内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO">​ code>​</p> selbst ruft <p style="max-width:90%">​<code style="font-family: monospace; font-size: 12px; background-color: rgba(0, 0, 0, 0.06); padding: 0px 2px; border -radius: 6px auf ; line-height: inherit; overflow-wrap: break-word;">​<span style="font-size: 12px;">baz()<span style="color: #888888;">​</span></span>​ Durch das Inlining dieser beiden Aufrufseiten wird ein einfacher Code zurückgegeben: radius: 6px; line-height: inherit; overflow-wrap: break-word;">​foo()

​​🎜 Funktion, die die Codegröße reduziert. 🎜🎜🎜🎜🎜🎜🎜🎜Bildunterschrift: Inlining reduziert die Codegröße durch Entfernen redundanten Codes🎜🎜🎜

Im tatsächlichen Code gibt es Tausende von Funktionen, die sich gegenseitig aufrufen und so einen Aufrufgraphen bilden. Während der Inlining-Phase durchläuft der Compiler den Aufrufgraphen aller Anrufer-Angerufenen-Paare und entscheidet, ob ein Anrufer-Angerufener-Paar inline wird. Dies ist ein kontinuierlicher Entscheidungsprozess, da frühere Inlining-Entscheidungen das Aufrufdiagramm ändern und sich auf nachfolgende Entscheidungen und das Endergebnis auswirken. Im obigen Beispiel ist das Aufrufdiagramm ​<code style="font-family: monospace; font-size: 12px; background-color: rgba(0, 0, 0, 0.06); padding: 0px 2px; border-radius: 6px; line-height: inherit; overflow-wrap: break-word; text-indent: 0px;">​<span style="font-size: 15px;">foo()</span>​ → ​<span style="font-size: 15px;">bar()</span>​ → ​<span style="font-size: 15px;">baz()</span>​foo()​ →

​<p style="text-align: justify;">bar()<span style="font-size: 15px;">​</span></p>​ → ​​<p style="text-align: center;">baz()<img src="https://img.php.cn/upload/article/000/000/164/168291834817462.gif" alt="内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO">​</p>​ Um die Codegröße gering zu halten, muss auf beiden Seiten eine „Ja“-Entscheidung getroffen werden.

Vor MLGO wurden Inline-/Nicht-Inline-Entscheidungen durch Heuristiken getroffen, deren Verbesserung mit der Zeit immer schwieriger wurde. MLGO ersetzt Heuristiken durch ein maschinelles Lernmodell. Während des Durchlaufens des Anrufdiagramms sucht der Compiler nach den Empfehlungen des neuronalen Netzwerks, ob ein bestimmtes Anrufer-Anrufer-Paar über relevante Merkmale (d. h. Eingaben) in das Eingabediagramm integriert werden soll, und führt die Entscheidungen nacheinander aus, bis das gesamte Anrufdiagramm erreicht ist erreicht ist.

Abbildung: Abbildung von MLGO während des Inlining-Prozesses, „#bbs“, „#users“ und „callsite height“ sind Beispiele für Anrufer-Anrufer-Paareigenschaften内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

MLGO verwendet Richtliniengradienten und Evolution Richtlinienalgorithmen für das RL-Training von Entscheidungsnetzwerken. Während es keine grundlegende Wahrheit über optimale Entscheidungen gibt, verwendet Online-RL eine trainierte Richtlinie, die zwischen Training und laufender Montage iteriert, um Daten zu sammeln und die Richtlinie zu verbessern. Insbesondere angesichts des aktuell im Training befindlichen Modells konsultiert der Compiler das Modell während der Inlining-Phase, um eine Inline/Nicht-Inline-Entscheidung zu treffen. Nach der Kompilierung wird ein Protokoll des sequentiellen Entscheidungsprozesses (Status, Aktion, Belohnung) erstellt. Dieses Protokoll wird dann an den Trainer weitergeleitet, um das Modell zu aktualisieren. Dieser Vorgang wird wiederholt, bis ein zufriedenstellendes Modell vorliegt.

Bildunterschrift: Compiler-Verhalten während des Trainings 内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

– Der Compiler kompiliert den Quellcode foo.cpp in die Objektdatei foo.o und führt eine Reihe von Optimierungen durch, darunter die Inline-Kommunikationsstraße.

Die trainierte Richtlinie ist in den Compiler eingebettet und stellt während des Kompilierungsprozesses Inline-/Nicht-Inline-Entscheidungen bereit. Im Gegensatz zum Trainingsszenario werden bei dieser Strategie keine Protokolle generiert. TensorFlow-Modelle sind in XLA AOT eingebettet, das das Modell in ausführbaren Code umwandelt. Dies vermeidet TensorFlow-Laufzeitabhängigkeiten und Overhead und minimiert den zusätzlichen Zeit- und Speicheraufwand, der durch die ML-Modellinferenz zur Kompilierungszeit entsteht.

Bildunterschrift: Compilerverhalten in der Produktion

🎜🎜🎜🎜 Wir haben die große und kleine Inlining-Strategie an einem großen Inhouse-Paket mit 30.000 Modulen trainiert. Die trainierte Strategie kann beim Kompilieren anderer Software verallgemeinert werden und reduziert den Zeit- und Speicheraufwand um 3 % bis 7 %. 🎜Neben der Allgemeingültigkeit über die gesamte Software hinweg ist auch die Allgemeingültigkeit über die Zeit hinweg wichtig. Sowohl die Software als auch die Compiler befinden sich in der aktiven Entwicklung. Daher ist eine gut trainierte Strategie erforderlich, um eine gute Leistung in einem angemessenen Zeitraum aufrechtzuerhalten. Wir haben die Leistung des Modells mit derselben Software nach drei Monaten bewertet und nur eine leichte Verschlechterung festgestellt. 🎜🎜

内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

Diagramm: Prozentuale Größenreduzierung der Inline-Größenstrategie, die x-Achse stellt unterschiedliche Software dar und die y-Achse stellt die prozentuale Reduzierung dar. „Training“ ist die Software, die das Modell trainiert, und „InfraX“ ist ein anderes internes Softwarepaket.

MLGOs Inline-Größenänderungsschulung wurde auf Fuchsia implementiert, einem universellen Open-Source-Betriebssystem, das für den Betrieb verschiedener Hardware- und Software-Ökosysteme entwickelt wurde, bei denen die Binärgröße von entscheidender Bedeutung ist. Hier zeigt MLGO eine Reduzierung der Größe der C++-Übersetzungseinheit um 6,3 %.

2 Registerzuordnung

Als allgemeines Framework verwenden wir MLGO, um den Registerzuordnungskanal (Registerzuordnung) zu verbessern und die Codeleistung in LLVM zu verbessern. Die Registerzuweisung löst das Problem der Zuweisung physischer Register zu aktiven Bereichen (d. h. Variablen).

Während der Code ausgeführt wird, werden verschiedene Live-Bereiche zu unterschiedlichen Zeiten abgeschlossen und die Register werden für die Verwendung in nachfolgenden Verarbeitungsstufen freigegeben. Im folgenden Beispiel erfordert jede „Addieren“- und „Multiplizieren“-Anweisung, dass sich alle Operanden und Ergebnisse in physischen Registern befinden. Der Echtzeitbereich x wird dem grünen Register zugewiesen und schließt vor dem Echtzeitbereich des blauen oder gelben Registers ab. Nachdem x abgeschlossen ist, wird das grüne Register verfügbar und dem Live-Bereich t zugewiesen.

Während der Codeausführung werden verschiedene Live-Bereiche zu unterschiedlichen Zeiten abgeschlossen und die freigegebenen Register werden in nachfolgenden Verarbeitungsstufen verwendet. Im folgenden Beispiel erfordert jede „Addieren“- und „Multiplizieren“-Anweisung, dass sich alle Operanden und Ergebnisse in physischen Registern befinden. Der aktive Bereich x wird dem grünen Register zugewiesen und endet vor dem aktiven Bereich des blauen oder gelben Registers. Nachdem x abgeschlossen ist, wird das grüne Register verfügbar und dem Live-Bereich t zugewiesen.

内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO

Bildunterschrift: Beispiel für die Registerzuordnung

Wenn der aktive Bereich q zugewiesen wird, sind keine Register verfügbar, sodass der Registerzuweisungskanal entscheiden muss, welcher aktive Bereich aus seinen Registern „verdrängt“ werden kann Machen Sie Platz für q. Dies wird als „Feldräumungsproblem“ bezeichnet und bei diesem trainieren wir das Modell, um die Entscheidung der ursprünglichen Heuristik zu ersetzen. In diesem Beispiel wird z aus dem gelben Register entfernt und es q und der ersten Hälfte von z zugewiesen.

Wir betrachten nun die nicht zugeordnete untere Hälfte des tatsächlichen Bereichs z. Wir haben einen weiteren Konflikt, dieses Mal wird der aktive Bereich t verdrängt und aufgeteilt, die erste Hälfte von t und der letzte Teil von z verwenden letztendlich das grüne Register. Der mittlere Teil von Z entspricht der Anweisung q = t * y, wobei z nicht verwendet wird, also keinem Register zugeordnet ist und sein Wert vom gelben Register im Stapel gespeichert und später wieder in das grüne Register geladen wird . Das Gleiche passiert mit t. Dadurch werden dem Code zusätzliche Lade-/Speicheranweisungen hinzugefügt und die Leistung verringert. Das Ziel des Registerzuordnungsalgorithmus besteht darin, diese Ineffizienz zu minimieren. Dies wird als Belohnung für die Schulung der RL-Richtlinien verwendet.

Ähnlich wie die Inline-Größenrichtlinie wurde die Registerzuordnungsrichtlinie (Regalloc-for-Performance) auf einem großen Softwarepaket innerhalb von Google trainiert und kann auf verschiedene Software verallgemeinert und in einer Reihe interner großer Rechenzentren angewendet werden der Abfragen pro Sekunde (QPS) im Programm ist um 0,3 % bis 1,5 % gestiegen. Die QPS-Verbesserungen blieben mehrere Monate nach der Bereitstellung bestehen, was die Generalisierbarkeit des Modells beweist.

3 Zusammenfassung

MLGO nutzt Reinforcement Learning, um neuronale Netze zu trainieren, Entscheidungen zu treffen. Es handelt sich um eine maschinelle Lernstrategie, die komplexe heuristische Methoden ersetzt. Als allgemeines industrietaugliches Framework wird es in mehr Umgebungen als nur Inlining und Registerzuweisung umfassender und weiter verbreitet sein.

MLGO kann wie folgt entwickelt werden: 1) tiefer, z. B. durch das Hinzufügen weiterer Funktionen und die Anwendung besserer RL-Algorithmen; 2) umfassender, sodass mehr Optimierungsheuristiken über die Inlining- und Umverteilungsmethode hinaus angewendet werden können.

Die Autoren sind begeistert von den Möglichkeiten, die MLGO im Bereich der Compiler-Optimierung bieten kann, und freuen sich auf seine weitere Einführung und zukünftige Beiträge aus der Forschungsgemeinschaft.

Das obige ist der detaillierte Inhalt vonSpeicherreduzierung um 3–7 %! Google schlägt das Machine-Learning-Framework MLGO zur Compiler-Optimierung vor. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen