Článek napsali Rakshith Vasudev a John Lockman – HPC AI Innovation Lab v říjnu 2019
Jak již bylo uvedeno dříve, CheXNet je model AI asistenta rentgenu, který využívá síť DenseNet k identifikaci až 14 patologií z daného rentgenového snímku hrudníku. Prozkoumali jsme několik přístupů, jak škálovat učení modelu, aby mohl fungovat stejně, nebo dokonce lépe než původní model CheXNet-121. Síť ResNet-50 přitom slibuje zlepšení na poli škálovatelnosti a přesnosti školení (pozitivní AUROC). Autoři demonstrovali škálovatelnost v systémech s procesory, nicméně my chceme využít paralelismus grafických karet k urychlení procesu učení. V tomto článku popisujeme vzorové postupy k dosažení maximálního výkonu distribuovaného, horizontálně škálovaného učení modelu CheXNet s využitím grafických karet Nvidia V100 SXM2 v serverech Dell EMC C4140. Server Dell EMC PowerEdge C4140 poskytuje hustotu a výkon díky čtyřem grafickým kartám Nvidia V100 v konfiguraci SXM2.
Konfigurace hardwaru: | Konfigurace softwaru: |
---|---|
|
|
Jelikož nová výpočetní zařízení (jako grafické karty a jednotky TPU) umožňují stále rychleji učit neuronové sítě, procesor se může stát omezujícím faktorem. Rozhraní API tf.data poskytuje uživatelům stavební bloky pro návrh vstupních kanálů, které efektivně využívají procesor a optimalizují každý krok procesu ETL.
Chcete-li provést krok učení, musíte nejprve extrahovat a transformovat školicí data a poté je předat modelu na akcelerátoru. Zatímco však procesor v synchronní implementaci připravuje data, akcelerátor je nečinný. Naopak když akcelerátor učí model, je nečinný procesor. Čas kroku učení tedy představuje součet doby přípravného zpracovávání procesoru a doby učení akcelerátoru.
Pipelining se překrývá s předběžným zpracováváním a modelovým provedením kroku učení. Když akcelerátor provádí krok učení N, procesor připravuje data na krok N+1. Tím se zkrátí čas kroku na maximum (na rozdíl od součtu) učení a doba potřebná k extrahování a transformaci dat.
Bez pipeliningu jsou procesor a grafická karta / jednotka TPU po většinu času nečinné:
Obr. 1: Sekvenční spouštění často ponechá grafickou kartu v nečinnosti
Díky pipeliningu se doba nečinnosti výrazně snižuje:
Obr. 2: Pipelining překrývá využití procesoru a grafické karty a maximalizuje využití grafické karty
Rozhraní tf.data API poskytuje mechanismus pipeliningu softwaru prostřednictvím transformace tf.data.Dataset.prefetch, který lze použít k oddělení času produkce dat od času konzumace dat. Transformace využívá konkrétně vlákno na pozadí a interní vyrovnávací paměť k předběžnému načítání prvků ze vstupní datové sady, než jsou potřeba.
Další informace naleznete zde: https://www.tensorflow.org/guide/performance/datasets
Pokud se budete řídit pokyny softwaru Tensorflow, můžete získat datový kanál, který vypadá takto (starý přístup):
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/old_approach.py
V tomto přístupu označovaném také jako starý přístup datový kanál tf provádí následující operace (za předpokladu, že datová sada rentgenového snímku hrudníku je sekvence formátu TFRecords):
Nejedná se však o nejvýkonnější kód. Způsobuje zamrzání a časté využití grafické karty na 0 %. V zásadě nevyužívá akcelerátory efektivně.
Ke správnému nastavení datového kanálu tf se řídíme přístupem, který využívají oficiální modely Tensorflow, konkrétně ten pro model ResNet. Rozdíl mezi starým a novým přístupem spočívá v nastavení datového kanálu, než jej předáte modelu.
Nový přístup vypadá takto:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py
Oficiální přístup modelů TensorFlow, označovaný také jako nový přístup, je následující:
Zde je uvedeno srovnání výkonu starých i nových přístupů s využitím oficiálních modelů TF.
Obr. 3: Díky novému přístupu je možné očekávat téměř lineární škálování.
Jak je vidět, jedná se o výraznou změnu ve výkonu a v případě starého přístupu není k dispozici žádné škálování. U grafických karet často docházelo k minimálnímu až žádnému využití, což vedlo k zastavení výkonu. Pokud komunikace probíhá správně, zefektivnění výpočetního výkonu u jedné grafické karty se projeví ve zefektivnění více grafických karet na několika uzlech.
To, že procesory provádí předběžné zpracování paralelně a předběžně načítají zpracovaná data v paměti a grafických kartách, které provádí náročné úkony maticové multiplikace pomocí rychlé komunikace, je dalším aspektem, díky kterému je tento nový přístup atraktivnější pro škálování u více uzlů.
Prostředí, které spouští vaše úlohy, je stejně důležité jako úlohy samotné, protože správnost knihoven/modulů ovlivňuje výkon učení. Ke zlepšení výkonu mohou pomoci také nejnovější knihovny související s architekturou CUDA.
Pokud nemáte nastaveno funkční prostředí, postupujte podle tohoto návodu.
MPI je komunikační knihovna, která pomáhá platformě Horovod distribuovat úlohy. Byly prozkoumány různé možnosti vazeb a mapování parametrů. Nejlepších parametrů v případě serveru C4140 bylo dosaženo pomocí mapování podle soketu. Následuje doporučené nastavení:mpirun --map-by socket -np x python pyfile.py --pyoptions
Pokud na jedné grafické kartě probíhá více než jeden proces, mohou soupeřit o prostředky grafické karty, zabírat paměť karty a efektivně neumisťovat více snímků na dávku. Tudíž jsou zodpovědné za snížení výkonu grafické karty. Byl prozkoumán software Tensorflow 1.13.1, ale zdá se, že v té době obsahoval chybu. Na jedné grafické kartě spouštěl více než jeden proces.
Shrnutí: