Distribuerad träning av djupinlärningsmodeller i Azure

Blob Storage
Container Registry
Machine Learning

Den här referensarkitekturen visar hur du genomför distribuerad träning av djupinlärningsmodeller i kluster med GPU-aktiverade virtuella datorer. Scenariot är bildklassificering, men lösningen kan generaliseras till andra djupinlärningsscenarier som segmentering eller objektidentifiering.

En referensimplementering för den här arkitekturen finns på GitHub.

Arkitektur

Arkitekturdiagram som visar distribuerad djupinlärning.

Ladda ned en Visio-fil med den här arkitekturen.

Arbetsflöde

Den här arkitekturen består av följande tjänster:

Azure Machine Learning Compute spelar den centrala rollen i den här arkitekturen genom att skala upp och ned resurser efter behov. Azure Machine Learning Compute är en tjänst som hjälper till att etablera och hantera kluster av virtuella datorer, schemalägga jobb, samla in resultat, skala resurser och hantera fel. Den stöder GPU-aktiverade virtuella datorer för djupinlärningsarbetsbelastningar.

Standard Blob Storage används för att lagra loggar och resultat. Premium Blob Storage används för att lagra träningsdata och monteras i noderna i träningsklustret med hjälp av blobfuse. Premium-nivån för Blob Storage ger bättre prestanda än standardnivån och rekommenderas för distribuerade träningsscenarier. När de monteras med blobfuse hämtas träningsdata under den första epoken till de lokala diskarna i träningsklustret och cachelagras. För varje efterföljande epok läss data från de lokala diskarna, vilket är det mest högpresterande alternativet.

Azure Container Registry används för att lagra Docker-avbildningen som Azure Machine Learning Compute använder för att köra träningen.

Komponenter

  • Azure Machine Learning är en öppen plattform för att hantera utveckling och distribution av maskininlärningsmodeller i stor skala. Plattformen stöder vanliga öppna ramverk och erbjuder automatiserad funktionalisering och algoritmval. Du kan använda Machine Learning för att distribuera modeller till olika mål, inklusive Azure Container Instances.
  • Azure Blob Storage är en tjänst som ingår i Azure Storage. Blob Storage erbjuder optimerad molnobjektlagring för stora mängder ostrukturerade data.
  • Container Registry är en molnbaserad privat registertjänst. Du kan använda Container Registry för att lagra och hantera privata Docker-containeravbildningar och relaterade artefakter.

Scenarioinformation

Scenario: Klassificering av bilder är en allmänt tillämpad teknik inom visuellt innehåll, som ofta hanteras genom träning av ett convolutional neuralt nätverk (CNN). För särskilt stora modeller med stora datamängder kan träningsprocessen ta veckor eller månader på en enda GPU. I vissa situationer är modellerna så stora att det inte går att anpassa rimliga batchstorlekar till GPU:n. Användning av distribuerad träning i dessa situationer kan förkorta träningstiden.

I det här specifika scenariot tränas en ResNet50 CNN-modell med HorovodImageNet-datauppsättningen och på syntetiska data. Referensimplementeringen visar hur du utför den här uppgiften med TensorFlow.

Det finns flera sätt att träna en djupinlärningsmodell på ett distribuerat sätt, inklusive dataparallell och modellparallell metod som baseras på synkrona eller asynkrona uppdateringar. För närvarande är det vanligaste scenariot dataparallell träning med synkrona uppdateringar. Den här metoden är den enklaste att implementera och är tillräcklig för de flesta användningsfall.

I dataparallell distribuerad träning med synkrona uppdateringar replikeras modellen över n-maskinvaruenheter . En mini-batch med träningsexempel är indelad i n mikrobatchar. Varje enhet utför framåt- och bakåtpassningar för en mikrobatch. När en enhet är klar delar den uppdateringarna med de andra enheterna. Dessa värden används för att beräkna de uppdaterade vikterna för hela mini-batchen och vikterna synkroniseras mellan modellerna. Det här scenariot beskrivs i den associerade GitHub-lagringsplatsen .

Dataparallell distribuerad träning.

Den här arkitekturen kan också användas för modellparallell och asynkron uppdatering. I modellparallell distribuerad träning delas modellen upp mellan n maskinvaruenheter, där varje enhet har en del av modellen. I den enklaste implementeringen innehåller varje enhet ett lager av nätverket och information skickas mellan enheter under framåt- och bakåtpassningar. Större neurala nätverk kan tränas på det här sättet, men på bekostnad av prestanda, eftersom enheterna ständigt väntar på att varandra ska slutföra antingen framåt- eller bakåtpassningen. Vissa avancerade tekniker försöker delvis lindra det här problemet med hjälp av syntetiska toningar.

Stegen för träning är:

  1. Skapa skript som körs i klustret och träna din modell.
  2. Skriva träningsdata till Blob Storage.
  3. Skapa en Machine Learning-arbetsyta. Det här steget skapar också en instans av Container Registry som värd för dina Docker-avbildningar.
  4. Skapa ett Machine Learning GPU-aktiverat kluster.
  5. Skicka träningsjobb. För varje jobb med unika beroenden skapas och skickas en ny Docker-avbildning till containerregistret. Under körningen körs och körs skriptet av lämplig Docker-avbildning.
  6. Alla resultat och loggar skrivs till Blob Storage.

Överväganden för träningskluster

Azure tillhandahåller flera GPU-aktiverade VM-typer som är lämpliga för att träna djupinlärningsmodeller. De varierar i pris och hastighet från låg till hög enligt följande:

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

Vi rekommenderar att du skalar upp träningen innan du skalar ut. Prova till exempel en enda V100 innan du provar ett kluster med K80s. Överväg också att använda en enda NDv2 i stället för åtta virtuella NCsv3-datorer.

Följande diagram visar prestandaskillnaderna för olika GPU-typer baserat på benchmarkingtester som utförs med TensorFlow och Horovod. Diagrammet visar dataflödet för 32 GPU-kluster i olika modeller, på olika GPU-typer och MPI-versioner. Modeller implementerades i TensorFlow 1.9

Dataflödesresultat för TensorFlow-modeller i GPU-kluster.

Varje VM-serie som visas i föregående tabell innehåller en konfiguration med InfiniBand. Använd InfiniBand-konfigurationerna när du kör distribuerad träning för snabbare kommunikation mellan noder. InfiniBand ökar även skalningseffektiviteten för träningen för de ramverk som kan dra nytta av den. Mer information finns i Jämförelse av infiniband-benchmark.

Överväganden

Dessa överväganden implementerar grundpelarna i Azure Well-Architected Framework, som är en uppsättning vägledande grundsatser som du kan använda för att förbättra kvaliteten på en arbetsbelastning. Mer information finns i Microsoft Azure Well-Architected Framework.

Storage

När du tränar djupinlärningsmodeller är en ofta förbisedd aspekt var du kan lagra träningsdata. Om lagringen är för långsam för att uppfylla kraven för GPU:er kan träningsprestanda försämras.

Azure Machine Learning Compute stöder många lagringsalternativ. För bästa prestanda kan du ladda ned data lokalt till varje nod. Den här processen kan dock vara besvärlig eftersom du måste ladda ned data till varje nod från Blob Storage. Med ImageNet-datauppsättningen kan den här processen ta lång tid. Som standard monterar Machine Learning lagring så att den cachelagrar data lokalt. Det innebär i praktiken att data efter den första epoken läse från lokal lagring. I kombination med Premium Blob Storage erbjuder det här arrangemanget en bra kompromiss mellan användarvänlighet och prestanda.

Även om Azure Machine Learning Compute kan montera Blob Storage på standardnivå med hjälp av blobfuse-adaptern rekommenderar vi inte att du använder standardnivån för distribuerad träning, eftersom prestanda vanligtvis inte är tillräckligt bra för att hantera det dataflöde som krävs. Använd Premium-nivån som lagring för träningsdata, som du ser tidigare i arkitekturdiagrammet. Ett blogginlägg med en jämförelse av dataflöde och svarstid mellan de två nivåerna finns i Premium Block Blob Storage – en ny prestandanivå.

Container Registry

När en Machine Learning-arbetsyta etableras etableras också en uppsättning beroende resurser – Blob Storage, Key Vault, Container Registry och Application Insights . Du kan också använda befintliga Azure-resurser och associera dem med den nya Machine Learning-arbetsytan när den skapas.

Som standard etableras Container Registry på Basic-nivå. För storskalig djupinlärning rekommenderar vi att du anpassar din arbetsyta för att använda Container Registry på Premium-nivå. Den erbjuder betydligt högre bandbredd som gör att du snabbt kan hämta Docker-avbildningar över noder i ditt träningskluster.

Dataformat

Med stora datauppsättningar är det ofta lämpligt att använda dataformat som TFRecords eller Petastorm som ger bättre I/O-prestanda än flera små bildfiler.

Säkerhet

Säkerhet ger garantier mot avsiktliga attacker och missbruk av värdefulla data och system. Mer information finns i Översikt över säkerhetspelare.

Använda en arbetsyta med hög påverkan på verksamheten

I scenarier som använder känsliga data bör du överväga att utse en Machine Learning-arbetsyta till HBI (High Business Impact) genom att ange en hbi_workspace flagga till true när du skapar den. En HBI-aktiverad arbetsyta krypterar bland annat lokala tillfälliga diskar med beräkningskluster, aktiverar IP-filtrering och minskar mängden diagnostikdata som Microsoft samlar in. Mer information finns i Datakryptering med Azure Machine Learning.

Kryptera vilande data och i rörelse

Kryptera känsliga vilande data– det vill sa i bloblagringen. Varje gång data flyttas från en plats till en annan använder du SSL för att skydda dataöverföringen. Mer information finns i säkerhetsguiden för Azure Storage.

Skydda data i ett virtuellt nätverk

För produktionsdistributioner bör du överväga att distribuera Machine Learning-klustret till ett undernät i ett virtuellt nätverk som du anger. Med den här konfigurationen kan beräkningsnoderna i klustret kommunicera säkert med andra virtuella datorer eller med ett lokalt nätverk. Du kan också använda tjänst- eller privata slutpunkter för alla associerade resurser för att bevilja åtkomst från ett virtuellt nätverk.

Kostnadsoptimering

Kostnadsoptimering handlar om att titta på sätt att minska onödiga utgifter och förbättra driftseffektiviteten. Mer information finns i Översikt över grundpelare för kostnadsoptimering.

Använd Priskalkylatorn för Azure för att beräkna kostnaden för att köra din djupinlärningsarbetsbelastning. Mer information om kostnadsplanering och hantering som är specifika för Machine Learning finns i Planera för att hantera kostnader för Azure Machine Learning. Mer information finns i Översikt över grundpelare för kostnadsoptimering.

Premium Blob Storage

Premium Blob Storage har en hög datalagringskostnad, men transaktionskostnaden är lägre än kostnaden för att lagra data på frekvent nivå i Standard Blob Storage. Premium Blob Storage kan därför vara billigare för arbetsbelastningar med höga transaktionshastigheter. Mer information finns i Azure Blob Storage prissättning.

Container Registry

Container Registry erbjuder nivåerna Basic, Standard och Premium. Välj en nivå beroende på vilken lagring du behöver. Välj Premium om du behöver geo-replikering eller förbättrat dataflöde för Docker-hämtningar över samtidiga noder. Dessutom tillkommer standardavgifter för nätverk. Mer information finns i Azure Container Registry prissättning.

Azure Machine Learning-beräkning

I den här arkitekturen är Azure Machine Learning Compute sannolikt den främsta kostnadsdrivande faktorn. Implementeringen behöver ett kluster med GPU-beräkningsnoder. Priset för dessa noder bestäms av deras antal och den VM-storlek som du väljer. Mer information om VM-storlekar som innehåller GPU:er finns i GPU-optimerade storlekar för virtuella datorer och Prissättning för Azure Virtual Machines.

Vanligtvis spårar djupinlärningsarbetsbelastningar förloppet efter varje epok eller med några få epoker. Den här metoden begränsar effekten av oväntade avbrott i träningen. Du kan koppla ihop den här metoden med hjälp av lågprioriterade virtuella datorer för Machine Learning-beräkningskluster. Lågprioriterade virtuella datorer använder överskjutande Azure-kapacitet till betydligt lägre priser, men de kan förhindras om kapacitetsbehovet ökar.

Utmärkt driftseffektivitet

Driftseffektivitet omfattar de driftsprocesser som distribuerar ett program och håller det igång i produktion. Mer information finns i Översikt över grundpelare för driftseffektivitet.

När du kör jobbet är det viktigt att övervaka förloppet och se till att saker och ting fungerar som förväntat. Det kan dock vara en utmaning att övervaka över ett kluster med aktiva noder.

Machine Learning erbjuder många sätt att instrumentera dina experiment. Stdout- och stderr-strömmarna från dina skript loggas automatiskt. Dessa loggar synkroniseras automatiskt till din bloblagring för arbetsytan. Du kan antingen visa dessa filer via Azure Portal eller ladda ned eller strömma dem med hjälp av Python SDK eller Machine Learning CLI. Om du loggar dina experiment med tensorboard synkroniseras dessa loggar automatiskt. Du kan komma åt dem direkt eller använda Machine Learning SDK för att strömma dem till en Tensorboard-session.

Prestandaeffektivitet

Prestandaeffektivitet handlar om att effektivt skala arbetsbelastningen baserat på användarnas behov. Mer information finns i Översikt över grundpelare för prestandaeffektivitet.

Skalningseffektiviteten för distribuerad träning är alltid mindre än 100 procent på grund av nätverkskostnader – att synkronisera hela modellen mellan enheter blir en flaskhals. Därför passar distribuerad träning bäst för:

  • Stora modeller som inte kan tränas med hjälp av en rimlig batchstorlek på en enda GPU.
  • Problem som inte kan åtgärdas genom att distribuera modellen på ett enkelt, parallellt sätt.

Distribuerad träning rekommenderas inte för att köra sökningar med hyperparametrar. Skalningseffektiviteten påverkar prestanda och gör en distribuerad metod mindre effektiv än att träna flera modellkonfigurationer separat.

Ett sätt att öka skalningseffektiviteten är att öka batchstorleken. Men gör denna justering noggrant. Att öka batchstorleken utan att justera de andra parametrarna kan försämra modellens slutliga prestanda.

Distribuera det här scenariot

Referensimplementeringen av den här arkitekturen finns på GitHub. Följ stegen som beskrivs där för att genomföra distribuerad träning av djupinlärningsmodeller över kluster med GPU-aktiverade virtuella datorer.

Nästa steg

Utdata från den här arkitekturen är en tränad modell som sparas i en bloblagring. Du kan operationalisera den här modellen för bedömning i realtid eller batchbedömning. Mer information finns i följande referensarkitekturer:

För arkitekturer som omfattar distribuerad träning eller djupinlärning, se följande resurser: