Makale, Ekim 2019'da Rakshith Vasudev ve John Lockman - HPC AI Innovation Lab tarafından yazılmıştır
Daha önce tanıtıldığı üzere CheXNet, bir göğüs röntgen görüntüsünde 14'e kadar patoloji tanımlamak için DenseNet'ten faydalanan bir yapay zeka radyolog asistanı modelidir. Orijinal CheXNet-121 kadar veya ondan daha iyi performans gösterebilecek bir modelin eğitimini ölçeklendirmek için çeşitli yaklaşımlar araştırılmış ve ResNet-50 hem ölçeklenebilirlik hem de artırılmış eğitim doğruluğu (pozitif AUROC) konusunda gelecek vadetmiştir. Yazarlar CPU sistemlerinde ölçeklenebilirliği gösterdiler ancak biz eğitim sürecini hızlandırmak için GPU'ların paralelliğinden yararlanmak istiyoruz. Bu makalede, Dell EMC C4140 sunucularında Nvidia V100 SXM2 GPU'ları kullanan CheXNet'in dağıtılmış ölçek genişletme eğitiminde maksimum performans elde etmek için en iyi uygulamaları açıklıyoruz. Dell EMC PowerEdge C4140, SXM2 yapılandırmasında dört adet Nvidia V100 GPU ile hem yoğunluk hem de performans sağlar.
Donanım Yapılandırması: | Yazılım Yapılandırması: |
---|---|
|
|
Yeni bilgi işlem aygıtları (GPU'lar ve TPU'lar gibi) nöral ağları giderek daha hızlı bir şekilde eğitmeyi mümkün kıldığından CPU işleme, darboğaz olma eğilimindedir. Tf.data API'si, kullanıcılara CPU'yu etkin bir şekilde kullanan giriş ardışık düzenleri tasarlamaları için yapı taşları sağlar ve ETL sürecinin her adımını optimize eder.
Bir eğitim adımı gerçekleştirmek için önce eğitim verilerini ayıklamanız ve dönüştürmeniz, ardından bunu hızlandırıcı üzerinde çalışan bir modele beslemeniz gerekir. Ancak bir saf eş zamanlı uygulamada CPU verileri hazırlarken, hızlandırıcı boştadır. Buna karşılık, hızlandırıcı modeli eğitirken de CPU boştadır. Eğitim adım süresi bu nedenle hem CPU ön işleme süresinin hem de hızlandırıcı eğitim süresinin toplamıdır
Ardışık Düzen Oluşturma, bir eğitim adımının ön işlemesiyle ve model yürütmesiyle çakışır. Hızlandırıcı N eğitim adımını gerçekleştirirken CPU verileri N+1 adımı için hazırlar. Bunu sayede eğitimin adım süresi (toplamın aksine) maksimuma ve verilerin ayıklanması ve dönüştürülmesi için gereken süre azaltılır.
Ardışık düzen olmadan, CPU ve GPU/TPU çoğu zaman boşta kalır:
Şekil 1: Sıralı yürütme genellikle GPU'yu boşta bırakır
Ardışık düzen oluşturmayla, boşta kalma süresi önemli ölçüde azalır:
Şekil 2: Ardışık düzen oluşturma, CPU ve GPU kullanımıyla çakışarak GPU kullanımını en üst düzeye çıkarır
Tf.data API'si, tf.data.Dataset.prefetch dönüşümü aracılığıyla, verinin üretildiği zamanı tüketildiği zamandan ayırmak için kullanılabilen bir ardışık düzen oluşturma yazılım mekanizması sağlar. Dönüşüm özel olarak, talep edilmelerinden önce girdi veri kümesindeki öğeleri önceden getirmek için bir arka plan iş parçacığı ve bir dahili arabellek kullanır.
Buradan daha fazla bilgi edinebilirsiniz: https://www.tensorflow.org/guide/performance/datasets
Tensorflow tarafından sağlanan yönergeler takip edildiğinde, şuna benzeyen bir veri ardışık düzeni elde etmek mümkündür (önceki Yaklaşım):
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/old_approach.py
Önceli yaklaşım olarak belirtilen bu yaklaşımda, tf veri ardışık düzeni aşağıdakileri gerçekleştirir (göğüs röntgeni veri kümesinin bir TFRecords dizisi olduğu varsayılarak):
Ancak bu, en iyi işleyen kod değildir. Yavaşlamalara ve sık sık %0 gpu kullanımına neden olur. Temel olarak hızlandırıcıları etkili bir şekilde kullanamaz.
Tf veri ardışık düzenini doğru şekilde kurmak üzere, özellikle ResNet için olan tensorflow resmi modelleri tarafından benimsenen yaklaşımı izleriz. Eski yaklaşım ve yeni yaklaşım arasındaki fark, modele beslenmeden önce veri ardışık düzeninin nasıl kurulduğudur.
Yeni yaklaşım şu şekilde görünür:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py
Yeni yaklaşım olarak belirtilen TensorFlow resmi modeller yaklaşımı şu şekildedir:
Burada, TF Resmi modellerini kullanan eski ve yeni yaklaşımların performansının bir karşılaştırması verilmiştir.
Şekil 3: Yeni yaklaşımla, doğrusala yakın ölçeklendirme beklenebilir.
Görüldüğü gibi, önemli bir performans düşüşü mevcuttur. Önceki yaklaşımdaysa hiç ölçeklendirme yoktur. GPU'lar genellikle çok az kullanılır veya hiç kullanılmaz, bu da performansın sabit kalmasına neden olur. İletişimin iyi yönetilmesi halinde bir GPU'da hesaplamayı daha verimli hale getirmek, birden çok düğümde birden fazla GPU'da hesaplamayı daha verimli hale getirmek anlamına gelir.
CPU'ların ön işlemeyi paralel olarak yapması, işlenen verileri belleğe önceden getirmesi ve hızlı iletişim ile matris çarpımının ağır yükünü GPU'ların üstlenmesi bu yeni yaklaşımı çoklu düğümler için ölçeklendirmeyi daha çekici kılan bir başka özelliktir.
İşlerinizi yürüten ortam, işleriniz kadar önemlidir çünkü doğru kitaplıklara/modüllere sahip olmak, eğitim performansını etkileyeceği için önemlidir. CUDA ile ilgili en yeni kitaplıklara sahip olmak da performansı iyileştirmeye yardımcı olabilir.
Bir çalışma ortamı kurulumunuz yoksa yüklemek için bu öğreticiyi izleyin.
MPI, horovod'un işleri dağıtmasına yardımcı olan bir iletişim kitaplığıdır. Farklı bağlama ve eşleme parametre seçenekleri araştırıldı ve C4140 için en iyi parametreler soket ile eşleme oldu. Önerilen ayar aşağıdaki gibidir:mpirun --map-by socket -np x python pyfile.py --pyoptions
Bir GPU'da çalışan birden fazla işlem varsa GPU kaynakları için birbirleriyle mücadele ediyor, GPU belleğini tüketiyor ve toplu işbaşına etkili bir şekilde daha fazla görüntü sığdırmıyor ve bu nedenle GPU performansının düşmesine sebep oluyor olabilirler. Tensorflow 1.13.1 araştırıldı ancak o dönem bir hatası varmış gibi görünüyordu. GPU başına birden fazla işlem başlatıyordu.
Özet olarak: