Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Architektura XLA

Dlaczego stworzyliśmy XLA?

Mieliśmy kilka celów, aby XLA współpracował z TensorFlow:

  • Popraw szybkość wykonywania. Skompiluj podgrafy, aby skrócić czas wykonywania krótkotrwałych operacji, aby wyeliminować narzut ze środowiska wykonawczego TensorFlow, połącz operacje potokowe w celu zmniejszenia narzutu pamięci i specjalizuj się w znanych kształtach tensorów, aby umożliwić bardziej agresywną stałą propagację.

  • Popraw wykorzystanie pamięci. Analizuj i planuj wykorzystanie pamięci, eliminując w zasadzie wiele pośrednich buforów pamięci.

  • Zmniejsz zależność od niestandardowych operacji. Zrezygnuj z wielu niestandardowych operacji, poprawiając wydajność automatycznie połączonych operacji niskiego poziomu, aby dopasować wydajność niestandardowych operacji połączonych ręcznie.

  • Zmniejsz ślad komórkowy. Wyeliminuj środowisko wykonawcze TensorFlow, kompilując z wyprzedzeniem podgraf i emitując parę obiekt / plik nagłówka, który można połączyć bezpośrednio z inną aplikacją. Wyniki mogą zmniejszyć wpływ wnioskowania mobilnego o kilka rzędów wielkości.

  • Popraw przenośność. Uczyń stosunkowo łatwo napisanie nowego zaplecza dla nowatorskiego sprzętu, w którym to momencie duża część programów TensorFlow będzie działać bez modyfikacji na tym sprzęcie. Kontrastuje to z podejściem polegającym na specjalizowaniu pojedynczych monolitycznych operacji dla nowego sprzętu, które wymaga przepisania programów TensorFlow w celu wykorzystania tych operacji.

Jak działa XLA?

Język wprowadzania do XLA nazywa się „HLO IR” lub po prostu HLO (Optymalizator wysokiego poziomu). Semantykę HLO opisano na stronie Semantyka operacji . Najwygodniej jest myśleć o HLO jako o kompilatorze IR .

XLA pobiera wykresy („obliczenia”) zdefiniowane w HLO i kompiluje je w instrukcje maszynowe dla różnych architektur. XLA jest modułowy w tym sensie, że można go łatwo umieścić w alternatywnym zapleczu, aby ukierunkować na jakąś nowatorską architekturę sprzętową . Backend procesora dla x64 i ARM64, a także zaplecze GPU NVIDIA znajdują się w drzewie źródłowym TensorFlow.

Poniższy diagram przedstawia proces kompilacji w XLA:

XLA zawiera kilka optymalizacji i przebiegów analizy, które są niezależne od celu, takich jak CSE , niezależna od celu fuzja operacji i analiza buforów w celu przydzielenia pamięci wykonawczej na potrzeby obliczeń.

Po kroku niezależnym od celu XLA wysyła obliczenia HLO do zaplecza. Backend może przeprowadzić dalsze optymalizacje na poziomie HLO, tym razem mając na uwadze określone informacje i potrzeby docelowe. Na przykład zaplecze procesora graficznego XLA może wykonać fuzję operacji, która jest korzystna szczególnie dla modelu programowania GPU i określić, jak podzielić obliczenia na strumienie. Na tym etapie backendy mogą również dopasowywać wzorce pewnych operacji lub ich kombinacji do zoptymalizowanych wywołań biblioteki.

Następnym krokiem jest generowanie kodu specyficznego dla celu. Backendy CPU i GPU zawarte w XLA używają LLVM do niskopoziomowego IR, optymalizacji i generowania kodu. Te backendy emitują LLVM IR niezbędne do reprezentowania obliczeń XLA HLO w efektywny sposób, a następnie wywołują LLVM w celu emitowania natywnego kodu z tego LLVM IR.

Zaplecze GPU obsługuje obecnie procesory graficzne NVIDIA za pośrednictwem zaplecza LLVM NVPTX; zaplecze procesora obsługuje wiele procesorów ISA.