Dit artikel is geschreven door Rakshith Vasudev en John Lockman - HPC AI Innovation Lab in oktober 2019
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: |
---|---|
|
|
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:
Afb. 1: Bij sequentiële uitvoering blijft de GPU vaak inactief
Met pipelining neemt de inactieve tijd aanzienlijk af:
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):
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:
Hier volgt een vergelijking van de prestaties van zowel de oude als de nieuwe benaderingen, met behulp van de officiële TF-modellen.
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.
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.
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
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: