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

Zoptymalizuj wydajność TensorFlow za pomocą Profiler

Użyj narzędzi dostępnych w Profiler, aby śledzić wydajność modeli TensorFlow. Zobacz, jak Twój model radzi sobie 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ęć) przez różne operacje TensorFlow w modelu i rozwiązać wąskie gardła wydajności, a ostatecznie przyspieszyć działanie modelu.

Ten przewodnik przeprowadzi Cię przez proces instalacji programu Profiler, różne dostępne narzędzia, różne tryby zbierania danych o wydajności przez Profiler oraz niektóre zalecane najlepsze rozwiązania w celu optymalizacji wydajności modelu.

Jeśli chcesz profilować wydajność swojego modelu w Cloud TPU, zapoznaj się z przewodnikiem Cloud TPU .

Zainstaluj wymagania wstępne programu Profiler i procesora GPU

Zainstaluj Profiler, pobierając i uruchamiając skrypt install_and_run.py z repozytorium GitHub .

Aby profilować na GPU, musisz:

  1. Zainstaluj CUDA® Toolkit 10.1 lub nowszy. CUDA® Toolkit 10.1 obsługuje tylko profilowanie pojedynczego GPU. Aby profilować wiele GPU, zobacz Profilowanie wielu GPU . Upewnij się, że wersja sterownika CUDA®, którą instalujesz, to przynajmniej 440.33 dla systemu Linux lub 441.22 dla systemu Windows.
  2. Upewnij się, że 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, dołącz jego katalog instalacyjny do $LD_LIBRARY_PATH środowiskowej $LD_LIBRARY_PATH , uruchamiając:

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

Uruchom ponownie powyższą komendę ldconfig aby sprawdzić, czy biblioteka CUPTI została znaleziona.

Profiluj wiele GPU

TensorFlow nie obsługuje jeszcze oficjalnie profilowania wielu GPU. Możesz zainstalować CUDA® Toolkit 10.2 lub nowszy, aby profilować wiele GPU. Ponieważ TensorFlow obsługuje wersje CUDA® Toolkit tylko do 10.1, utwórz dowiązania symboliczne do libcudart.so.10.1 i 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
 

Aby profilować konfiguracje GPU z wieloma pracownikami, profiluj poszczególnych pracowników niezależnie.

Rozwiąż problemy z uprawnieniami

Uruchamiając profilowanie za pomocą CUDA® Toolkit 10.1 w środowisku Docker lub w systemie Linux, mogą wystąpić problemy związane z niewystarczającymi uprawnieniami CUPTI_ERROR_INSUFFICIENT_PRIVILEGES ( CUPTI_ERROR_INSUFFICIENT_PRIVILEGES ). Zobacz dokumentację NVIDIA Developer Docs, aby dowiedzieć się więcej o tym, jak 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 z zakładki Profile w TensorBoard, która pojawia się dopiero po przechwyceniu niektórych danych modelu.

Profiler oferuje szereg narzędzi pomocnych w analizie wydajności:

  • Strona przeglądu
  • Analizator rurociągu wejściowego
  • Statystyki TensorFlow
  • Przeglądarka śledzenia
  • Statystyki jądra GPU
  • Narzędzie profilu pamięci

Strona przeglądu

Strona przeglądu zapewnia widok najwyższego poziomu pokazujący, jak model radził sobie podczas przebiegu profilu. Strona ta pokazuje zagregowaną stronę przeglądu dla twojego hosta i wszystkich urządzeń, a także niektóre zalecenia dotyczące poprawy wydajności treningu modelu. Możesz także wybrać poszczególne hosty z listy rozwijanej Host.

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

wizerunek

  • Podsumowanie wydajności - wyświetla ogólne podsumowanie wydajności modelu. Podsumowanie wyników składa się z dwóch części:

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

      • Kompilacja - czas spędzony na kompilowaniu jądra
      • Wejście - czas spędzony na odczytywaniu danych wejściowych
      • Wyjście - czas spędzony na odczytywaniu danych wyjściowych
      • Uruchomienie jądra - czas spędzony przez hosta na uruchamianiu jądra
      • Czas obliczeniowy hosta
      • Czas komunikacji między urządzeniami
      • Czas obliczeniowy na urządzeniu
      • Wszystkie inne, w tym narzut w Pythonie
    2. Dokładność obliczeń urządzenia - podaje procent czasu obliczeń urządzenia, w którym są wykorzystywane obliczenia 16- i 32-bitowe

  • Wykres czasu kroku - wyświetla wykres czasu kroku urządzenia (w milisekundach) dla wszystkich próbkowanych kroków. Każdy krok jest podzielony na wiele kategorii (o różnych kolorach), w których spędza się czas. Czerwony obszar odpowiada części czasu, w którym urządzenia pozostawały bezczynne, czekając na dane wejściowe z hosta. Zielony obszar pokazuje, jak długo urządzenie faktycznie działało

  • 10 najważniejszych operacji TensorFlow na urządzeniu - wyświetla operacje na urządzeniu, które działały najdłużej.

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

  • Środowisko uruchomieniowe - wyświetla ogólne podsumowanie środowiska uruchomieniowego modelu, w tym:

    • Liczba używanych hostów
    • Typ urządzenia (GPU / TPU)
    • Liczba rdzeni urządzenia
  • Zalecenia dotyczące kolejnych kroków - raporty, gdy model jest powiązany z danymi wejściowymi i zaleca narzędzia, których można użyć do zlokalizowania i rozwiązania wąskich gardeł wydajności modelu

Analizator rurociągu wejściowego

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

Typowy potok do odczytywania rekordów z plików składa się z następujących etapów:

  1. Czytanie plików
  2. Wstępne przetwarzanie plików (opcjonalnie)
  3. Przesyłanie plików z hosta do urządzenia

Nieefektywny potok wejściowy może poważnie spowolnić działanie aplikacji. Aplikacja jest uważana za powiązaną z danymi wejściowymi, gdy spędza znaczną część czasu w potoku wejściowym. Użyj szczegółowych informacji uzyskanych z analizatora potoku wejściowego, aby dowiedzieć się, gdzie potok wejściowy jest nieefektywny.

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

Zobacz wskazówki dotyczące wydajności potoku wejściowego, aby uzyskać zalecane najlepsze rozwiązania dotyczące optymalizacji potoków wejściowych danych.

Pulpit nawigacyjny potoku wejściowego

Aby otworzyć analizator potoku wejściowego, wybierz Profil , a następnie wybierz input_pipeline_analyzer z menu rozwijanego Narzędzia .

wizerunek

Pulpit zawiera trzy sekcje:

  1. Podsumowanie - podsumowuje ogólny potok wejściowy z informacjami o tym, czy aplikacja jest ograniczona do danych wejściowych, a jeśli tak, o ile
  2. Analiza po stronie urządzenia - wyświetla szczegółowe wyniki analizy po stronie urządzenia, w tym czas kroku urządzenia i zakres czasu spędzonego przez urządzenie na oczekiwaniu na dane wejściowe w rdzeniach na każdym kroku
  3. Analiza po stronie hosta - przedstawia szczegółową analizę po stronie hosta, w tym zestawienie czasu przetwarzania danych wejściowych na hoście

Podsumowanie potoku wejściowego

Podsumowanie informuje, czy dane wejściowe programu są ograniczone, przedstawiając procent czasu spędzonego przez urządzenie na oczekiwaniu na dane wejściowe z hosta. Jeśli używasz standardowego potoku wejściowego, który został oprzyrządowany, narzędzie zgłasza, 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ł na oczekiwaniu na dane wejściowe z hosta.

  1. Czas kroku wykreślony w odniesieniu do numeru kroku - wyświetla wykres czasu kroku urządzenia (w milisekundach) dla wszystkich próbkowanych kroków. Każdy krok jest podzielony na wiele kategorii (o różnych kolorach), w których spędza się czas. Czerwony obszar odpowiada części czasu, w którym urządzenia pozostawały bezczynne, czekając na dane wejściowe z hosta. Zielony obszar pokazuje, jak długo urządzenie faktycznie działało
  2. Statystyki czasu kroku - podaje średnią, odchylenie standardowe i zakres ([minimum, maksimum]) czasu kroku urządzenia

Analiza po stronie hosta

Analiza po stronie hosta informuje o rozbiciu czasu przetwarzania danych wejściowych (czasu spędzonego na tf.data interfejsu API tf.data ) na hoście na kilka kategorii:

  • Odczytywanie danych z plików na żądanie - czas spędzony na odczytywaniu danych z plików bez buforowania, wstępnego pobierania i przeplotu
  • Odczytywanie danych z plików z wyprzedzeniem - czas spędzony na czytaniu plików, w tym buforowanie, pobieranie wstępne i przeplot
  • Wstępne przetwarzanie danych - czas spędzony na operacjach wstępnego przetwarzania, takich jak dekompresja obrazu
  • Kolejkowanie danych do przesłania do urządzenia - czas spędzony na umieszczaniu danych w kolejce wejściowej przed przesłaniem danych do urządzenia

Rozwiń statystyki operacji wejściowych, aby wyświetlić statystyki dla poszczególnych operacji wejściowych i ich kategorii w podziale na czas wykonania.

wizerunek

Źródłowa tabela danych pojawia się z każdym wpisem zawierającym następujące informacje:

  1. Operacja wejścia - pokazuje nazwę operacji TensorFlow operacji wejściowej
  2. Licznik - pokazuje całkowitą liczbę wystąpień wykonania operacji w okresie profilowania
  3. Całkowity czas (w ms) - pokazuje łączną sumę czasu spędzonego na każdym z tych wystąpień
  4. % Całkowitego czasu - przedstawia całkowity czas spędzony na operacji jako ułamek całkowitego czasu spędzonego na przetwarzaniu danych wejściowych
  5. Całkowity czas własny (w ms) - pokazuje łączną sumę czasu własnego spędzonego na każdym z tych wystąpień. Tutaj czas własny mierzy czas spędzony wewnątrz ciała funkcji, z wyłączeniem czasu spędzonego w funkcji, którą wywołuje.
  6. Całkowity czas własny% . Pokazuje całkowity czas własny jako ułamek całkowitego czasu spędzonego na przetwarzaniu danych wejściowych
  7. Kategoria . Pokazuje kategorię przetwarzania wejścia op

Statystyki TensorFlow

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

wizerunek

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

  • W górnym panelu wyświetlane są maksymalnie cztery wykresy kołowe:

    1. Rozkład czasu samodzielnego wykonania każdej operacji na hoście
    2. Rozkład czasu samodzielnego wykonania każdego typu operacji na hoście
    3. Rozkład czasu samodzielnego wykonania każdej operacji na urządzeniu
    4. Rozkład czasu samodzielnego wykonania każdego typu operacji na urządzeniu
  • W dolnym okienku jest wyświetlana tabela zawierająca dane o operacjach TensorFlow z jednym wierszem dla każdej operacji i jedną kolumną dla każdego typu danych (posortuj kolumny, klikając nagłówek kolumny). Kliknij przycisk Eksportuj jako CSV po prawej stronie górnego panelu, aby wyeksportować dane z tej tabeli jako plik CSV.

    Zauważ, że:

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

      • Całkowity „skumulowany” czas operacji obejmuje czas spędzony wewnątrz operacji podrzędnych

      • Całkowity czas „własnej” operacji nie obejmuje czasu spędzonego wewnątrz operacji podrzędnych

    • Jeśli operacja jest wykonywana na hoście:

      • Odsetek całkowitego czasu samodzielnego spędzanego na urządzeniu w związku z opcją wyniesie 0
      • Skumulowany procent całkowitego czasu samodzielnego na urządzeniu do momentu włączenia tej operacji wyniesie 0
    • Jeśli operacja jest wykonywana na urządzeniu:

      • Procent całkowitego czasu poświęconego na własny użytek na hoście poniesionego w ramach tej operacji wyniesie 0
      • Skumulowany procent całkowitego czasu samodzielnego na hoście do momentu włączenia tej operacji wyniesie 0

Możesz uwzględnić lub wykluczyć czas bezczynności na wykresach kołowych i w tabeli.

Przeglądarka śledzenia

Przeglądarka śladów wyświetla oś czasu, która przedstawia:

  • Czas trwania operacji wykonanych przez 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 identyfikację problemów z wydajnością w modelu, a następnie podjęcie kroków w celu ich rozwiązania. Na przykład na wysokim poziomie można określić, czy uczenie danych wejściowych lub modelowych zajmuje większość czasu. Drążąc dalej, możesz określić, które operacje są wykonywane najdłużej. Należy pamiętać, że przeglądarka śledzenia jest ograniczona do 1 miliona zdarzeń na urządzenie.

Interfejs przeglądarki śledzenia

Po otwarciu przeglądarki danych śledzenia pojawia się ona z najnowszym przebiegiem:

wizerunek

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

  1. Okienko osi czasu - pokazuje operacje wykonywane przez urządzenie i host w czasie
  2. Okienko szczegółów - zawiera dodatkowe informacje dotyczące operacji wybranych w okienku Oś czasu

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

  1. Górny pasek - zawiera różne pomocnicze elementy sterujące
  2. Oś czasu - pokazuje czas względem początku śladu
  3. Etykiety sekcji i ścieżek - każda sekcja zawiera wiele ścieżek i ma trójkąt po lewej stronie, który można kliknąć, aby rozwinąć i zwinąć sekcję. Na każdy element przetwarzający w systemie przypada jedna sekcja
  4. Selektor narzędzi - zawiera różne narzędzia do interakcji z przeglądarką śladów, takie jak powiększenie, przesunięcie, zaznaczenie i synchronizacja. Użyj narzędzia Chronometraż, aby zaznaczyć przedział czasu.
  5. Zdarzenia - pokazują czas, w którym operacja została wykonana, lub czas trwania meta-zdarzeń, takich jak etapy treningu
Sekcje i ścieżki

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

  • Jedna sekcja dla każdego węzła urządzenia , oznaczona numerem chipa urządzenia i węzłem urządzenia w układzie (na przykład /device:GPU:0 (pid 0) ). Każda sekcja węzła urządzenia zawiera następujące ścieżki:
    • Krok - pokazuje czas trwania kroków treningowych, które były wykonywane na urządzeniu
    • TensorFlow Ops - . Pokazuje operacje wykonywane na urządzeniu
    • Operacje XLA - Pokazuje operacje XLA (operacje), które zostały uruchomione na urządzeniu, jeśli używanym kompilatorem jest XLA (każda operacja TensorFlow jest tłumaczona na jedną lub kilka operacji XLA. Kompilator XLA tłumaczy operacje XLA na kod, który działa na urządzeniu).
  • Jedna sekcja dla wątków działających na procesorze komputera głównego, oznaczona jako „Wątki hosta” . 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ą określonego znaczenia.

Przeglądarka śledzenia może również wyświetlać ślady wywołań funkcji Pythona w programie TensorFlow. Jeśli używasz interfejsu API tf.profiler.experimental.start() , możesz włączyć śledzenie w języku Python, używając opcji ProfilerOptions namedtuple podczas rozpoczynania profilowania. Alternatywnie, jeśli używasz trybu próbkowania do profilowania, możesz wybrać poziom śledzenia za pomocą opcji rozwijanych w oknie dialogowym Przechwyć profil .

wizerunek

Statystyki jądra GPU

To narzędzie pokazuje statystyki wydajności i początkowe operacje dla każdego jądra przyspieszanego przez GPU.

wizerunek

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

  • W górnym panelu wyświetlany jest wykres kołowy przedstawiający jądra CUDA, które mają najwyższy całkowity czas, jaki upłynął

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

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

Narzędzie profilu pamięci

Narzędzie Profil pamięci monitoruje użycie pamięci hosta lub urządzenia w okresie profilowania. Możesz użyć tego narzędzia, aby:

  • Debuguj problemy z brakiem pamięci (OOM), wskazując szczytowe użycie pamięci i odpowiednią alokację pamięci do operacji TensorFlow. Możesz również debugować problemy z OOM, które mogą wystąpić podczas wnioskowania o wielu dzierżawcach
  • 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 awarii pamięci

Podsumowanie profilu pamięci

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

Podsumowanie profilu pamięci ma sześć pól:

  1. Identyfikator pamięci - lista rozwijana zawierająca wszystkie dostępne systemy pamięci (host i urządzenie). Wybierz system pamięci, który chcesz wyświetlić z listy rozwijanej. Zauważ, że host jest wymieniony jako gpu_host_bfc
  2. #Allocation - liczba alokacji pamięci dokonanych w okresie profilowania
  3. #Deallocation - liczba zwolnień pamięci w interwale profilowania
  4. Pojemność pamięci - całkowita pojemność (w GiB) wybranego systemu pamięci
  5. Szczytowe użycie sterty - szczytowe użycie pamięci (w GiB) od momentu uruchomienia modelu
  6. Szczytowe użycie pamięci - szczytowe użycie pamięci (w GiB) w interwale profilowania. To pole zawiera następujące podpola:
    1. Sygnatura czasowa - sygnatura czasowa, kiedy wystąpiło szczytowe użycie pamięci na wykresie osi czasu
    2. Rezerwacja stosu - ilość pamięci zarezerwowanej na stosie (w GiB)
    3. Alokacja sterty - ilość pamięci przydzielonej na stercie (w GiB)
    4. Wolna pamięć - ilość wolnej pamięci (w GiB). Pojemność pamięci to suma rezerwacji stosu, alokacji sterty i wolnej pamięci
    5. Fragmentacja - procent fragmentacji (niższy tym lepiej). Jest obliczany jako procent (1 - Wielkość największego fragmentu wolnej pamięci / Całkowita wolna pamięć)

Wykres osi czasu pamięci

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

wizerunek

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 stronie przedstawia procent fragmentacji. W każdym momencie na osi X, całkowita pamięć jest podzielona na trzy kategorie: stos (na czerwono), stos (na pomarańczowo) i wolny (na zielono). Najedź kursorem na określoną sygnaturę czasową, aby wyświetlić szczegółowe informacje o zdarzeniach alokacji / zwalniania pamięci w tym momencie, jak poniżej:

wizerunek

W wyskakującym okienku wyświetlane są następujące informacje:

  • timestamp (ms) - lokalizacja wybranego zdarzenia na osi czasu
  • zdarzenie - typ zdarzenia (przydział lub cofnięcie alokacji)
  • request_size (GiBs) - ilość żądanej pamięci. Będzie to liczba ujemna w przypadku wydarzeń zwalniania
  • ocation_size (GiBs) - rzeczywista ilość przydzielonej pamięci. Będzie to liczba ujemna w przypadku wydarzeń zwalniania
  • tf_op - TensorFlow Op, który żąda alokacji / cofnięcia alokacji
  • step_id - etap szkolenia, w którym wystąpiło to zdarzenie
  • region_type - typ jednostki danych, dla którego jest przeznaczona ta przydzielona pamięć. Możliwe wartości to temp dla tymczasowych, output dla aktywacji i gradientów oraz persist / dynamic dla wag i stałych
  • data_type - typ elementu tensora (np. uint8 dla 8-bitowej liczby całkowitej bez znaku)
  • tensor_shape - kształt tensora, który jest przydzielany / zwalniany
  • memory_in_use (GiBs) - całkowita 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 punkcie szczytowego wykorzystania pamięci w interwale profilowania.

wizerunek

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

  • Op Name - nazwa TensorFlow op
  • Rozmiar alokacji (GiBs) - łączna ilość pamięci przydzielonej do tej operacji
  • Żądany rozmiar (GiBs) - całkowita ilość pamięci żądanej dla tej operacji
  • Wystąpienia - Liczba alokacji dla tej op
  • Typ regionu - typ jednostki danych, dla którego jest przeznaczona ta przydzielona pamięć. Możliwe wartości to temp dla tymczasowych, output dla aktywacji i gradientów oraz persist / dynamic dla wag i stałych
  • Typ danych - typ elementu tensora
  • Kształt - kształt przydzielonych tensorów

Zbierz dane dotyczące wydajności

TensorFlow Profiler zbiera działania hosta i ślady GPU modelu TensorFlow. Można skonfigurować Profiler do zbierania danych o wydajności w trybie programowym lub w trybie próbkowania.

Profilowanie API

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

 # 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 z wykorzystaniem funkcji API tf.profiler
 tf.profiler.experimental.start('logdir')
# Train the model here
tf.profiler.experimental.stop()
 
  • Tryb programowy z wykorzystaniem menedżera kontekstu
 with tf.profiler.experimental.Profile('logdir'):
    # Train the model here
    pass
 
  • Tryb próbkowania - wykonaj profilowanie na żądanie, używając tf.profiler.experimental.server.start() do uruchomienia serwera gRPC z uruchomionym modelem TensorFlow. Po uruchomieniu serwera gRPC i uruchomieniu modelu można przechwycić profil za pomocą przycisku Przechwyć profil we wtyczce profilu TensorBoard. Użyj skryptu w sekcji profilera instalacji powyżej, aby uruchomić instancję TensorBoard, jeśli nie jest jeszcze uruchomiona.

    Jako przykład,

 # Start a gRPC server at port 6009
tf.profiler.experimental.server.start(6009)
# ... TensorFlow program ...
 

W oknie dialogowym Przechwyć profil określ:

  • Adres URL usługi profilu lub nazwa TPU
  • Czas trwania profilowania
  • Poziom śledzenia wywołań funkcji urządzenia, hosta i funkcji w języku Python
  • Ile razy chcesz, aby Profiler ponawiał próbę przechwytywania profili, jeśli początkowo się to nie powiodło

Profilowanie niestandardowych pętli treningowych

Aby profilować niestandardowe pętle szkoleniowe w kodzie TensorFlow, oprzyrząduj pętlę szkoleniową za pomocą interfejsu API tf.profiler.experimental.Trace aby oznaczyć granice kroków dla Profiler. Argument name jest używany jako prefiks dla nazw kroków, argument słowa kluczowego step_num jest dołączany do nazw kroków, a argument _r słowo kluczowe sprawia, że ​​to zdarzenie śledzenia jest przetwarzane jako zdarzenie 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 Profiler i spowoduje, że zdarzenia kroku pojawią się w przeglądarce śledzenia.

Upewnij się, że uwzględniono iterator zestawu danych w kontekście tf.profiler.experimental.Trace celu dokładnej analizy potoku wejściowego.

Poniższy fragment kodu jest przeciwwzorem:

 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 na czterech różnych osiach. Niektóre kombinacje są obecnie obsługiwane, a inne zostaną dodane w przyszłości. Niektóre z przypadków użycia to:

  • Profilowanie lokalne a zdalne: Są to 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 na lokalnej stacji roboczej z procesorami GPU. W przypadku zdalnego profilowania interfejs API profilowania jest wywoływany na innym komputerze, z którego wykonuje model, na przykład na Cloud TPU.
  • Profilowanie wielu pracowników: można profilować wiele maszyn, korzystając z możliwości szkolenia rozproszonego TensorFlow.
  • Platforma sprzętowa: profilowe procesory CPU, GPU i TPU.

Poniższa tabela zawiera krótkie omówienie, które z powyższych przypadków użycia są obsługiwane przez różne interfejsy API profilowania w TensorFlow 2.3:

Profilowanie API Lokalny Zdalny Wielu pracowników Platformy sprzętowe
TensorBoard Keras Callback Utrzymany Nieobsługiwany Nieobsługiwany CPU, GPU
Funkcja API tf.experimental.profiler Utrzymany Nieobsługiwany Nieobsługiwany CPU, GPU
Interfejs API menedżera kontekstu Utrzymany Nieobsługiwany Nieobsługiwany CPU, GPU
API na żądanie Nieobsługiwany Utrzymany Ograniczone wsparcie CPU, GPU, TPU

Najlepsze rozwiązania dotyczące optymalnej wydajności modelu

Aby uzyskać optymalną wydajność, zastosuj się do poniższych zaleceń, odpowiednio do modeli TensorFlow.

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

Zoptymalizuj potok danych wejściowych

Wydajny potok wprowadzania danych może drastycznie zwiększyć szybkość wykonywania modelu poprzez skrócenie czasu bezczynności urządzenia. Rozważ uwzględnienie następujących najlepszych rozwiązań opisanych szczegółowo tutaj, aby zwiększyć wydajność potoku wprowadzania danych:

  • Pobierz dane z wyprzedzeniem
  • Równoległe wyodrębnianie danych
  • Równoległe przekształcanie danych
  • Buforuj dane w pamięci
  • Wektoryzuj funkcje zdefiniowane przez użytkownika
  • Zmniejsz zużycie pamięci podczas stosowania przekształceń

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

Popraw wydajność urządzenia

  • Zwiększenie rozmiaru mini partii treningowej (liczba próbek szkoleniowych używanych na urządzenie w jednej iteracji pętli szkoleniowej)
  • Użyj statystyk TF, aby dowiedzieć się, jak wydajnie działają operacje na urządzeniu
  • Użyj tf.function do wykonywania obliczeń i opcjonalnie włącz flagę experimental_compile
  • Zminimalizuj operacje hosta w języku Python między krokami i zmniejsz liczbę wywołań zwrotnych. Obliczaj metryki co kilka kroków zamiast na każdym kroku
  • Utrzymuj zajęte jednostki obliczeniowe urządzenia
  • Wysyłaj dane do wielu urządzeń równolegle
  • Zoptymalizuj układ danych, aby najpierw preferować kanały (np. NCHW zamiast NHWC). Niektóre procesory graficzne, takie jak NVIDIA® V100, działają lepiej z układem danych NHWC.
  • Rozważ użycie 16-bitowych reprezentacji liczbowych, takich jak fp16 , format zmiennoprzecinkowy o połowie precyzji określony przez IEEE lub format zmiennoprzecinkowy Brain bfloat16
  • Rozważ użycie interfejsu API o mieszanej precyzji Keras
  • Podczas treningu na procesorach graficznych korzystaj z TensorCore. Jądra GPU używają TensorCore, gdy precyzja wynosi fp16, a wymiary wejścia / wyjścia są podzielne przez 8 lub 16 (dla int8)

Dodatkowe zasoby