HorovodRunner: distribuované hloubkové učení s Horovod

HorovodRunner je obecné rozhraní API pro spouštění distribuovaných úloh s hloubkovým učením v Azure Databricks pomocí architektury Horovod . Díky integraci Horovod s Azure Databricks režimem bariérySpark je možné zajistit vyšší stabilitu pro dlouhodobě běžící školicí úlohy s hloubkovým učením ve Sparku. HorovodRunner využívá metodu Pythonu, která obsahuje školicí kód pro hloubkové učení s Horovod háky. HorovodRunner vyloží metodu na ovladači a distribuuje ji pracovníkům Sparku. Úloha Horovod MPI je vložená jako úloha Sparku pomocí režimu spuštění bariéry. První prováděcí modul shromažďuje IP adresy všech prováděcích modulů úkolů pomocí BarrierTaskContext a aktivuje úlohu Horovod pomocí mpirun . Každý proces MPI Pythonu načte výběrový program uživatele, deserializaci ho a spustí.

HorovodRunner

Distribuované školení pomocí HorovodRunner

HorovodRunner umožňuje spouštět školicí úlohy Horovod jako úlohy Sparku. Rozhraní HorovodRunner API podporuje metody uvedené v tabulce. Podrobnosti najdete v dokumentaci k rozhraní HorovodRunner API.

Metoda a signatura Description
init(self, np) Vytvořte instanci třídy HorovodRunner.
run(self, main, **kwargs) Spusťte úlohu školení Horovod, která vyvolá volání main(**kwargs) . Funkce main a klíčová slova jsou serializovány pomocí cloudpickle a distribuovány na pracovní procesy clusteru.

Obecným přístupem k vývoji distribuovaného školicího programu pomocí HorovodRunner je:

  1. Vytvořte HorovodRunner instanci inicializovaná s počtem uzlů.
  2. Definujte metodu školení Horovod podle metod popsaných v tématu použití Horovoda nezapomeňte přidat jakékoli příkazy importu uvnitř metody.
  3. Předat do instance metodu školení HorovodRunner .

Příklad:

hr = HorovodRunner(np=2)

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

hr.run(train)

Chcete-li spustit HorovodRunner na ovladači pouze s n podprocesy, použijte hr = HorovodRunner(np=-n) . Pokud je v uzlu ovladače například 4 GPU, můžete zvolit n4 . Podrobnosti o parametru np najdete v dokumentaci k rozhraní HorovodRunner API. Podrobnosti o tom, jak připnout jedno GPU na podprocesy, najdete v příručce k používání Horovod.

Běžnou chybou je, že objekty TensorFlow se nenašly nebo jsou v rozevíracím seznamu. K tomu dojde v případě, že příkazy import knihovny nejsou distribuovány jiným prováděcím modulům. Chcete-li se tomuto problému vyhnout, zahrňte všechny příkazy import (například import tensorflow as tf ) v horní části metody školení Horovod a uvnitř všech dalších uživatelsky definovaných funkcí volaných v rámci školicí metody Horovod.

Nahrávání školení Horovod pomocí časové osy Horovod

Horovod má možnost zaznamenat časovou osu aktivity s názvem Horovod časová osa.

Důležité

Horovod časová osa má významný dopad na výkon. Pokud je povolená časová osa Horovod, může se propustnost Inception3 snížit o ~ 40%. Pokud chcete zrychlit úlohy HorovodRunner, zakažte časovou osu Horovod.

Chcete-li zaznamenat časovou osu Horovod, nastavte HOROVOD_TIMELINE proměnnou prostředí na umístění, kam chcete uložit soubor časové osy. Datacihly doporučuje použít umístění ve sdíleném úložišti, aby bylo možné snadno načíst soubor časové osy. Například můžete použít rozhraní API místních souborů DBFS , jak je znázorněno níže:

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)

Pokud chcete stáhnout soubor časové osy, použijte datacihly CLI nebo úložištěsouborů a pak chrome://tracing ho zobrazte pomocí zařízení prohlížeče Chrome. Příklad:

Horovod časová osa

Pracovní postup vývoje

Toto jsou obecné kroky při migraci kódu hloubkového učení s jedním uzlem do distribuovaného školení. Příklady v této části ilustrují tyto kroky.

  1. Příprava kódu s jedním uzlem: Připravte a otestujte kód jednoho uzlu pomocí TensorFlow, Keras nebo PyTorch.
  2. Migrace na Horovod: Podle pokynů v tématu použití Horovod migrujte kód s Horovod a otestujte ho na ovladači:
    1. Přidejte hvd.init() k inicializaci Horovod.
    2. Připnutí grafického procesoru serveru, který má být použit tímto procesem config.gpu_options.visible_device_list , pomocí. Při typickém nastavení jednoho GPU na proces může být tato možnost nastavená na místní rozměr. V takovém případě se první proces na serveru přidělí prvnímu GPU, druhý proces bude přidělen druhému GPU a tak dále.
    3. Zahrňte horizontálních oddílů datové sady. Tento operátor DataSet je velmi užitečný při spuštění distribuovaného školení, protože umožňuje každému pracovnímu procesu číst jedinečnou podmnožinu.
    4. Škálujte studijní kurzy podle počtu pracovních procesů. Efektivní velikost dávky v synchronním distribuovaném školení se škáluje podle počtu pracovních procesů. Zvýšení míry učení je náhradou za zvýšenou velikost dávky.
    5. Zabalte Optimalizátor do hvd.DistributedOptimizer . Distribuované optimalizátory deleguje výpočet přechodu na původní Optimalizátor, průměruje přechody pomocí allreduce nebo allgather a pak použije průměrné přechody.
    6. Přidejte hvd.BroadcastGlobalVariablesHook(0) do stavů počátečních proměnných všesměrového vysílání z pořadí 0 do všech ostatních procesů. To je nezbytné k zajištění konzistentní inicializace všech pracovních procesů při zahájení školení s náhodnými tloušťkami nebo obnovením z kontrolního bodu. Případně, pokud nepoužíváte MonitoredTrainingSession , můžete provést hvd.broadcast_global_variables operaci po inicializaci globálních proměnných.
    7. Upravte kód tak, aby ušetřil kontrolní body jenom na pracovní podproces 0, aby se předešlo tomu, že ostatní pracovní procesy brání v jejich poškození.
  3. Migrace na HorovodRunner: HorovodRunner spustí úlohu školení Horovod vyvoláním funkce jazyka Python. Hlavní školicí postup musíte zabalit do jediné funkce Pythonu. Pak můžete testovat HorovodRunner v místním režimu a v distribuovaném režimu.

Aktualizace knihoven hloubkového učení

Poznámka

Tento článek obsahuje odkazy na podřízený termín, termín, který Azure Databricks již nepoužívá. Po odebrání termínu ze softwaru ho odebereme z tohoto článku.

Pokud upgradujete nebo downgradete TensorFlow, Keras nebo PyTorch, je nutné přeinstalovat Horovod, aby byl zkompilován proti nově nainstalované knihovně. Například pokud chcete upgradovat TensorFlow, datacihly doporučuje použít skript init z pokynů k instalaci TensorFlow a připojit následující TensorFlow kód instalace Horovod na konec tohoto. V tématu pokyny k instalaci Horovod můžete pracovat s různými kombinacemi, jako je například upgrade nebo downgrading PyTorch a jiné knihovny.

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

Příklady

Následující příklady založené na datové sadě mnist ručně zapsaných ukazují, jak migrovat program s hloubkovým učením s jedním uzlem na distribuovaný obsáhlý Learning pomocí HorovodRunner.