Skip to main content
  • Place orders quickly and easily
  • View orders and track your shipping status
  • Enjoy members-only rewards and discounts
  • Create and access a list of your products
  • Manage your Dell EMC sites, products, and product-level contacts using Company Administration.

Techniki optymalizacji szkolenia CheXNet na komputerach Dell C4140 z kartami graficznymi Nvidia V100

Summary: Najlepsze praktyki w celu osiągnięcia maksymalnej wydajności na szkoleniach w zakresie rozproszonego skalowania w CheXNet z wykorzystaniem kart graficznych Nvidia V100 SXM2 w serwerach Dell EMC C4140. ...

This article may have been automatically translated. If you have any feedback regarding its quality, please let us know using the form at the bottom of this page.

Article Content


Symptoms

Artykuł został napisany przez Rakshitha Vasudeva i Johna Lockmana z HPC AI Innovation Lab w październiku 2019 r.

Cause

  -

Resolution

Jak wspomniano wcześniej, CheXNet jest modelem opartego na sztucznej inteligencji asystenta radiologicznego, który z użyciem DenseNet identyfikuje do 14 zmian patologicznych w danym obrazie rentgenowskim klatki piersiowej. Zbadano kilka podejść w celu skalowania szkoleń modelu, który może działać równie dobrze lub lepiej niż oryginalny CheXNet-121 z ResNet-50, spełniając obietnice zarówno skalowalności, jak i większej dokładności szkoleń (pozytywne AUROC). Autorzy wykazali skalowalność w systemach procesorów, jednak chcemy wykorzystać równoległość procesorów graficznych w celu przyspieszenia procesu szkoleniowego. W tym artykule opisano najlepsze praktyki w celu osiągnięcia maksymalnej wydajności na szkoleniach w zakresie rozproszonego skalowania w CheXNet z wykorzystaniem kart graficznych Nvidia V100 SXM2 w serwerach Dell EMC C4140. Serwer Dell EMC PowerEdge C4140 zapewnia gęstość i wydajność dzięki czterem kartom graficznym Nvidia V100 w konfiguracji SXM2.


 

Konfiguracja sprzętu: Konfiguracja oprogramowania:
  • 4 serwery PowerEdge C4140
  • 4 moduły Nvidia V100 32 GB SXM2
  • 2 20-rdzeniowe procesory Intel(R) Xeon(R) Gold 6148 przy 2,40 GHz
  • 384 GB pamięci RAM, DDR4 2666 MHz
  • 1 Mellanox EDR HCA
  • System plików Lustre
  • Struktura głębokiego uczenia: tensorflow-gpu
  • Wersja struktury: 1.12.0
  • Wersja Horovod: 0.16.4
  • MPI version: 4.0.0 z obsługą cuda i ucx
  • CUDA version: 10.1.105
  • CUDNN version: 7.6.0
  • NCCL version: 2.4.7
  • Wersja Python: 3.6.8
  • System operacyjny i wersja: RHEL 7.4


 


Kanał przepływu danych ma kluczowe znaczenie dla uzyskania jak najlepszej wydajności akceleratorów:



 

Co to są dane tf, dlaczego warto z nich korzystać?

 

Ponieważ nowe urządzenia obliczeniowe (takie jak procesory graficzne i jednostki TPU) umożliwiają szkolenie sieci neuronowych z coraz większą szybkością, przetwarzanie procesora może stać się wąskim gardłem. Interfejs API tf.data zapewnia użytkownikom elementy konstrukcyjne do projektowania wejściowych kanałów przepływu danych, które efektywnie wykorzystują procesor, optymalizując każdy etap procesu ETL.

 

Aby wykonać etap szkolenia, należy najpierw wyodrębnić i przekształcić dane szkoleniowe, a następnie przesłać je do modelu działającego na akceleratorze. Jednak w przypadku naiwnej synchronicznej implementacji podczas przygotowywania danych przez procesor, akcelerator jest bezczynny. Z kolei gdy akcelerator szkoli model, procesor jest bezczynny. Czas etapu szkolenia jest więc sumą czasu wstępnego przetwarzania procesora i czasu szkolenia akceleratora

 

Przetwarzanie potokowe nakłada się na przetwarzanie wstępne i wykonanie modelu etapu szkoleniowego. Podczas gdy akcelerator wykonuje etap szkolenia N, procesor przygotowuje dane do etapu N+1. Pozwala to skrócić czas etapu do maksimum (w przeciwieństwie do sumy) szkolenia i czasu potrzebnego na wyodrębnienie i transformację danych.

 

Bez przetwarzania potokowego, procesor i procesor graficzny/TPU przez większość czasu są bezczynne:

SLN318898_en_US__1Sequantial execution
Rys. 1: Wykonywanie sekwencyjne często pozostawia procesor GPU w stanie bezczynności

 

W przypadku przetwarzania potokowego czas bezczynności znacznie się zmniejsza:

SLN318898_en_US__2Pipelining overlaps
Rys. 2: Przetwarzanie potokowe nakłada się na wykorzystanie procesora i procesora graficznego, maksymalizując wykorzystanie procesora graficznego

 

Interfejs API tf.data zapewnia mechanizm przetwarzania potokowego oprogramowania poprzez transformację tf.data.Dataset.prefetch, którą można wykorzystać do odłączania czasu, w którym produkowane są dane od czasu, w którym są używane. Transformacja wykorzystuje wątek tła i bufor wewnętrzny do wstępnego pobierania elementów z zestawu danych wejściowych przed terminem ich zażądania.

 

Więcej informacji: https://www.tensorflow.org/guide/performance/datasets

 

Postępując zgodnie z wytycznymi zapewnianymi przez tensorflow można uzyskać kanał przepływu danych, który wygląda tak (stare podejście):
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/old_approach.py

 

W tym podejściu, zwanym również starym podejściem, kanał przepływu danych tf wykonuje następujące czynności (zakładając, że zestaw danych obrazu rentgenowskiego klatki piersiowej jest sekwencją TFRecords):

 

  1. Pobiera listę bezwzględną nazw plików.
  2. Tworzy zestaw danych z listy nazw plików przy użyciu TFRecordDataset()
  3. Utwórz nowy zestaw danych, który ładuje i formatuje obrazy poprzez ich wstępne przetwarzanie.
  4. Podziel zestaw danych.
  5. Pomieszaj zestaw danych podczas szkolenia.
  6. Powtórz zestaw danych.
  7. Grupuj zestaw danych.
  8. Przeprowadź wstępne pobieranie zestawu danych dla batch_size.


 

Nie jest to jednak najbardziej wydajny kod. Powoduje wstrzymanie i częste wykorzystanie procesora graficznego na 0%. Zasadniczo nie wykorzystuje efektywnie akceleratorów.

Aby poprawnie skonfigurować kanał przepływu danych tf, postępujemy zgodnie z podejściem podjętym przez oficjalne modele tensorflow, w szczególności dla ResNet.  Różnica między starym podejściem a nowym podejściem polega na sposobie konfiguracji kanału przepływu danych przed wprowadzeniem go do modelu.

 

Oto jak wygląda nowe podejście:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py

 

Podejście oficjalnych modeli TensorFlow, określane również mianem nowego podejścia, jest następujące:

 

  1. Pobiera listę bezwzględną nazw plików.
  2. Tworzy zestaw danych z listy nazw plików przy użyciu from_tensor_slices()
  3. Podział jest wykonywany z wyprzedzeniem.
  4. Zestaw danych jest mieszany podczas szkolenia.
  5. Zestaw danych jest następnie przeplatany równolegle, co oznacza przeplatanie i przetwarzanie wielu plików (zdefiniowanych przez cycle_length) w celu przekształcenia ich i utworzenia zestawu danych TFRecord.
  6. Zestaw danych zostanie następnie wstępnie pobrany. Buffer_size określa, ile rekordów jest wstępnie pobranych, czyli jest to zazwyczaj mini batch_size zadania.
  7. Zestaw danych zostanie ponownie pomieszany. Szczegóły mieszania są kontrolowane przez buffer_size.
  8. Zestaw danych jest powtarzany.  Powtarza zestaw danych num_epochs w celu szkolenia.
  9. Zestaw danych podlega jednocześnie procesowi map_and_batch(), który analizuje pliki rekordu tf, który z kolei wstępnie przetwarza obraz i je grupuje.
  10. Wstępnie przetworzony obraz jest gotowy jako zestaw danych i zostaje ponownie wstępnie pobrany.


 

Poniżej przedstawiono porównanie wydajności starych i nowych podejść przy użyciu oficjalnych modeli TF.

SLN318898_en_US__3image(12053)
Rys. 3: Dzięki nowemu podejściu można było spodziewać się skalowania bliskiego liniowemu.

 

Jak widać, występuje znaczny spadek wydajności i nie ma żadnego skalowania w przypadku starego podejścia. Procesory graficzne często doświadczają niewielkiego wykorzystania lub jego braku, co powoduje obniżenie wydajności. Zwiększenie wydajności obliczeń na jednym procesorze GPU przekłada się na zwiększenie wydajności obliczeń w wielu GPU w wielu węzłach, jeśli komunikacja jest sprawna.
Wywołanie równolegle wstępnego przetwarzania przez procesory GPU, wstępne pobieranie przetworzonych danych w pamięci i ciężka praca procesorów GPU przy mnożeniu macierzy poprzez szybką komunikację to kolejny aspekt, który podnosi atrakcyjność nowego podejścia przy skalowaniu dla wielu węzłów.


 


Przyjrzyjmy się innym technikom w celu uzyskania optymalnej wydajności:



 

Prawidłowe środowisko jest ważne:

 

Środowisko pracy jest równie ważne jak zadania, ponieważ ważne są odpowiednie biblioteki/moduły, jako że mają wpływ na wydajność szkoleń. Ponadto posiadanie najnowszych bibliotek związanych z CUDA może przyczynić się do poprawy wydajności.

Jeśli nie masz konfiguracji środowiska roboczego, postępuj zgodnie z tym samouczkiem instalacji.



 

Użycie prawidłowych parametrów powiązania dla MPI:

 

MPI to biblioteka komunikacyjna, która ułatwia dystrybucję zadań horovod. Zbadano różne opcje parametrów powiązania i mapowania, a najlepszymi parametrami dla C4140 było mapowanie przez gniazdo. Zalecane ustawienie jest następujące:
mpirun --map-by socket -np x python pyfile.py --pyoptions



 

Upewnij się, że jeden proces działa na jednym GPU:

 

Jeśli istnieje więcej niż jeden proces, który działa na jednym GPU, procesy te mogą równie dobrze walczyć o zasoby GPU, zużywając pamięć GPU i faktycznie nie dopasowując większej liczby obrazów na partię, w związku z czym są odpowiedzialne za utratę wydajności GPU. Eksplorowano tensorflow 1.13.1, ale wygląda na to, że występował błąd. Uruchamiał się więcej niż jeden proces na GPU.


 

Podsumowując:

  • Prawidłowa konfiguracja kanału przepływu danych ma kluczowe znaczenie dla wzrostu wydajności.
  • Utworzenie właściwego środowiska jest dobrym czynnikiem wpływającym na lepszą wydajność.
  • Użycie prawidłowych parametrów powiązania dla MPI pomaga w zwiększeniu wydajności.
  • Profiluj i naprawiaj wąskie gardła, gdy GPU nie są w pełni wykorzystywane.


 


Article Properties


Affected Product

High Performance Computing Solution Resources, Poweredge C4140

Last Published Date

17 Sep 2021

Version

5

Article Type

Solution