Optymalizowanie wydajności TensorFlow za pomocą XProf

Z tego przewodnika dowiesz się, jak za pomocą narzędzi dostępnych w XProf śledzić wydajność modeli TensorFlow na hoście (CPU), urządzeniu (GPU) lub na kombinacji hosta i urządzeń.

Profilowanie pomaga zrozumieć zużycie zasobów sprzętowych (czasu i pamięci) przez różne operacje TensorFlow (ops) w modelu, rozwiązywać problemy z wydajnością i ostatecznie przyspieszać wykonywanie modelu.

Z tego przewodnika dowiesz się, jak korzystać z różnych dostępnych narzędzi i jakie są różne tryby zbierania danych o wydajności przez Profiler.

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

Zbieranie danych o skuteczności

XProf zbiera aktywności hosta i ślady GPU Twojego modelu TensorFlow. XProf możesz skonfigurować tak, aby zbierał dane o skuteczności w trybie programowym lub w trybie próbkowania.

Interfejsy API profilowania

Do profilowania możesz używać tych interfejsów API:

  • Tryb automatyzacji z użyciem wywołania zwrotnego TensorBoard Keras (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 z użyciem interfejsu API funkcji tf.profiler

    tf.profiler.experimental.start('logdir')
    # Train the model here
    tf.profiler.experimental.stop()
    
  • Tryb programowy z użyciem 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, aby uruchomić serwer gRPC z modelem TensorFlow. Po uruchomieniu serwera gRPC i modelu możesz zarejestrować profil, klikając przycisk Capture Profile (Zarejestruj profil) w XProf. Jeśli TensorBoard nie jest jeszcze uruchomiony, użyj skryptu z sekcji Instalowanie profilera powyżej, aby uruchomić instancję TensorBoard.

    Na 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)
    

Okno dialogowe Zarejestruj profil

W oknie Zapisz profil określ:

  • Rozdzielana przecinkami lista adresów URL usługi tworzenia profilu lub nazw TPU.
  • czas profilowania.
  • Poziom śledzenia wywołań funkcji urządzenia, hosta i Pythona.
  • Liczba ponownych prób przechwytywania profili przez Profiler, jeśli pierwsza próba się nie powiedzie.

Profilowanie niestandardowych pętli trenowania

Aby profilować niestandardowe pętle trenowania w kodzie TensorFlow, użyj interfejsu tf.profiler.experimental.Trace API do oznaczenia granic kroków w pętli trenowania na potrzeby XProf.

Argument name jest używany jako prefiks nazw kroków, argument słowa kluczowego step_num jest dołączany do nazw kroków, a argument słowa kluczowego _r sprawia, że to zdarzenie śledzenia jest przetwarzane przez XProf jako zdarzenie kroku.

Na 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 XProf na podstawie kroków i spowoduje wyświetlanie zdarzeń kroków w przeglądarce śladów.

Aby uzyskać dokładną analizę potoku wejściowego, umieść iterator zbioru danych w kontekście tf.profiler.experimental.Trace.

Poniższy fragment kodu jest przykładem nieprawidłowego wzorca:

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

Przypadki użycia profilowania

Profiler obejmuje wiele przypadków użycia w 4 różnych obszarach. Niektóre kombinacje są obecnie obsługiwane, a inne zostaną dodane w przyszłości. Przykłady zastosowań:

  • Profilowanie lokalne i zdalne: to 2 popularne sposoby konfigurowania środowiska profilowania. W profilowaniu lokalnym interfejs API profilowania jest wywoływany na tym samym komputerze, na którym jest wykonywany model, np. na lokalnej stacji roboczej z procesorami GPU. W profilowaniu zdalnym interfejs API profilowania jest wywoływany na innym komputerze niż ten, na którym jest wykonywany model, np. na Cloud TPU.
  • Profilowanie wielu procesów roboczych: możesz profilować wiele maszyn, korzystając z możliwości trenowania rozproszonego TensorFlow.
  • Platforma sprzętowa: profilowanie procesorów, procesorów graficznych i TPU.

W tabeli poniżej znajdziesz krótkie omówienie wymienionych powyżej przypadków użycia obsługiwanych przez TensorFlow:

Profiling API Lokalne Zdalne Wielu pracowników Platformy sprzętowe
Wywołanie zwrotne TensorBoard Keras Obsługiwane Nieobsługiwane Nieobsługiwane CPU, GPU
tf.profiler.experimental uruchamianie i zatrzymywanie interfejsu API Obsługiwane Nieobsługiwane Nieobsługiwane CPU, GPU
tf.profiler.experimental client.trace API Obsługiwane Obsługiwane Obsługiwane CPU, GPU, TPU
Context manager API Obsługiwane Nieobsługiwane Nieobsługiwane CPU, GPU

Dodatkowe materiały