HorovodRunner: distribuerad djupinlärning med Horovod

Lär dig hur du utför distribuerad träning av maskininlärningsmodeller med HorovodRunner för att starta Horovod-träningsjobb som Spark-jobb i Azure Databricks.

Vad är HorovodRunner?

HorovodRunner är ett allmänt API för att köra distribuerade djupinlärningsarbetsbelastningar på Azure Databricks med horovodramverket. Genom att integrera Horovod med Sparks barriärläge kan Azure Databricks ge högre stabilitet för långvariga djupinlärningsträningsjobb på Spark. HorovodRunner använder en Python-metod som innehåller träningskod för djupinlärning med Horovod-krokar. HorovodRunner pickles metoden på drivrutinen och distribuerar den till Spark-arbetare. Ett Horovod MPI-jobb bäddas in som ett Spark-jobb med barriärkörningsläget. Den första kören samlar in IP-adresserna för alla uppgiftsexekutorer med hjälp av BarrierTaskContext och utlöser ett Horovod-jobb med .mpirun Varje Python MPI-process läser in det inlagda användarprogrammet, deserialiserar det och kör det.

HorovodRunner

Distribuerad träning med HorovodRunner

Med HorovodRunner kan du starta Horovod-träningsjobb som Spark-jobb. HorovodRunner-API:et stöder de metoder som visas i tabellen. Mer information finns i dokumentationen för HorovodRunner API.

Metod och signatur beskrivning
init(self, np) Skapa en instans av HorovodRunner.
run(self, main, **kwargs) Kör ett Horovod-träningsjobb som anropar main(**kwargs). Huvudfunktionen och nyckelordsargumenten serialiseras med cloudpickle och distribueras till klusterarbetare.

Den allmänna metoden för att utveckla ett distribuerat utbildningsprogram med HorovodRunner är:

  1. Skapa en HorovodRunner instans som initierats med antalet noder.
  2. Definiera en Horovod-träningsmetod enligt de metoder som beskrivs i Horovod-användning och se till att lägga till importinstruktioner i metoden.
  3. Skicka träningsmetoden till instansen HorovodRunner .

Till exempel:

hr = HorovodRunner(np=2)

def train():
  import tensorflow as tf
  hvd.init()

hr.run(train)

Om du bara vill köra HorovodRunner på drivrutinen med n underprocesser använder du hr = HorovodRunner(np=-n). Om det till exempel finns 4 GPU:er på drivrutinsnoden kan du välja n upp till 4. Mer information om parametern npfinns i dokumentationen för HorovodRunner API. Mer information om hur du fäster en GPU per underprocess finns i användningsguiden för Horovod.

Ett vanligt fel är att TensorFlow-objekt inte kan hittas eller pickles. Detta inträffar när biblioteksimportinstruktionerna inte distribueras till andra köre. Undvik det här problemet genom att inkludera alla importinstruktioner (till exempel import tensorflow as tf) både överst i träningsmetoden Horovod och i andra användardefinierade funktioner som anropas i träningsmetoden Horovod.

Spela in Horovod-träning med Horovod Timeline

Horovod har möjlighet att registrera tidslinjen för sin aktivitet, kallad Horovod Timeline.

Viktigt!

Horovod Timeline har en betydande inverkan på prestanda. Inception3-dataflödet kan minska med ~40 % när Horovod-tidslinjen är aktiverad. Använd inte Horovod Timeline för att påskynda HorovodRunner-jobb.

Du kan inte visa Horovod-tidslinjen medan träningen pågår.

Om du vill registrera en Horovod-tidslinje anger HOROVOD_TIMELINE du miljövariabeln till den plats där du vill spara tidslinjefilen. Databricks rekommenderar att du använder en plats på delad lagring så att tidslinjefilen enkelt kan hämtas. Du kan till exempel använda DBFS lokala fil-API:er enligt följande:

timeline_dir = "/dbfs/ml/horovod-timeline/%s" % uuid.uuid4()
os.makedirs(timeline_dir)
os.environ['HOROVOD_TIMELINE'] = timeline_dir + "/horovod_timeline.json"
hr = HorovodRunner(np=4)
hr.run(run_training_horovod, params=params)

Lägg sedan till tidslinjespecifik kod i början och slutet av träningsfunktionen. Följande notebook-exempel innehåller exempelkod som du kan använda som en lösning för att visa träningsframstatus.

Exempelanteckningsbok för Horovod-tidslinje

Hämta notebook-fil

Om du vill ladda ned tidslinjefilen använder du Databricks CLI eller FileStore och använder sedan Chrome-webbläsarens chrome://tracing funktion för att visa den. Till exempel:

Horovod timeline

Arbetsflöde för utveckling

Det här är de allmänna stegen för att migrera djupinlärningskod för en enskild nod till distribuerad träning. Exemplen : Migrera till distribuerad djupinlärning med HorovodRunner i det här avsnittet illustrerar dessa steg.

  1. Förbered kod för en enda nod: Förbered och testa en nodkoden med TensorFlow, Keras eller PyTorch.
  2. Migrera till Horovod: Följ anvisningarna från Horovod-användningen för att migrera koden med Horovod och testa den på drivrutinen:
    1. Lägg till hvd.init() för att initiera Horovod.
    2. Fäst en server-GPU som ska användas av den här processen med hjälp av config.gpu_options.visible_device_list. Med den typiska konfigurationen av en GPU per process kan detta ställas in på lokal rangordning. I så fall allokeras den första processen på servern den första GPU:n, den andra processen allokeras till den andra GPU:n och så vidare.
    3. Inkludera en fragment av datauppsättningen. Den här datamängdsoperatorn är mycket användbar när du kör distribuerad utbildning, eftersom varje arbetare kan läsa en unik delmängd.
    4. Skala inlärningsfrekvensen efter antal arbetare. Den effektiva batchstorleken i synkron distribuerad utbildning skalas av antalet arbetare. Om du ökar inlärningshastigheten kompenseras den ökade batchstorleken.
    5. Omslut optimeraren i hvd.DistributedOptimizer. Den distribuerade optimeraren delegerar toningsberäkning till den ursprungliga optimeraren, medelvärden toningar med allreduce eller allgather och tillämpar sedan de genomsnittliga toningarna.
    6. Lägg till hvd.BroadcastGlobalVariablesHook(0) för att sända inledande variabeltillstånd från rangordning 0 till alla andra processer. Detta är nödvändigt för att säkerställa konsekvent initiering av alla arbetare när utbildningen startas med slumpmässiga vikter eller återställs från en kontrollpunkt. Om du inte använder MonitoredTrainingSessionkan du också köra hvd.broadcast_global_variables åtgärden när globala variabler har initierats.
    7. Ändra koden så att endast kontrollpunkter sparas på arbets 0 för att förhindra att andra arbetare skadar dem.
  3. Migrera till HorovodRunner: HorovodRunner kör Horovod-träningsjobbet genom att anropa en Python-funktion. Du måste omsluta huvudträningsproceduren till en enda Python-funktion. Sedan kan du testa HorovodRunner i lokalt läge och distribuerat läge.

Uppdatera djupinlärningsbiblioteken

Kommentar

Den här artikeln innehåller referenser till termen slave, en term som Azure Databricks inte använder. När termen tas bort från programvaran tar vi bort den från den här artikeln.

Om du uppgraderar eller nedgraderar TensorFlow, Keras eller PyTorch måste du installera om Horovod så att det kompileras mot det nyligen installerade biblioteket. Om du till exempel vill uppgradera TensorFlow rekommenderar Databricks att du använder init-skriptet från TensorFlow-installationsanvisningarna och lägger till följande TensorFlow-specifika Horovod-installationskod i slutet av den. Se Installationsanvisningar för Horovod för att arbeta med olika kombinationer, till exempel uppgradering eller nedgradering av PyTorch och andra bibliotek.

add-apt-repository -y ppa:ubuntu-toolchain-r/test
apt update
# Using the same compiler that TensorFlow was built to compile Horovod
apt install g++-7 -y
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-7

HOROVOD_GPU_ALLREDUCE=NCCL HOROVOD_CUDA_HOME=/usr/local/cuda pip install horovod==0.18.1 --force-reinstall --no-deps --no-cache-dir

Exempel: Migrera till distribuerad djupinlärning med HorovodRunner

Följande exempel, baserade på MNIST-datamängden, visar hur du migrerar ett djupinlärningsprogram med en nod till distribuerad djupinlärning med HorovodRunner.

Begränsningar

  • När du arbetar med arbetsytefiler fungerar Inte HorovodRunner om np det är inställt på större än 1 och notebook-filen importeras från andra relativa filer. Överväg att använda horovod.spark i stället HorovodRunnerför .