Skip to main content
  • Place orders quickly and easily
  • View orders and track your shipping status
  • Enjoy members-only rewards and discounts
  • Create and access a list of your products
  • Manage your Dell EMC sites, products, and product-level contacts using Company Administration.
Some article numbers may have changed. If this isn't what you're looking for, try searching all articles. Search articles

GPU'larda TF ve Horovod ile İş Akışını Optimize Etme İpuçları ve Püf Noktaları

Summary: Bu makalede, birden fazla GPU üzerinde TF ve Horovod kullanarak iş akışını optimize etmek için faydalanılabilecek ipuçları ve püf noktaları ayrıntılı şekilde verilmiştir.

This article may have been automatically translated. If you have any feedback regarding its quality, please let us know using the form at the bottom of this page.

Article Content


Symptoms

-

Cause

-

Resolution

Makale, Ekim 2019'da Rakshith Vasudev ve John Lockman - HPC AI Innovation Lab tarafından yazılmıştır


Giriş

Horovod; Tensorflow, Keras, Pytorch ve MXNet gibi farklı derin öğrenme çerçevelerinde eğitimi hızlandırmak için dağıtılmış bir derin öğrenme çerçevesidir. Dağıtılmış derin öğrenme projeleri kurmayı kolaylaştırmak ve bunları TensorFlow ile hızlandırabilmek için geliştirilmiştir. Horovod eğitim işlemini paralel hale getirmeyi destekler. Hem veri paralelliğini hem de model paralelliğini destekler. Horovod kullanan bir nöral ağ eğitim işi çalıştırılırken hata ayıklamak ve performansı gelişmek için bu yaygın ipuçları kullanılabilir.

 


Açıklama

Bu makale, referans olarak CheXNet'i kullanır. CheXNet, bir göğüs röntgeni görüntüsünde 14'e kadar patolojiyi tanımlamak için DenseNet'ten faydalanan bir yapay zeka radyolog asistan modelidir.

  1. Doğru ortam kurulumu, performans sorunlarıyla ilgili hataları ayıklamaya çalışırken büyük oranda zaman kazandırabilir. Derin öğrenme çerçevesinin GPU sürümünün kullanıldığından emin olun. Bu örnekte, anaconda tarafından paketlenmiş tensorflow-gpu kullanılmaktadır.

     
  2. Horovodrun veya mpirun kullanırken bağlama parametrelerinden faydalanmak performans kazanımları sağlayabilir. İdeal olarak GPU'yu denetleyen işlem, en yakın CPU soketine bağlanmalıdır. Dell EMC PowerEdge C4140'ta en uygun seçenek "--map-by" soket olacaktır. Herhangi bir bağlama seçeneği belirtmeniz gerekmez.

    Aşağıdaki gibi görünür: 

    mpirun --map-by socket -np x python pyfile.py - -pyoptions

     

  3. İş, tek bir MPI işlemi tek bir GPU'da çalışacak şekilde kurulmalıdır. GPU sayısından daha fazla işlem varsa işlemler, bilgi işlem kaynaklarının kullanımı için rekabet eder ve işi iyi performansla çalıştıramaz. Yukarıdaki örnekte x, kullanılacak GPU sayısına eşit olmalıdır.

     
  4. GPU başına bir işlem ayarlamak için tensorflow'un ConfigProto() işlevini şu şekilde kullanın:

    config.gpu_options.visible_device_list=str(hvd.local_size())

     

  5. GPU kullanan işlemlerin sayısını kontrol etmek için GPU 'watch nvidia-smi' bellek tüketimi kullanılabilir. Bu, güç tüketimini görmenize de olanak tanır.

    SLN318900_en_US__1image(12055)
    Şekil 1: Bellek, güç ve GPU kullanımını gösteren nvidia-smi komut çıktısının ekran görüntüsü.


     
  6. Veri ardışık düzeni doğru ayarlanmışsa ve mpirun parametreleri doğruysa model eğitimi başladığında GPU kullanımı sürekli olarak %90'ı aşmalıdır. Zaman zaman %10-25'lik kullanımlara düşüş kabul edilebilirdir ancak bu durum nadiren gerçekleşmelidir.


     
  7. Toplu iş boyutunu, GPU belleği neredeyse tamamen dolu ancak bellek gereksinimlerinin aşılmaması için sınırlandırılmış olacak şekilde ayarlayın. Öğrenme oranı ölçeklendirmesinin nasıl gerçekleştirildiğini göz önünde bulundurmak önem taşır. Öğrenme oranı ölçeklendirmesi, GPU sayısı arttıkça öğrenme oranının da GPU sayısıyla orantılı olarak arttığı bir konsepttir. Bu, modelin verimli bir şekilde yakınsama gerçekleştirebilmesini sağlar. Bu şekilde, model yakınsamasından ödün vermeden GPU'ya maksimum olası görüntü sayısı sığdırılarak g/ç işlemlerinin sayısı azaltılır. Dağıtılmış iş yükü kurulumunda öğrenme oranı ölçeklendirmesinin, model yakınsamasını iyileştirmek için her zaman en iyi çözüm olmayabileceği göz önünde bulundurulmalıdır.
    Öğrenme oranı ölçeklendirmesinin gerekli olup olmadığını kontrol etmek için:


    a) Modeli, dağıtılmış modda öğrenme oranı ölçeklendirmesiyle ve öğrenme oranı ölçeklendirmesi uygulamadan eğitin.
    b) Öğrenme oranı ölçeklendirmesi uygulanmayan model, öğrenme oranı ölçeklendirmesi uygulanan modelden daha iyi performans sergiliyorsa öğrenme oranı ölçeklendirmesi gerekmez. 


    Özellikle yakınsama için eğitim yaparken toplu iş başına daima mümkün olan en yüksek sayıda görüntüyü sığdırmak zorunlu bir kural değildir. Toplu iş boyutu ile yakınsama arasında genellikle ters orantılı bir ilişki vardır (öğrenme oranı ölçeklendirmesi kullanımından bağımsız olarak) ve işlemin kullanıldığı duruma dayanarak bu dengeyi veri bilimcisinin belirlemesi gerekir.
    Önceden belirttiğimiz gibi GPU belleği tüketimini 'watch nvidia-smi' komutunu kullanarak görebilirsiniz.  Bu durum incelemesinde, AUC değerleriyle daha iyi model elde edildiği için öğrenme oranı ölçeklendirmesi kullanılmamıştır ve yerel mini toplu iş boyutu 64'tür. Bu makalede açıklandığı üzere öğrenme oranı ölçeklendirmesi kullanıldığında ısınma devirleri gerçekleştirilmesi sık görünen bir durumdur.

     
  8. Oluşabilecek darboğazları görmek için horovod timeline ve nvprof kullanarak işleriniz için profil oluşturun.  Darboğazlar çoğunluklar aşağıdaki sebeplerden biri nedeniyle gerçekleşir:

    a) Tf data pipeline kurulumu iyi yapılmadığı için hızlandırıcı beklemedeyken veriyi hazırlamaya çok zaman harcanır. Bunu gidermek için tf pipeline'ın düzeltilmesi gerekir. 
    Tf data pipeline kurulumu hakkında bilgi için lütfen bu makaleyi okuyun. 

    b) İletişim doğru yapıyı kullanmıyor olabilir: InfiniBand kullandığınızdan emin olun ve yapı kullanımını görmek için mpirun komutunu çalıştırırken –x NCCL_DEBUG=INFO ifadesini aşağıdaki gibi ekleyin:
            mpirun -np 8 --map-by socket -x NCCL_DEBUG=INFO python $HOME/models/chexnet/chexnet.py --batch_size=128 --epochs=15
    veya –x bağlamasını içeren horovodrun öğesini kullanın.


     
  9. Dağıtımı doğru şekilde uygulamak için GPU'ların birbirileriyle etkili bir şekilde iletişim kurması gerekir. Etkili bir şekilde iletişim kuramıyorlarsa bu durum, iletişim darboğazına neden olur. Optimum şekilde iletişim kurup kurmadıklarını görmek için aşağıdaki işlemi kullanın:

    İlk olarak, yukarıdaki 8b maddesinde gösterildiği üzere -x binding'i kullanarak GPU'ların nasıl iletişim kurduğunu öğrenin

    GPU'lar iletişim kuruyorsa:
    1) Düğüm içinde optimum iletişim şuna benzer olacaktır:  
    gpu002:1299562:1299573 [0] NCCL INFO Ring 00 : 0[0] -> 1[1] P2P/IPC aracılığıyla
     
    2) Düğümün dışında optimum iletişim şuna benzer olacaktır:
    gpu028:149460:149495 [0] NCCL INFO Ring 01 : 16 -> 0 [send] NET/IB/0 aracılığıyla
    gpu009:164181:164216 [0] NCCL INFO Ring 01 : 12 -> 8 [receive] NET/IB/0 aracılığıyla
    gpu009:164181:164216 [0] NCCL INFO Ring 01 : 4 -> 8 [receive] NET/IB/0 aracılığıyla


Özellikle kullanılan düğüm/GPU sayısının performansa etkili bir şekilde yansımadığı durumlarda derin öğrenim işinizi dağıtmak zaman zaman zor olabilir. Hızlandırıcınıza yaptığınız yatırımdan en iyi şekilde faydalanmak için lütfen aşağıdaki en iyi uygulamaların izlendiğinden emin olun:
  • doğru bağlama seçeneklerini uygulama,
  • GPU belleğini harcamayan birden fazla işlemi değerlendirme,
  • modern bir ardışık düzen kurma yaklaşımı belirleme,
  • iş çalışırken GPU'ların en az %80 oranında kullanıldığından emin olmak için profil oluşturma,
  • CUDA ile ilgili en yeni kitaplıkları kullanma
 

Article Properties


Affected Product

High Performance Computing Solution Resources, Poweredge C4140

Last Published Date

17 Sep 2021

Version

4

Article Type

Solution