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

Optimalisatietechnieken voor het trainen van CheXNet op Dell C4140 met NVIDIA V100 GPU's (in het Engels)

Summary: Best practices voor het behalen van maximale prestaties op gedistribueerde scale-out training van CheXNet met nvidia V100 SXM2 GPU's in Dell EMC C4140 servers.

This article applies to This article does not apply to This article is not tied to any specific product. Not all product versions are identified in this article.

Symptoms

Dit artikel is geschreven door Rakshith Vasudev en John Lockman - HPC AI Innovation Lab in oktober 2019

Cause

  -

Resolution

Zoals eerdergeïntroduceerd, is CheXNet een AI-radioloogassistent-model dat gebruikmaakt van DenseNet om maximaal 14 ziektebeelden te identificeren van een bepaalde röntgenfoto op de borst. Verschillende benaderingen werden onderzocht om de training van een model uit te breiden dat zowel goed als beter presteert dan de oorspronkelijke CheXNet-121 met ResNet-50 die beloftes demonstreerde in zowel schaalbaarheid als verbeterde trainingsnauwkeurigheid (positieve ACREDITC). De auteurs toonden schaalbaarheid op CPU-systemen, maar we zijn geïnteresseerd in het gebruik van het parallelisme van GPU's om het trainingsproces te versnellen. In dit artikel beschrijven we best practices voor het behalen van maximale prestaties op gedistribueerde scale-out training van CheXNet met nvidia V100 SXM2 GPU's in Dell EMC C4140 servers. De Dell EMC PowerEdge C4140 biedt zowel dichtheid als prestaties met vier NVIDIA V100 GPU's in de SXM2-configuratie.


 

Hardwareconfiguratie: Softwareconfiguratie:
  • 4 PowerEdge C4140
  • 4 NVIDIA V100 32 GB SXM2
  • 2 20 core Intel(R) Xeon(R) Gold 6148 CPU bij 2,40 GHz
  • 384 GB RAM, DDR4 2666 MHz
  • 1 Mellanox EDR HCA
  • Lustre bestandssysteem
  • Deep Learning Framework: tensorflow-gpu
  • Framework-versie: 1.12.0
  • Horovod-versie: 0.16.4
  • MPI-versie: 4.0.0 met cuda- en ucx-ondersteuning
  • CUDA-versie: 10.1.105
  • CUDNN-versie: 7.6.0
  • NCCL-versie: 2.4.7
  • Python-versie: 3.6.8
  • Besturingssysteem en versie: RHEL 7.4


 


De datapijplijn is van cruciaal belang om de meeste prestaties van uw versnellers te krijgen:



 

Wat is tf-data, waarom zou u ernaar streven deze te gebruiken?

 

Aangezien nieuwe computerapparaten (zoals GPU's en TPU's) het mogelijk maken om neurale netwerken steeds sneller te trainen, is de CPU-verwerking gevoelig om het knelpunt te worden. De tf.data API biedt gebruikers bouwstenen voor het ontwerpen van invoerpijplijnen die effectief gebruikmaken van de CPU, waardoor elke stap van het ETL-proces wordt geoptimaliseerd.

 

Als u een trainingsstap wilt uitvoeren, moet u eerst de trainingsdata uitpakken en transformeren en deze vervolgens in een model voeren dat op een versneller wordt uitgevoerd. Bij een synchrone synchrone implementatie, terwijl de CPU de data voorbereidt, zit de accelerator echter inactief. Terwijl de versneller het model traint, zit de CPU daarentegen inactief. De trainingsstaptijd is dus de som van zowel de CPU-pre-processingtijd als de versnellertrainingstijd

 

Pipelining overlapt de preprocessing en modeluitvoering van een trainingsstap. Terwijl de versneller trainingsstap N uitvoert, bereidt de CPU de data voor op stap N+1. Door dit te doen, wordt de tijd die nodig is voor het uitpakken en transformeren van de data, teruggebracht tot het maximum (in tegenstelling tot de som) van de training.

 

Zonder pipelining zitten de CPU en de GPU/TPU een groot deel van de tijd inactief:

SLN318898_en_US__1Sequantial uitvoeren
Afb. 1: Bij sequentiële uitvoering blijft de GPU vaak inactief

 

Met pipelining neemt de inactieve tijd aanzienlijk af:

overlapt SLN318898_en_US__2Pipelining
Afb. 2: Pipelining overlappen CPU- en GPU-gebruik, waardoor GPU-gebruik wordt gemaximaliseerd

 

De tf.data API biedt een software-pipeliningmechanisme via de transformatie tf.data.dataset.prefetch, die kan worden gebruikt om de tijd te ontkoppelen die data genereren van de tijd die ze worden verbruikt. De transformatie maakt met name gebruik van een achtergrondthread en een interne buffer om elementen uit de invoerdataset te prefetch voordat ze worden aangevraagd.

 

Meer informatie hier: https://www.tensorflow.org/guide/performance/datasets

 

Wanneer u de richtlijnen van tensorflow volgt, is het mogelijk om een datapijplijn te verkrijgen die er als volgt uitziet (oude benadering):
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/old_approach.py

 

In deze benadering, ook wel de oude benadering genoemd, doet de tf-datapijplijn het volgende (ervan uitgaande dat de rö ray-dataset een opeenvolging van TFRecords is):

 

  1. Hiermee wordt de absolute lijst met bestandsnaams weergegeven.
  2. Stelt een dataset op uit de lijst met bestandsnaams met behulp van TFRecordDataset()
  3. Maak een nieuwe dataset die images laadt en formatteert door ze vooraf te verwerken.
  4. Shard de dataset.
  5. Schud de dataset tijdens het trainen.
  6. Herhaal de dataset.
  7. Batch de dataset.
  8. Prefetch de dataset voor de batch_size.


 

Dit is echter niet de meest performant code. Het veroorzaakt vastgelopen en frequent 0% GPU-gebruik. In feite gebruikt het de versnellers niet effectief.

Om de tf-datapijplijn correct in te stellen, volgen we de aanpak van de officiële tensorflow-modellen, met name die voor ResNet.  Het verschil tussen de oude aanpak en de nieuwe aanpak is hoe de datapijplijn wordt ingesteld voordat deze aan het model wordt getoevoerd.

 

Zo ziet de nieuwe aanpak eruit:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py

 

De officiële aanpak van TensorFlow-modellen, ook wel nieuwe benadering genoemd, is als volgt:

 

  1. Hiermee wordt de absolute lijst met bestandsnaams weergegeven.
  2. Maakt een dataset op basis van de lijst met bestandsnaams met behulp van from_tensor_slices()
  3. Sharding wordt van tevoren uitgevoerd.
  4. De dataset wordt tijdens de training geschud.
  5. De dataset wordt vervolgens parallel interleaved, die meerdere bestanden interleaving en verwerking (gedefinieerd door cycle_length) om ze te transformeren om TFRecord-dataset te maken.
  6. De dataset is dan geëtst. De buffer_size bepaalt hoeveel records geëtst zijn, wat meestal de mini-batch_size van de taak is.
  7. De dataset wordt opnieuw geschud. Details van de shuffle worden bepaald door buffer_size.
  8. De dataset wordt herhaald.  De dataset wordt herhaald totdat num_epochs om te trainen.
  9. De dataset wordt onderworpen aan gelijktijdige map_and_batch() waarmee de tf-recordbestanden worden geparseerd, waardoor de image vervolgens vooraf wordt verwerkt en batches worden verwerkt.
  10. De vooraf bewerkte image is klaar als dataset en opnieuw geëtst.


 

Hier volgt een vergelijking van de prestaties van zowel de oude als de nieuwe benaderingen, met behulp van de officiële TF-modellen.

SLN318898_en_US__3image (12053)
Afb. 3: Met de nieuwe aanpak kan bijna lineaire schaling worden verwacht.

 

Zoals u kunt zien, zijn de prestaties aanzienlijk toegewezen en is er geen schaling met de oude aanpak. GPU's ervaren vaak weinig tot geen gebruik, waardoor de prestaties plat liggen. Het efficiënter maken van berekeningen op één GPU vertaalt zich in het efficiënter maken van berekeningen op meerdere GPU's op meerdere knooppunten, als de communicatie goed wordt afgehandeld.
Als CPU's parallel aan de verwerking doen, is een ander aspect dat ervoor zorgt dat de verwerkte data in het geheugen en GPU's zwaar worden opgetild door matrix-multiplication met snelle communicatie. Dit maakt deze nieuwe benadering aantrekkelijker om te schalen voor multinodes.


 


Andere technieken die moeten worden bekeken om optimale prestaties te bereiken:



 

De juiste omgeving hebben is belangrijk:

 

De omgeving waarop uw taken worden uitgevoerd, is net zo belangrijk als uw taken, omdat het hebben van de juiste bibliotheken/modules belangrijk is, omdat deze van invloed zijn op de trainingsprestaties. Ook het hebben van de nieuwste CUDA-gerelateerde bibliotheken kan helpen de prestaties te verbeteren.

Volg deze zelfstudie om te installeren, als u geen werkomgeving hebt ingesteld.



 

De juiste bindingsparameters voor MPI gebruiken:

 

MPI is een communicatiebibliotheek die helpt bij het distribueren van taken. Verschillende opties voor bindings- en toewijzingsparameter werden onderzocht en de beste parameters voor de C4140 werden toegewezen per socket. De aanbevolen instelling is als volgt:
mpirun --map-by socket -np x python pyfile.py --pyoptions



 

Zorg ervoor dat één proces werkt op één GPU:

 

Als er meer dan één proces is dat werkt met één GPU, kunnen ze zeer goed worden ingezet voor GPU-bronnen, GPU-geheugen verbruiken en effectief niet meer images per batch aanpassen, waardoor gpu-prestaties een hit worden. Tensorflow 1.13.1 is onderzocht, maar het lijkt erop dat er op dat moment een bug is opgelopen. Er werd meer dan één proces per GPU gestart.


 

Samenvattend:

  • Het correct instellen van de datapijplijn is van cruciaal belang om prestatiewinsten te zien.
  • Het instellen van de juiste omgeving draagt goed bij aan betere prestaties.
  • Het gebruik van de juiste bindingsparameters voor MPI helpt bij het verbeteren van de prestaties.
  • Profileer en los knelpunten op wanneer GPU's niet volledig worden gebruikt.


 


Affected Products

High Performance Computing Solution Resources, Poweredge C4140
Article Properties
Article Number: 000124384
Article Type: Solution
Last Modified: 17 Sep 2021
Version:  5
Find answers to your questions from other Dell users
Support Services
Check if your device is covered by Support Services.