Gedistribueerde training van deep learning-modellen in Azure

Blob Storage
Container Registry
Machine Learning

Deze referentiearchitectuur laat zien hoe u gedistribueerde training van Deep Learning-modellen kunt uitvoeren in clusters van VM's met GPU. Het scenario is afbeeldingsclassificatie, maar de oplossing kan worden ge generaliseerd naar andere deep learning-scenario's, zoals segmentatie of objectdetectie.

Een referentie-implementatie voor deze architectuur is beschikbaar op GitHub.

Architectuur voor gedistribueerde deep learning

Scenario: Het classificeren van afbeeldingen is een veel toegepaste techniek in Computer Vision, die vaak wordt aangepakt door het trainen van een convolutioneel neuraal netwerk (CNN). Voor met name grote modellen met grote gegevenssets kan het trainingsproces weken of maanden duren op één GPU. In sommige gevallen zijn de modellen zo groot dat het niet mogelijk is om redelijke batchgrootten op de GPU te passen. Het gebruik van gedistribueerde training in deze situaties kan de training tijd verkorten.

In dit specifieke scenario wordt een ResNet50 CNN-model getraind met horovod in de ImageNet-gegevensset en op synthetische gegevens. De referentie-implementatie laat zien hoe u deze taak kunt uitvoeren met behulp van TensorFlow.

Er zijn verschillende manieren om een deep learning-model op een gedistribueerde manier te trainen, waaronder benaderingen voor gegevens parallel en model-parallel op basis van synchrone of asynchrone updates. Momenteel is het meest voorkomende scenario gegevens-parallelle training met synchrone updates. Deze aanpak is het eenvoudigst te implementeren en is voldoende voor de meeste gebruiksgevallen.

In gegevens parallel gedistribueerde training met synchrone updates wordt het model gerepliceerd op n hardwareapparaten. Een minibatch met trainingsvoorbeelden is onderverdeeld in n microbatchs. Elk apparaat voert de voor- en achterwaartse stappen uit voor een microbatch. Wanneer een apparaat klaar is met het proces, deelt het de updates met de andere apparaten. Deze waarden worden gebruikt om het bijgewerkte gewicht van de hele minibatch te berekenen en de gewichten worden gesynchroniseerd tussen de modellen. Dit scenario wordt behandeld in de bijbehorende GitHub opslagplaats.

Gegevens parallel gedistribueerde training

Deze architectuur kan ook worden gebruikt voor model-parallelle en asynchrone updates. In model-parallel gedistribueerde training wordt het model verdeeld over n hardwareapparaten, met elk apparaat dat een deel van het model vasthoudt. In de eenvoudigste implementatie kan elk apparaat een laag van het netwerk bevatten en wordt informatie tussen apparaten doorgegeven tijdens het voor- en achterwaartse doorgeven. Grotere neurale netwerken kunnen op deze manier worden getraind, maar dit gaat ten koste van de prestaties, omdat apparaten voortdurend op elkaar wachten om het voor- of achterwaartse door te geven. Sommige geavanceerde technieken proberen dit probleem gedeeltelijk op te lossen met behulp van synthetische kleurovergangen.

De stappen voor training zijn:

  1. Maak scripts die worden uitgevoerd op het cluster en train uw model.
  2. Schrijf trainingsgegevens naar Blob Storage.
  3. Een Azure Machine Learning-werkruimte maken. Hiermee maakt u ook een Azure Container Registry uw Docker-afbeeldingen te hosten.
  4. Maak een Azure Machine Learning cluster met GPU.
  5. Trainingstaken verzenden. Voor elke taak met unieke afhankelijkheden wordt een nieuwe Docker-afbeelding gebouwd en naar het containerregister ge pusht. Tijdens de uitvoering wordt uw script uitgevoerd en uitgevoerd met de juiste Docker-afbeelding.
  6. Alle resultaten en logboeken worden naar Blob Storage geschreven.

Architectuur

Deze architectuur bestaat uit de volgende onderdelen:

Azure Machine Learning Compute speelt de centrale rol in deze architectuur door resources naar behoefte omhoog en omlaag te schalen. Azure ML Compute is een service die helpt bij het inrichten en beheren van clusters van VM's, het plannen van taken, het verzamelen van resultaten, het schalen van resources en het afhandelen van fouten. Het ondersteunt VM's met GPU voor deep learning-workloads.

Standard Blob Storage wordt gebruikt voor het opslaan van de logboeken en resultaten. Premium Blob Storage wordt gebruikt om de trainingsgegevens op te slaan en wordt met blobfuseaan de knooppunten van het trainingscluster bevestigd. De Premium-laag van Blob Storage biedt betere prestaties dan de Standard-laag en wordt aanbevolen voor gedistribueerde trainingsscenario's. Wanneer de trainingsgegevens worden gedownload met behulp van blobfuse, worden de trainingsgegevens eerst gedownload naar de lokale schijven van het trainingscluster en in de cache opgeslagen. Voor elk volgende tijdvak worden de gegevens gelezen van de lokale schijven. Dit is de best presterende optie.

Container Registry wordt gebruikt om de Docker-afbeelding op te slaan die Azure Machine Learning Compute gebruikt om de training uit te voeren.

Overwegingen voor trainingscluster

Azure biedt verschillende VM-typen met GPU die geschikt zijn voor het trainen van Deep Learning-modellen. Ze variëren in prijs en snelheid van laag tot hoog als volgt:

Azure VM-serie NVIDIA GPU
NC K80
Nds P40
NCsv2 P100
NCsv3 V100
NDv2 8x V100 (NVLink)
ND A100 v4 8x A100 (NVLink)

We raden u aan uw training omhoog te schalen voordat u uitschaalt. Probeer bijvoorbeeld één V100 voordat u een cluster van K80's probeert. Op dezelfde manier kunt u overwegen één NDv2 te gebruiken in plaats van acht NCsv3.

In het volgende diagram ziet u de prestatieverschillen voor verschillende GPU-typen op basis van benchmarktests die worden uitgevoerd met TensorFlow en Horovod. De grafiek toont de doorvoer van 32 GPU-clusters in verschillende modellen, op verschillende GPU-typen en MPI-versies. Modellen zijn geïmplementeerd in TensorFlow 1.9

Doorvoerresultaten voor TensorFlow-modellen in GPU-clusters

Elke VM-reeks die in de vorige tabel wordt weergegeven, bevat een configuratie met InfiniBand. Gebruik de InfiniBand-configuraties bij het uitvoeren van gedistribueerde training voor snellere communicatie tussen knooppunten. InfiniBand verhoogt ook de schaalefficiëntie van de training voor de frameworks die hiervan kunnen profiteren. Zie de Infiniband-benchmarkvergelijking voor meer informatie.

Opslagoverwegingen

Bij het trainen van deep learning-modellen worden de trainingsgegevens vaak over het hoofd gezien. Als de opslag te langzaam is om aan de eisen van de GPU's te voldoen, kunnen de trainingsprestaties verslechteren.

Azure Machine Learning Compute ondersteunt veel opslagopties. Voor de beste prestaties is het raadzaam dat u de gegevens lokaal naar elk knooppunt downloadt. Dit kan echter omslachtig zijn, omdat alle knooppunten de gegevens moeten downloaden van Blob Storage. Met de ImageNet-gegevensset kan dit een aanzienlijke hoeveelheid tijd duren. Azure ML standaard opslag zodanig dat de gegevens lokaal in de cache worden opgeslagen. Dit betekent in de praktijk dat de gegevens na het eerste tijdvak worden gelezen uit de lokale opslag. Dit in combinatie met Premium Blob Storage een goede balans tussen gebruiksgemak en prestaties.

Hoewel Azure Machine Learning Compute Blob-opslag in de Standard-laag kan worden aangesloten met behulp van de blobfuse-adapter, raden we u af om de Standard-laag te gebruiken voor gedistribueerde training, omdat de prestaties doorgaans niet goed genoeg zijn om de benodigde doorvoer te verwerken. Gebruik Premium als opslag voor trainingsgegevens, zoals wordt weergegeven in het bovenstaande architectuurdiagram. U kunt ook verwijzen naar het volgende blogbericht voor de vergelijking van doorvoer en latentie tussen de twee lagen.

Overwegingen voor containerregisters

Wanneer een Azure Machine Learning-werkruimte wordt ingericht, wordt er ook een set afhankelijke resources ingericht: Blob Storage, Key Vault, Container Registry en Application Insights. U kunt ook bestaande Azure-resources gebruiken en deze tijdens het maken koppelen aan de nieuwe Azure Machine Learning-werkruimte.

Standaard worden Azure Container Registry basic-laag ingericht. Voor grootschalige deep learning raden we u aan uw werkruimte aan te passen voor het gebruik van Premium-laag Container Registry, omdat dit een aanzienlijk hogere bandbreedte biedt waarmee u sneller Docker-afbeeldingen kunt pullen tussen knooppunten van uw trainingscluster.

Schaalbaarheidsoverwegingen

De schaalefficiëntie van gedistribueerde training is altijd minder dan 100 procent vanwege netwerkoverhead. Het synchroniseren van het hele model tussen apparaten wordt een knelpunt. Gedistribueerde training is daarom het meest geschikt voor grote modellen die niet kunnen worden getraind met een redelijke batchgrootte op één GPU, of voor problemen die niet kunnen worden opgelost door het model op een eenvoudige, parallelle manier te distribueren.

Gedistribueerde training wordt niet aanbevolen voor het uitvoeren van zoekopdrachten op hyperparameters. De schaalefficiëntie is van invloed op de prestaties en maakt een gedistribueerde benadering minder efficiënt dan het afzonderlijk trainen van meerdere modelconfiguraties.

Een manier om de schaalefficiëntie te verhogen, is door de batchgrootte te vergroten. Dit moet echter zorgvuldig worden gedaan, omdat het vergroten van de batchgrootte zonder de andere parameters aan te passen de uiteindelijke prestaties van het model kan beïnvloeden.

Overwegingen bij de gegevensindeling

Bij grote gegevenssets is het vaak raadzaam om gegevensindelingen zoals TFRecords of Petastorm te gebruiken die betere I/O-prestaties bieden dan meerdere kleine afbeeldingsbestanden.

Beveiligingsoverwegingen

Werkruimte met hoge bedrijfsimpact gebruiken

In scenario's waarin gebruik wordt gemaakt van gevoelige gegevens, moet u overwegen om een Azure Machine Learning-werkruimte aan te geven als High Business Impact (HBI) door een hbi_workspace-vlag in te stellen op true wanneer u deze maakt. Een werkruimte met HBI-ondersteuning versleutelt onder andere lokale scratchschijven van rekenclusters, maakt IP-filtering mogelijk en vermindert de hoeveelheid diagnostische gegevens die Microsoft verzamelt. Zie Gegevensversleuteling metAzure Machine Learning.

Data-at-rest en in-motion versleutelen

Versleutel gevoelige data-at-rest, dat wil zeggen, in de Blob-opslag. Telkens als gegevens van de ene locatie naar de andere worden verplaatst, gebruikt u SSL om de gegevensoverdracht te beveiligen. Zie de beveiligingshandleiding voor Azure Storage meer informatie.

Gegevens in een virtueel netwerk beveiligen

Voor productie-implementaties kunt u het cluster Azure Machine Learning implementeren in een subnet van een virtueel netwerk dat u opgeeft. Hierdoor kunnen de rekenknooppunten in het cluster veilig communiceren met andere virtuele machines of met een on-premises netwerk. U kunt ook service- of privé-eindpunten gebruiken voor alle gekoppelde resources om toegang te verlenen vanuit een virtueel netwerk.

Bewakingsoverwegingen

Tijdens het uitvoeren van uw taak is het belangrijk om de voortgang te controleren en ervoor te zorgen dat alles werkt zoals verwacht. Het kan echter een uitdaging zijn om te controleren op een cluster met actieve knooppunten.

Azure Machine Learning biedt veel manieren om uw experimenten te instrumenteert. De stdout/stderr van uw scripts worden automatisch geregistreerd. Deze logboeken worden automatisch gesynchroniseerd met de Blob-opslag van uw werkruimte. U kunt deze bestanden weergeven via de Azure Portal of ze downloaden of streamen met behulp van de Python SDK of Azure Machine Learning CLI. Als u uw experimenten registreert met Tensorboard, worden deze logboeken automatisch gesynchroniseerd en kunt u ze rechtstreeks openen of de Azure Machine Learning SDK gebruiken om ze te streamen naar een Tensorboard-sessie.

Kostenoverwegingen

Gebruik de Azure-prijscalculator om een schatting te maken van de kosten voor het uitvoeren van uw deep learning-workload. Hier zijn aandachtspunten voor kostenplanning en beheer die specifiek zijn voor Azure ML. Zie de sectie Kosten in Microsoft Azure Well-Architected Framework voor meer informatie.

Premium Blob Storage

Premium Blob Storage hogere kosten voor gegevensopslag, maar de transactiekosten zijn lager in vergelijking met gegevens die zijn opgeslagen in de hot-laag van Standard Blob Storage. Blob-Premium zijn Storage minder duur voor workloads met hoge transactiesnelheden. Zie de pagina met prijzen voor meer informatie.

Azure Container Registry

Azure Container Registry biedt Basic, Standard en Premium. Kies een laag, afhankelijk van de opslag die u nodig hebt. Kies Premium als u geo-replicatie of verbeterde doorvoer nodig hebt voor docker-pulls over gelijktijdige knooppunten. Daarnaast zijn er standaard netwerkkosten van toepassing. Zie prijzen voor Azure Container Registry meer informatie.

Azure Machine Learning Compute

In deze architectuur is Azure ML Compute waarschijnlijk de belangrijkste kostenstrijver. Voor de implementatie is een cluster gpu-rekenknooppunten nodig waarvan de prijs wordt bepaald door het aantal en de geselecteerde VM-grootte. Zie Voor GPU geoptimaliseerde VM-grootten en Prijzen voor Azure Virtual Machines voor meer informatie over de VM-grootten met GPU's.

Deep Learning-werkbelastingen maken doorgaans na elke (paar) tijdvakken een controlepunt om de impact van onverwachte onderbrekingen op de training te beperken. Dit kan worden gekoppeld aan de mogelijkheid om VM's met lage prioriteit te gebruiken voor Azure Machine Learning rekenclusters. VM's met lage prioriteit gebruiken de overtollige capaciteit van Azure tegen aanzienlijk lagere tarieven, maar ze kunnen worden verdrongen als de capaciteitsvraag toeneemt.

Implementatie

De referentie-implementatie van deze architectuur is beschikbaar op GitHub. Volg de stappen die hier worden beschreven om gedistribueerde training van Deep Learning-modellen uit te voeren in clusters van VM's met GPU.

Volgende stappen

De uitvoer van deze architectuur is een getraind model dat wordt opgeslagen in een Blob-opslag. U kunt dit model operationeel maken voor realtime scoren of batch scoren. Zie de volgende referentiearchitectarchitecten voor meer informatie:

Mogelijk vindt u de volgende resources ook nuttig: