Pomoc chronić Wielkiej Rafy Koralowej z TensorFlow na Kaggle Dołącz Wyzwanie

Zoptymalizuj wydajność TensorFlow za pomocą Profilera

Ten przewodnik pokazuje, jak używać narzędzi dostępnych z TensorFlow Profiler do śledzenia wydajności modeli TensorFlow. Dowiesz się, jak zrozumieć, jak Twój model działa na hoście (CPU), urządzeniu (GPU) lub na kombinacji hosta i urządzenia (urządzeń).

Profilowanie pomaga zrozumieć zużycie zasobów sprzętowych (czas i pamięć) różnych operacji TensorFlow (ops) w modelu i rozwiązać wąskie gardła wydajności, a ostatecznie przyspieszyć wykonanie modelu.

Ten przewodnik poprowadzi Cię przez sposób instalowania programu Profiler, różne dostępne narzędzia, różne tryby zbierania danych dotyczących wydajności przez program Profiler oraz kilka zalecanych najlepszych praktyk w celu optymalizacji wydajności modelu.

Jeśli chcesz, aby profil wydajność modelu na chmurze TPU można znaleźć w przewodniku Chmura TPU .

Zainstaluj wymagania wstępne programu Profiler i GPU

Zainstaluj wtyczkę Profiler dla TensorBoard za pomocą pip. Zauważ, że Profiler wymaga najnowszych wersji TensorFlow i TensorBoard (>=2,2).

pip install -U tensorboard_plugin_profile

Aby profilować na GPU, musisz:

  1. Meet sterowniki NVIDIA GPU i wymagania CUDA® Toolkit wymienione na wymaganiach programowych wsparcie TensorFlow GPU .
  2. Upewnij się, że narzędzia NVIDIA® CUDA® profilowania Interfejs (CUPTI) istnieje na ścieżce:

    /sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH) | \
    grep libcupti
    

Jeśli nie masz CUPTI na ścieżce, poprzedź jego katalogu instalacyjnego do $LD_LIBRARY_PATH zmiennej środowiskowej uruchamiając:

export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH

Następnie uruchom ldconfig powyżej ponownie polecenie, aby sprawdzić, czy biblioteka CUPTI znaleziono.

Rozwiąż problemy z uprawnieniami

Po uruchomieniu profilowania z CUDA® Toolkit w środowisku Docker lub Linux, mogą wystąpić problemy związane z niewystarczającymi uprawnieniami CUPTI ( CUPTI_ERROR_INSUFFICIENT_PRIVILEGES ). Przejdź do Dokumentów NVIDIA Developer , aby dowiedzieć się więcej o tym, jak można rozwiązać te problemy w systemie Linux.

Aby rozwiązać problemy z uprawnieniami CUPTI w środowisku Docker, uruchom

docker run option '--privileged=true'

Narzędzia profilujące

Uzyskaj dostęp do Profiler na karcie Profile w TensorBoard, która pojawia się dopiero po niewoli niektóre dane modelowe.

Profiler posiada zestaw narzędzi pomagających w analizie wydajności:

  • Strona Przegląd
  • Analizator rurociągu wejściowego
  • Statystyki TensorFlow
  • Przeglądarka śledzenia
  • Statystyki jądra GPU
  • Narzędzie profilu pamięci
  • Podgląd podów

Strona Przegląd

Strona przeglądu zapewnia widok najwyższego poziomu, w jaki sposób model działał podczas uruchamiania profilu. Strona przedstawia zagregowaną stronę przeglądu hosta i wszystkich urządzeń oraz kilka zaleceń dotyczących poprawy wydajności uczenia modelu. Możesz także wybrać poszczególnych hostów w menu rozwijanym Host.

Strona przeglądu wyświetla dane w następujący sposób:

obraz

  • Wydajność Podsumowanie: Wyświetla podsumowanie wysokiego poziomu skuteczności modelu. Podsumowanie wyników składa się z dwóch części:

    1. Podział czasu krokowego: dzieli średni czas kroku na wiele kategorii, w których spędza się czas:

      • Kompilacja: Czas spędzony na kompilacji jąder.
      • Wejście: Czas spędzony na czytaniu danych wejściowych.
      • Output: Czas spędzony na czytaniu danych wyjściowych.
      • Uruchamianie jądra: czas poświęcony przez hosta na uruchomienie jąder
      • Czas obliczeniowy hosta...
      • Czas komunikacji urządzenie-urządzenie.
      • Czas obliczeniowy na urządzeniu.
      • Wszystkie inne, w tym obciążenie Pythona.
    2. Precyzja obliczeń urządzenia — podaje procent czasu obliczeń urządzenia przy użyciu obliczeń 16- i 32-bitowych.

  • Etap wykresie czasowym: Wyświetla wykres czasu w etapie urządzenie (ms) w ciągu wszystkich etapach próbą. Każdy krok jest podzielony na wiele kategorii (w różnych kolorach), w których spędza się czas. Czerwony obszar odpowiada części czasu, w którym urządzenia były bezczynne, czekając na dane wejściowe z hosta. Zielony obszar pokazuje, jak długo urządzenie faktycznie działało.

  • Top 10 operacji TensorFlow na urządzeniu (np GPU): Wyświetla OPS na urządzeniu, które prowadził najdłużej.

    Każdy wiersz wyświetla czas własny operacji (jako procent czasu zajętego przez wszystkie operacje), łączny czas, kategorię i nazwę.

  • Run Środowisko: Wyświetla podsumowanie wysokiego poziomu środowiska modelu run w tym:

    • Liczba używanych hostów.
    • Typ urządzenia (GPU/TPU).
    • Liczba rdzeni urządzenia.
  • Zalecenie dla Następny krok: Raporty gdy model jest wprowadzany związany i zaleca narzędzia można użyć do zlokalizowania i wąskich gardeł modelu rozwiązania.

Analizator rurociągów wejściowych

Kiedy program TensorFlow odczytuje dane z pliku, zaczyna się na górze wykresu TensorFlow w sposób potokowy. Proces odczytu podzielony jest na wiele etapów przetwarzania danych połączonych szeregowo, gdzie wyjście jednego etapu jest wejściem do następnego. Ten system odczytu danych nazywana jest rurociąg wejściowego.

Typowy potok odczytu rekordów z plików ma następujące etapy:

  1. Czytanie plików.
  2. Wstępne przetwarzanie plików (opcjonalnie).
  3. Transfer plików z hosta na urządzenie.

Niewydajny potok wejściowy może poważnie spowolnić aplikację. Wniosek jest uznany za wejście związany kiedy spędza znaczną część czasu w rurociągu wejściowym. Użyj informacji uzyskanych z analizatora potoku wejściowego, aby zrozumieć, gdzie potok wejściowy jest nieefektywny.

Analizator potoku wejściowego natychmiast informuje, czy program jest powiązany z danymi wejściowymi, i przeprowadza użytkownika przez analizę po stronie urządzenia i hosta w celu debugowania wąskich gardeł wydajności na dowolnym etapie potoku wejściowego.

Zapoznaj się ze wskazówkami dotyczącymi wydajności potoków wejściowych, aby uzyskać zalecane najlepsze rozwiązania dotyczące optymalizacji potoków wejściowych danych.

Pulpit nawigacyjny potoku wejściowego

Aby otworzyć analizator rurociągu Input, wybierz profil, a następnie wybierz z menu rozwijanego input_pipeline_analyzer Narzędzia.

obraz

Pulpit nawigacyjny zawiera trzy sekcje:

  1. Podsumowanie: Podsumowuje ogólnej rurociągu wejściowy z informacją o tym, czy aplikacja jest wejście związany i, jeśli tak, to o ile.
  2. Analiza po stronie urządzenia: Wyświetla szczegółowe, wyniki analizy po stronie urządzenia, w tym czasie kroku urządzenia i zakresie czasu spędzonego urządzenie czeka na dane wejściowe w poprzek rdzeni na każdym kroku.
  3. Analiza Host-side: pokazuje szczegółowa analiza po stronie przyjmującego, wraz z podziałem czasu przetwarzania wejście na hoście.

Podsumowanie potoku wejściowego

Podsumowanie donosi jeśli program wprowadzany jest związany przedstawiając procent czasu spędzonego na urządzenie czeka na wejście od gospodarza. Jeśli używasz standardowego potoku wejściowego, który został oprzyrządowany, narzędzie raportuje, gdzie spędza się większość czasu przetwarzania danych wejściowych.

Analiza po stronie urządzenia

Analiza po stronie urządzenia zapewnia wgląd w czas spędzony na urządzeniu w porównaniu z hostem oraz ile czasu urządzenie spędziło w oczekiwaniu na dane wejściowe z hosta.

  1. Czas kroku wykreślono wobec liczby kroków: Wyświetla wykres czasu w etapie urządzenie (ms) w ciągu wszystkich etapach próbą. Każdy krok jest podzielony na wiele kategorii (w różnych kolorach), w których spędza się czas. Czerwony obszar odpowiada części czasu, w którym urządzenia były bezczynne, czekając na dane wejściowe z hosta. Zielony obszar pokazuje, jak długo urządzenie faktycznie działało.
  2. Statystyki czas kroku: Podaje średnią, odchylenie standardowe i zasięg ([minimum, maksimum]), czas kroku urządzenia.

Analiza po stronie hosta

Analiza host-side donosi podział czasu przetwarzania wejściowego (czas spędzony na tf.data ops API) na hoście na kilka kategorii:

  • Odczyt danych z plików na żądanie: Czas spędzony na odczyt danych z plików bez buforowania, preselekcji, a przeplatanie.
  • Odczyt danych z plików z góry: Czas spędzony odczytu plików, w tym buforowanie, preselekcji, a przeplatanie.
  • Dane przerób: Czas spędzony na przerób ops, takich jak obraz dekompresji.
  • Enqueuing przesyłanie danych z urządzeniem: czas spędzony wprowadzenie danych w kolejce posuwu przed przekazaniem danych do urządzenia.

Rozwiń wejściowe Statystyka Op wglądu do statystyk dla poszczególnych ops wejściowych i ich kategorie z podziałem na czas wykonania.

obraz

Z każdym wpisem pojawi się tabela danych źródłowych zawierająca następujące informacje:

  1. Op wejściowe: Pokazuje TensorFlow nazwa op op wejściowego.
  2. Count: pokazuje całkowitą liczbę wystąpień wykonania op okresie profilowania.
  3. Całkowity czas (w ms): Pokazuje skumulowana suma czasu spędzonego na każdym z tych przypadków.
  4. Całkowity czas%: pokazuje całkowity czas op jako ułamek całkowitego czasu spędzonego w przetwarzaniu sygnału.
  5. Razem Własna Czas (w ms): Pokazuje skumulowana suma czasu spędzonego siebie na każdym z tych przypadków. W tym przypadku self-time mierzy czas spędzony w treści funkcji, z wyłączeniem czasu spędzonego w wywołanej funkcji.
  6. Całkowity czas Własna%. Pokazuje całkowity czas własny jako ułamek całkowitego czasu poświęconego na przetwarzanie danych wejściowych.
  7. Kategoria. Pokazuje kategorię przetwarzania wejścia op.

Statystyki TensorFlow

Narzędzie TensorFlow Stats wyświetla wydajność każdej operacji TensorFlow wykonywanej na hoście lub urządzeniu podczas sesji profilowania.

obraz

Narzędzie wyświetla informacje o wydajności w dwóch panelach:

  • W górnym okienku wyświetlane są do czterech wykresów kołowych:

    1. Rozkład czasu samodzielnego wykonania każdej operacji na hoście.
    2. Rozkład czasu samowykonania każdego typu operacji na hoście.
    3. Rozkład czasu samowykonania każdej operacji na urządzeniu.
    4. Rozkład czasu samowykonania każdego typu operacji na urządzeniu.
  • Dolny panel pokazuje tabelę, która raportuje dane o operacjach TensorFlow z jednym wierszem dla każdej operacji i jedną kolumną dla każdego typu danych (sortuj kolumny, klikając nagłówek kolumny). Kliknij przycisk Eksportuj jako CSV po prawej stronie górnego panelu, aby wyeksportować dane z tej tabeli w postaci pliku CSV.

    Zwróć uwagę, że:

    • Jeśli jakieś operacje mają operacje podrzędne:

      • Całkowity „zakumulowany” czas operacji obejmuje czas spędzony w operacjach podrzędnych.
      • Całkowity czas „własny” operacji nie obejmuje czasu spędzonego w ramach operacji potomnych.
    • Jeśli na hoście wykonywana jest operacja:

      • Procent całkowitego czasu samodzielnego na urządzeniu poniesiony przez opcję wyniesie 0.
      • Skumulowany procent całkowitego czasu samodzielnego korzystania z urządzenia do tej operacji włącznie wyniesie 0.
    • Jeśli operacja jest wykonywana na urządzeniu:

      • Procent całkowitego czasu samodzielnego na hoście poniesiony przez tę operację wyniesie 0.
      • Skumulowany procent całkowitego czasu samodzielnego na hoście do tej operacji włącznie wyniesie 0.

Możesz włączyć lub wyłączyć czas bezczynności na wykresach kołowych i w tabeli.

Przeglądarka śledzenia

Przeglądarka śledzenia wyświetla oś czasu, która pokazuje:

  • Czasy trwania operacji, które zostały wykonane przez Twój model TensorFlow
  • Która część systemu (host lub urządzenie) wykonała operację. Zazwyczaj host wykonuje operacje wejściowe, wstępnie przetwarza dane szkoleniowe i przesyła je do urządzenia, podczas gdy urządzenie wykonuje rzeczywiste szkolenie modelu

Przeglądarka śledzenia umożliwia identyfikowanie problemów z wydajnością w modelu, a następnie podejmowanie kroków w celu ich rozwiązania. Na przykład na wysokim poziomie można określić, czy trenowanie danych wejściowych lub modeli zajmuje większość czasu. Przechodząc do szczegółów, możesz określić, które operacje trwają najdłużej. Należy pamiętać, że przeglądarka śledzenia jest ograniczona do 1 miliona zdarzeń na urządzenie.

Interfejs przeglądarki śledzenia

Gdy otworzysz przeglądarkę śladów, pojawi się Twój ostatni bieg:

obraz

Ten ekran zawiera następujące główne elementy:

  1. Panel Timeline: Wyświetla ops, że urządzenie i gospodarz wykonywane w czasie.
  2. Szczegóły okienko: Pokazy dodatkowe informacje dla ops wybranych w oknie Timeline.

Panel Oś czasu zawiera następujące elementy:

  1. Górny pasek: Zawiera różne kontrole pomocnicze.
  2. Oś czasu: czasu pokazuje w stosunku do początku śladu.
  3. Sekcja i kolein Etykiety: Każda sekcja zawiera wiele utworów i ma trójkąt po lewej stronie, które można kliknąć, aby rozwinąć i zwinąć sekcję. Dla każdego elementu przetwarzającego w systemie jest jedna sekcja.
  4. Selektor narzędzie: Zawiera różne narzędzia do interakcji z widzem śladowych, takich jak Zoom, Pan, Select i rozrządu. Użyj narzędzia Pomiar czasu, aby oznaczyć przedział czasu.
  5. Wydarzenia: To pokazuje czas, podczas którego został wykonany op lub czas trwania meta wydarzeń, takich jak etapy szkolenia.
Sekcje i tory

Przeglądarka śledzenia zawiera następujące sekcje:

  • Jedna sekcja dla każdego węzła urządzenie, oznaczone numerem układzie urządzenia i węzłem urządzenie w układzie scalonym (na przykład /device:GPU:0 (pid 0) ). Każda sekcja węzła urządzenia zawiera następujące ścieżki:
    • Krok: Wyświetla czas trwania etapów szkolenia, które zostały uruchomione na urządzeniu
    • TensorFlow Ops: pokazuje ops wykonywane na urządzeniu
    • XLA Ops: Pokazy XLA operacji (PO), który biegł na urządzeniu, jeśli XLA jest kompilator użyty (każdy op TensorFlow przekłada się na jednym lub kilku ops XLA XLA kompilator tłumaczy ops XLA na kod, który działa na urządzeniu.).
  • Jeden punkt dla wątków uruchomionych na CPU urządzenia hosta, oznaczony „wątki gospodarz”. Sekcja zawiera jedną ścieżkę dla każdego wątku procesora. Pamiętaj, że możesz zignorować informacje wyświetlane obok etykiet sekcji.
Wydarzenia

Wydarzenia na osi czasu są wyświetlane w różnych kolorach; same kolory nie mają konkretnego znaczenia.

Przeglądarka śladów może również wyświetlać ślady wywołań funkcji Pythona w twoim programie TensorFlow. Jeśli używasz tf.profiler.experimental.start API można włączyć Python śledzenia za pomocą ProfilerOptions namedtuple podczas uruchamiania profilowania. Alternatywnie, w przypadku korzystania z trybu próbkowania do profilowania, można wybrać poziom śledzenia za pomocą rozwijanego menu opcji w oknie przechwytywania profili.

obraz

Statystyki jądra GPU

To narzędzie pokazuje statystyki wydajności i początkową operację dla każdego jądra akcelerowanego przez GPU.

obraz

Narzędzie wyświetla informacje w dwóch panelach:

  • W górnym okienku wyświetlany jest wykres kołowy, który pokazuje jądra CUDA, które mają najwyższy łączny czas, jaki upłynął.

  • W dolnym okienku wyświetlana jest tabela z następującymi danymi dla każdej unikalnej pary operacji jądra:

    • Pozycja w porządku malejącym całkowitego czasu trwania GPU, pogrupowana według pary kernel-op.
    • Nazwa uruchomionego jądra.
    • Liczba rejestrów GPU używanych przez jądro.
    • Całkowity rozmiar pamięci współdzielonej (statycznej + dynamicznej współdzielonej) używanej w bajtach.
    • Wymiar bloku wyrażone jako blockDim.x, blockDim.y, blockDim.z .
    • Wymiary siatki wyrażone jako gridDim.x, gridDim.y, gridDim.z .
    • Czy op jest uprawniony do korzystania Tensor rdzeni .
    • Czy jądro zawiera instrukcje Tensor Core.
    • Nazwa operacji, która uruchomiła to jądro.
    • Liczba wystąpień tej pary kernel-op.
    • Całkowity upływający czas GPU w mikrosekundach.
    • Średni czas GPU, który upłynął w mikrosekundach.
    • Minimalny czas GPU, który upłynął w mikrosekundach.
    • Maksymalny czas GPU, jaki upłynął w mikrosekundach.

Narzędzie profilu pamięci

Pamięć profilu narzędzie monitoruje zużycie pamięci z urządzenia podczas przedziału profilowania. Możesz użyć tego narzędzia do:

  • Debuguj problemy z brakiem pamięci (OOM), wskazując szczytowe użycie pamięci i odpowiednią alokację pamięci do operacji TensorFlow. Można również debugować problemy OOM, które mogą powstać podczas uruchamiania wielu najmu wnioskowanie.
  • Debuguj problemy z fragmentacją pamięci.

Narzędzie profilu pamięci wyświetla dane w trzech sekcjach:

  1. Podsumowanie profilu pamięci
  2. Wykres osi czasu pamięci
  3. Tabela podziału pamięci

Podsumowanie profilu pamięci

Ta sekcja wyświetla ogólne podsumowanie profilu pamięci Twojego programu TensorFlow, jak pokazano poniżej:

Podsumowanie profilu pamięci składa się z sześciu pól:

  1. ID Pamięć: rozwijane, które zawiera listę wszystkich dostępnych systemów pamięci urządzenia. Wybierz system pamięci, który chcesz wyświetlić z listy rozwijanej.
  2. #Allocation: liczba alokacji pamięci wykonanych podczas okresu profilowania.
  3. #Deallocation: liczba deallocations pamięci w przedziale profilowania
  4. Pojemność pamięci: Całkowita pojemność (w GINB) układu pamięci, który wybrać.
  5. Szczyt Heap Zastosowanie: Użycie pamięci szczyt (w GINB), ponieważ model zaczął biec.
  6. Wykorzystanie szczyt Pamięć: Wykorzystanie pamięci szczyt (w GINB) w przedziale profilowania. To pole zawiera następujące podpola:
    1. Znacznik czasu: Znacznik czasu, kiedy zużycie pamięci wystąpił pik na linii czasu wykres.
    2. Stos Rezerwacja: Ilość pamięci zarezerwowana na stosie (w GINB).
    3. Heap Przeznaczenie: Wielkość pamięci przydzielonej na stercie (w GINB).
    4. Wolna pamięć: ilość wolnej pamięci (w GINB). Pojemność pamięci to suma rezerwacji stosu, alokacji sterty i wolnej pamięci.
    5. Rozdrobnienie: procent fragmentacji (niższa, tym lepiej). Oblicza się ją jako procent (1 - Size of the largest chunk of free memory / Total free memory) .

Wykres osi czasu pamięci

Ta sekcja wyświetla wykres użycia pamięci (w GiB) i procent fragmentacji w funkcji czasu (w ms).

obraz

Oś X przedstawia oś czasu (w ms) interwału profilowania. Oś Y po lewej stronie reprezentuje użycie pamięci (w GiB), a oś Y po prawej reprezentuje procent fragmentacji. W każdym momencie na osi X całkowita pamięć jest podzielona na trzy kategorie: stos (na czerwono), sterta (na pomarańczowo) i wolna (na zielono). Najedź kursorem na określoną sygnaturę czasową, aby wyświetlić szczegółowe informacje o zdarzeniach alokacji/dealokacji pamięci w tym momencie, jak poniżej:

obraz

Wyskakujące okienko wyświetla następujące informacje:

  • znacznik czasu (ms): Położenie wybranego zdarzenia na osi czasu.
  • zdarzeń: typ zdarzenia (przydziału lub dealokacji).
  • requested_size (listew) ilość pamięci o. Będzie to liczba ujemna dla zdarzeń cofnięcia alokacji.
  • allocation_size (GINB): Rzeczywista ilość pamięci przydzielone. Będzie to liczba ujemna dla zdarzeń cofnięcia alokacji.
  • tf_op: PO TensorFlow że żąda alokacji / dealokacji.
  • step_id: Bieg treningowy, w którym to zdarzenie nastąpiło.
  • region_type: typ danych, które podmiot ten przeznaczono dla pamięci. Możliwe są następujące wartości temp dla tymczasowych, output dla aktywacji i gradientów oraz persist / dynamic dla wag i stałych.
  • data_type: Typ elementu napinacz (np Uint8 dla 8-bitowej liczby całkowitej bez znaku).
  • tensor_shape: Kształt tensora są przydzielane / zwalniane.
  • memory_in_use (listew) ilość pamięci, która jest używana w tym momencie.

Tabela podziału pamięci

W tej tabeli przedstawiono aktywne alokacje pamięci w momencie szczytowego użycia pamięci w interwale profilowania.

obraz

Dla każdego TensorFlow Op istnieje jeden wiersz, a każdy wiersz zawiera następujące kolumny:

  • Op Imię i nazwisko: Nazwa op TensorFlow.
  • Wielkość alokacji (GINB): Całkowita ilość pamięci przydzielonej do tej op.
  • Żądany rozmiar (GINB): Całkowita ilość pamięci o tej op.
  • Zdarzenia: liczba przydziałów dla tego op.
  • Rodzaj Region: typ danych, które podmiot ten przeznaczono dla pamięci. Możliwe są następujące wartości temp dla tymczasowych, output dla aktywacji i gradientów oraz persist / dynamic dla wag i stałych.
  • Typ danych: typ elementu tensor.
  • Kształt: Kształt przydzielonych tensorów.

Przeglądarka podów

Narzędzie Pod Viewer pokazuje podział etapu szkolenia dla wszystkich pracowników.

obraz

  • W górnym okienku znajduje się suwak do wybierania numeru kroku.
  • W dolnym okienku wyświetlany jest skumulowany wykres kolumnowy. Jest to widok wysokiego poziomu rozbitych kategorii krokowych umieszczonych jedna na drugiej. Każda kolumna skumulowana reprezentuje unikalnego pracownika.
  • Gdy najedziesz kursorem na skumulowaną kolumnę, karta po lewej stronie pokaże więcej szczegółów na temat podziału kroków.

analiza wąskiego gardła tf.data

tf.data narzędzie do analizy gardłem automatycznie wykrywa wąskie gardła w tf.data rurociągów wejściowych w programie i przedstawia zalecenia dotyczące sposobu, aby je naprawić. Współpracuje z dowolnym programem używając tf.data niezależnie od platformy (CPU / GPU / TPU). Jego analizy i zalecenia oparte są na tej prowadnicy .

Wykrywa wąskie gardło, wykonując następujące kroki:

  1. Znajdź hosta, który jest najczęściej powiązany z danymi wejściowymi.
  2. Znajdź najwolniejszą wykonanie tf.data rurociągu wejściowym.
  3. Zrekonstruuj wykres potoku wejściowego ze śladu profilera.
  4. Znajdź ścieżkę krytyczną na grafie potoku wejściowego.
  5. Zidentyfikuj najwolniejszą transformację na ścieżce krytycznej jako wąskie gardło.

Interfejs użytkownika jest podzielony na trzy sekcje: Analiza wyników Podsumowując, podsumowanie wszystkich rurociągów i wejścia Wejście Pipeline Graph.

Podsumowanie analizy wydajności

obraz

Ta sekcja zawiera podsumowanie analizy. Opisuje on powolnych tf.data rurociągów wejściowych wykrywanych w profilu. W tej sekcji przedstawiono również najbardziej powiązany z danymi wejściowymi host i jego najwolniejszy potok wejściowy z maksymalnym opóźnieniem. Co najważniejsze, identyfikuje, która część potoku wejściowego jest wąskim gardłem i jak to naprawić. Informacje o wąskim gardle są dostarczane z typem iteratora i jego długą nazwą.

Jak odczytać długą nazwę iteratora tf.data?

Długa nazwa jest sformatowana jako Iterator::<Dataset_1>::...::<Dataset_n> . W długiej nazwie <Dataset_n> pasuje do typu iterator i inne zbiory danych w dłuższej nazwy reprezentują dalszych przekształceń.

Rozważmy na przykład następujący wejściowy zestaw danych potoku:

dataset = tf.data.Dataset.range(10).map(lambda x: x).repeat(2).batch(5)

Długie nazwy iteratorów z powyższego zbioru danych będą następujące:

Typ iteratora Długie imię
Zasięg Iterator::Partia::Powtórz::Mapa::Zakres
Mapa Iterator::Partia::Powtórz::Mapa
Powtarzać Iterator::Partia::Powtórz
Seria Iterator::Partia

Podsumowanie wszystkich potoków wejściowych

obraz

Ta sekcja zawiera podsumowanie wszystkich potoków wejściowych na wszystkich hostach. Zazwyczaj istnieje jeden potok wejściowy. Podczas korzystania strategię dystrybucyjną, jest jeden rurociąg wejście host z programu tf.data kod i wiele potoków wejściowe urządzenie Odzyskiwanie danych z rurociągu wejściowym gospodarza i przeniesienie go do urządzenia.

Dla każdego potoku wejściowego pokazuje statystyki czasu jego wykonania. Połączenie jest liczone jako wolne, jeśli trwa dłużej niż 50 μs.

Wykres potoku wejściowego

obraz

W tej sekcji przedstawiono wykres potoku wejściowego z informacjami o czasie wykonania. Możesz użyć "Host" i "Potoku wejściowego", aby wybrać hosta i potok wejściowy do wyświetlenia. Egzekucje rurociągu wejściowym są klasyfikowane według czasu realizacji zlecenia w którym można wybrać za pomocą Rank rozwijaną malejącym.

obraz

Węzły na ścieżce krytycznej mają pogrubione kontury. Węzeł wąskiego gardła, który jest węzłem o najdłuższym czasie własnym na ścieżce krytycznej, ma czerwony kontur. Pozostałe niekrytyczne węzły mają szare, przerywane kontury.

W każdym węźle, czas rozpoczęcia wskazuje czas rozpoczęcia egzekucji. Ten sam węzeł może być wykonywana wielokrotnie, na przykład, jeśli istnieje Batch op w rurociągu wejściowym. Jeśli jest wykonywany wiele razy, jest to czas rozpoczęcia pierwszego wykonania.

Całkowity czas trwania to czas ściana egzekucji. Jeśli jest wykonywany wiele razy, jest to suma czasów muru wszystkich egzekucji.

Własna czas Całkowity czas bez czasu pokrywa się z jej bezpośrednimi węzłów potomnych.

„# Calls” to liczba wykonywanych potoków wejściowych.

Zbieraj dane o wydajności

TensorFlow Profiler zbiera aktywności hosta i ślady GPU Twojego modelu TensorFlow. Profiler można skonfigurować tak, aby zbierał dane o wydajności w trybie programistycznym lub w trybie próbkowania.

Profilowanie API

Do profilowania można użyć następujących interfejsów API.

  • Tryb programowy pomocą TensorBoard Keras oddzwanianie ( tf.keras.callbacks.TensorBoard )

    # Profile from batches 10 to 15
    tb_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir,
                                                 profile_batch='10, 15')
    
    # Train the model and use the TensorBoard Keras callback to collect
    # performance profiling data
    model.fit(train_data,
              steps_per_epoch=20,
              epochs=5,
              callbacks=[tb_callback])
    
  • Tryb programowy pomocą tf.profiler API Function

    tf.profiler.experimental.start('logdir')
    # Train the model here
    tf.profiler.experimental.stop()
    
  • Tryb programowy przy użyciu menedżera kontekstu

    with tf.profiler.experimental.Profile('logdir'):
        # Train the model here
        pass
    

  • Tryb próbkowania: Wykonać na żądanie profilowania za pomocą tf.profiler.experimental.server.start uruchomić serwer gRPC z biegu modelu TensorFlow. Po uruchomieniu serwera gRPC i działa model, można uchwycić profil poprzez wychwytywanie przycisk Profil w wtyczce profilu TensorBoard. Użyj skryptu w sekcji Install profiler powyżej, aby uruchomić instancję TensorBoard, jeśli nie jest jeszcze uruchomiona.

    Jako przykład,

    # Start a profiler server before your model runs.
    tf.profiler.experimental.server.start(6009)
    # (Model code goes here).
    #  Send a request to the profiler server to collect a trace of your model.
    tf.profiler.experimental.client.trace('grpc://localhost:6009',
                                          'gs://your_tb_logdir', 2000)
    

    Przykład profilowania wielu pracowników:

    # E.g. your worker IP addresses are 10.0.0.2, 10.0.0.3, 10.0.0.4, and you
    # would like to profile for a duration of 2 seconds.
    tf.profiler.experimental.client.trace(
        'grpc://10.0.0.2:8466,grpc://10.0.0.3:8466,grpc://10.0.0.4:8466',
        'gs://your_tb_logdir',
        2000)
    

Użyj okna przechwytywania profilu w celu określenia:

  • Rozdzielana przecinkami lista adresów URL usług profilu lub nazw TPU.
  • Czas trwania profilowania.
  • Poziom śledzenia wywołań funkcji urządzenia, hosta i funkcji Pythona.
  • Ile razy Profiler ma ponawiać próby przechwycenia profili, jeśli początkowo nie powiedzie się.

Profilowanie własnych pętli treningowych

Pętle do profilu niestandardowego szkoleniowe w kodzie TensorFlow, instrument pętla szkolenie z tf.profiler.experimental.Trace API oznaczyć granice krok dla Profiler.

name argumentem jest stosowany jako przedrostek do nazwy kroku step_num kluczowe argumentem jest dołączany w nazwach kroku, a _r argumentem słów kluczowych sprawia, że wydarzenie to ślad dostać przetwarzane jako wydarzenie kroku przez Profiler.

Jako przykład,

for step in range(NUM_STEPS):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_data = next(dataset)
        train_step(train_data)

Umożliwi to analizę wydajności opartą na krokach programu Profiler i spowoduje, że zdarzenia kroków będą wyświetlane w przeglądarce śledzenia.

Upewnij się, że zawierają iterator zestawu danych w obrębie tf.profiler.experimental.Trace kontekście na dokładną analizę rurociągu wejściowym.

Poniższy fragment kodu jest antywzorcem:

for step, train_data in enumerate(dataset):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_step(train_data)

Profilowanie przypadków użycia

Profiler obejmuje szereg przypadków użycia wzdłuż czterech różnych osi. Niektóre kombinacje są obecnie obsługiwane, a inne zostaną dodane w przyszłości. Niektóre przypadki użycia to:

  • Lokalna vs. zdalnego profilowania: Są dwa typowe sposoby konfigurowania środowiska profilowania. W profilowaniu lokalnym interfejs API profilowania jest wywoływany na tej samej maszynie, którą wykonuje model, na przykład lokalna stacja robocza z procesorami GPU. W przypadku profilowania zdalnego interfejs API profilowania jest wywoływany na innym komputerze niż ten, na którym wykonywany jest model, na przykład w Cloud TPU.
  • Profilowania wielu robotników: Można profil wielu komputerów przy użyciu rozproszonych możliwości szkoleniowych TensorFlow.
  • Platforma sprzętowa: CPU, GPU, profilu i TPU.

Poniższa tabela zawiera krótki przegląd wspomnianych powyżej przypadków użycia obsługiwanych przez TensorFlow:

Profilowanie API Lokalny Zdalny Wielu pracowników Platformy sprzętowe
TensorBoard Keras Callback Utrzymany Nieobsługiwany Nieobsługiwany CPU, GPU
tf.profiler.experimental start / stop API Utrzymany Nieobsługiwany Nieobsługiwany CPU, GPU
tf.profiler.experimental client.trace API Utrzymany Utrzymany Utrzymany Procesor, GPU, TPU
Interfejs API menedżera kontekstu Utrzymany Nieobsługiwany Nieobsługiwany CPU, GPU

Najlepsze praktyki dla optymalnej wydajności modelu

Skorzystaj z poniższych zaleceń, jeśli mają zastosowanie do modeli TensorFlow, aby osiągnąć optymalną wydajność.

Ogólnie rzecz biorąc, wykonaj wszystkie przekształcenia na urządzeniu i upewnij się, że korzystasz z najnowszej zgodnej wersji bibliotek, takich jak cuDNN i Intel MKL dla swojej platformy.

Zoptymalizuj potok danych wejściowych

Użyj danych z [#input_pipeline_analyzer], aby zoptymalizować potok wprowadzania danych. Wydajny potok wprowadzania danych może znacznie zwiększyć szybkość wykonywania modelu, skracając czas bezczynności urządzenia. Próby włączenia najlepszych praktyk wyszczególnionych w wykonywaniu lepiej z API tf.data przewodnika i poniżej, aby Twoje dane wejściowe rurociąg bardziej wydajne.

  • Ogólnie rzecz biorąc, zrównoleglenie dowolnych operacji, które nie muszą być wykonywane sekwencyjnie, może znacznie zoptymalizować potok wprowadzania danych.

  • W wielu przypadkach pomaga zmienić kolejność niektórych wywołań lub dostroić argumenty tak, aby działały najlepiej dla twojego modelu. Podczas optymalizacji potoku danych wejściowych porównaj tylko program ładujący dane bez kroków uczenia i propagacji wstecznej, aby niezależnie określić ilościowo wpływ optymalizacji.

  • Spróbuj uruchomić model z danymi syntetycznymi, aby sprawdzić, czy potok wejściowy jest wąskim gardłem wydajności.

  • Zastosowanie tf.data.Dataset.shard szkolenia multi-GPU. Upewnij się, że fragmentujesz bardzo wcześnie w pętli wejściowej, aby zapobiec zmniejszeniu przepustowości. Podczas pracy z TFRecords, upewnij się, że dzielisz listę TFRecords, a nie zawartość TFRecords.

  • Parallelize kilka ops dynamicznie ustawienie wartości num_parallel_calls korzystających tf.data.AUTOTUNE .

  • Rozważyć ograniczenie wykorzystania tf.data.Dataset.from_generator jak jest mniejsza w porównaniu do czystych ops TensorFlow.

  • Rozważyć ograniczenie wykorzystania tf.py_function ponieważ nie może być w odcinkach i nie jest obsługiwany do pracy w rozproszonym TensorFlow.

  • Stosować tf.data.Options kontrolować statycznych optymalizacje do rurociągu wejściowym.

Również przeczytać tf.data analizy wydajności instrukcji , aby uzyskać więcej wskazówek dotyczących optymalizacji rurociągu wejściowego.

Zoptymalizuj powiększanie danych

Podczas pracy z danymi obrazu, dokonać powiększenie dane bardziej wydajny oddając do różnych typów danych po zastosowaniu przekształceń przestrzennych, takich jak odwracanie, przycinanie, obracanie, itp

Użyj NVIDIA® DALI

W niektórych przypadkach, na przykład w przypadku systemu z wysokim stosunkiem GPU do CPU, wszystkie powyższe optymalizacje mogą nie wystarczyć do wyeliminowania wąskich gardeł w programie ładującym dane spowodowanych ograniczeniami cykli procesora.

Jeśli używasz NVIDIA® GPU dla wizji komputerowej i Audio głębokich uczenia się, należy rozważyć użycie ładowanie danych Library ( DALI ) w celu przyspieszenia rurociągu danych.

Sprawdź NVIDIA® DALI: Operacje dokumentacji Listę obsługiwanych ops DALI.

Użyj wątków i wykonywania równoległego

Ops prowadzone na wielu wątków procesora z tf.config.threading API wykonać je szybciej.

TensorFlow domyślnie automatycznie ustawia liczbę wątków równoległości. Pula wątków dostępna do uruchamiania operacji TensorFlow zależy od liczby dostępnych wątków procesora.

Kontrolować maksymalną równolegle przyspieszenie dla pojedynczego op stosując tf.config.threading.set_intra_op_parallelism_threads . Zauważ, że jeśli uruchomisz wiele operacji równolegle, wszystkie będą współdzielić dostępną pulę wątków.

Jeśli masz niezależnych non-blocking OPS (OPS z żadnym skierowanej ścieżki między nimi na wykresie), użyj tf.config.threading.set_inter_op_parallelism_threads uruchomić je jednocześnie za pomocą dostępnej puli wątków.

Różnorodny

Podczas pracy z mniejszych modeli na NVIDIA® GPU, można ustawić tf.compat.v1.ConfigProto.force_gpu_compatible=True zmusić wszystkie tensory CPU, które zostaną przyznane z CUDA przypięty pamięci dać znaczący impuls do wykonania modelu. Należy jednak zachować ostrożność podczas korzystania z tej opcji w przypadku nieznanych/bardzo dużych modeli, ponieważ może to negatywnie wpłynąć na wydajność hosta (procesora).

Popraw wydajność urządzenia

Postępuj zgodnie z najlepszymi praktykami wyszczególnione tutaj iw wydajności GPU przewodniku optymalizacji w celu optymalizacji wydajności modelu TensorFlow na urządzeniu.

Jeśli korzystasz z procesorów graficznych NVIDIA, zarejestruj wykorzystanie procesora GPU i pamięci w pliku CSV, uruchamiając:

nvidia-smi
--query-gpu=utilization.gpu,utilization.memory,memory.total,
memory.free,memory.used --format=csv

Skonfiguruj układ danych

Podczas pracy z danymi, które zawierają informacje o kanale (np. obrazy), zoptymalizuj format układu danych, aby preferować kanały jako ostatnie (NHWC nad NCHW).

Kanału ostatnie formaty danych poprawić Tensor rdzenia wykorzystania i zapewniają znaczną poprawę wydajności, zwłaszcza w modelach splotowych w połączeniu z AMP. Układy danych NCHW mogą nadal być obsługiwane przez rdzenie Tensor, ale wprowadzają dodatkowe obciążenie ze względu na automatyczne operacje transpozycji.

Można zoptymalizować układ danych wolą układy NHWC ustawiając data_format="channels_last" dla warstw takich jak tf.keras.layers.Conv2D , tf.keras.layers.Conv3D i tf.keras.layers.RandomRotation .

Zastosowanie tf.keras.backend.set_image_data_format ustawić domyślny format układ danych dla Keras backend API.

Zmaksymalizuj pamięć podręczną L2

When working with NVIDIA® GPUs, execute the code snippet below before the training loop to max out the L2 fetch granularity to 128 bytes.

import ctypes

_libcudart = ctypes.CDLL('libcudart.so')
# Set device limit on the current device
# cudaLimitMaxL2FetchGranularity = 0x05
pValue = ctypes.cast((ctypes.c_int*1)(), ctypes.POINTER(ctypes.c_int))
_libcudart.cudaDeviceSetLimit(ctypes.c_int(0x05), ctypes.c_int(128))
_libcudart.cudaDeviceGetLimit(pValue, ctypes.c_int(0x05))
assert pValue.contents.value == 128

Configure GPU thread usage

The GPU thread mode decides how GPU threads are used.

Set the thread mode to gpu_private to make sure that preprocessing does not steal all the GPU threads. This will reduce the kernel launch delay during training. You can also set the number of threads per GPU. Set these values using environment variables.

import os

os.environ['TF_GPU_THREAD_MODE']='gpu_private'
os.environ['TF_GPU_THREAD_COUNT']='1'

Configure GPU memory options

In general, increase the batch size and scale the model to better utilize GPUs and get higher throughput. Note that increasing the batch size will change the model's accuracy so the model needs to be scaled by tuning hyperparameters like the learning rate to meet the target accuracy.

Also, use tf.config.experimental.set_memory_growth to allow GPU memory to grow to prevent all the available memory from being fully allocated to ops that require only a fraction of the memory. This allows other processes which consume GPU memory to run on the same device.

To learn more, check out the Limiting GPU memory growth guidance in the GPU guide to learn more.

Miscellaneous

  • Increase the training mini-batch size (number of training samples used per device in one iteration of the training loop) to the maximum amount that fits without an out of memory (OOM) error on the GPU. Increasing the batch size impacts the model's accuracy—so make sure you scale the model by tuning hyperparameters to meet the target accuracy.

  • Disable reporting OOM errors during tensor allocation in production code. Set report_tensor_allocations_upon_oom=False in tf.compat.v1.RunOptions .

  • For models with convolution layers, remove bias addition if using batch normalization. Batch normalization shifts values by their mean and this removes the need to have a constant bias term.

  • Use TF Stats to find out how efficiently on-device ops run.

  • Use tf.function to perform computations and optionally, enable the jit_compile=True flag ( tf.function(jit_compile=True ). To learn more, go to Use XLA tf.function .

  • Minimize host Python operations between steps and reduce callbacks. Calculate metrics every few steps instead of at every step.

  • Keep the device compute units busy.

  • Send data to multiple devices in parallel.

  • Consider using 16-bit numerical representations , such as fp16 —the half-precision floating point format specified by IEEE—or the Brain floating-point bfloat16 format.

Additional resources

Known limitations

Profiling multiple GPUs on TensorFlow 2.2 and TensorFlow 2.3

TensorFlow 2.2 and 2.3 support multiple GPU profiling for single host systems only; multiple GPU profiling for multi-host systems is not supported. To profile multi-worker GPU configurations, each worker has to be profiled independently. From TensorFlow 2.4 multiple workers can be profiled using the tf.profiler.experimental.client.trace API.

CUDA® Toolkit 10.2 or later is required to profile multiple GPUs. As TensorFlow 2.2 and 2.3 support CUDA® Toolkit versions only up to 10.1, you need to create symbolic links to libcudart.so.10.1 and libcupti.so.10.1 :

sudo ln -s /usr/local/cuda/lib64/libcudart.so.10.2 /usr/local/cuda/lib64/libcudart.so.10.1
sudo ln -s /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.2 /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.1