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

Nvidia V100 GPU'larla Dell C4140'ta CheXNet Eğitimi İçin İyileştirme Teknikleri (İngilizce)

Summary: 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.

This article applies to This article does not apply to This article is not tied to any specific product. Not all product versions are identified in this article.

Symptoms

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

Cause

  -

Resolution

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ı:
  • 4 adet PowerEdge C4140
  • 4 adet Nvidia V100 32 GB SXM2
  • 2 adet 2,40 GHz'de 20 çekirdekli Intel(R) Xeon(R) Gold 6148 CPU
  • 384 GB RAM, DDR4 2666 MHz
  • 1 adet Mellanox EDR HCA
  • Lustre dosya sistemi
  • Deep Learning Framework (Derin Öğrenme Çerçevesi): tensorflow-gpu
  • Çerçeve sürümü: 1.12.0
  • Horovod sürümü: 0.16.4
  • MPI sürümü: 4.0.0, cuda ve ucx destekli
  • CUDA sürümü: 10.1.105
  • CUDNN sürümü: 7.6.0
  • NCCL sürümü: 2.4.7
  • Python sürümü: 3.6.8
  • İşletim sistemi ve sürümü: RHEL 7.4


 


Veri ardışık düzeni, hızlandırıcılarınızdan en yüksek performansı elde etmek için kritik öneme sahiptir:



 

Tf verileri nedir, neden kullanmak için çaba göstermelisiniz?

 

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:

SLN318898_en_US__1Sequantial execution
Ş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:

SLN318898_en_US__2Pipelining overlaps
Ş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):

 

  1. Dosya adlarının tam listesini alır.
  2. TFRecordDataset() kullanarak dosya adları listesinden bir veri kümesi oluşturur.
  3. Görüntüleri önceden işleyerek yükleyen ve biçimlendiren yeni bir veri kümesi oluşturur.
  4. Veri kümesini küçük parçalara ayırır (sharding).
  5. Eğitim sırasında veri kümesini karıştırır.
  6. Veri kümesini tekrarlar.
  7. Veri kümesini toplu olarak işler.
  8. Batch_size için veri kümesini önceden getirir.


 

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:

 

  1. Dosya adlarının tam listesini alır.
  2. from_tensor_slices() kullanarak dosya adları listesinden bir veri kümesi oluşturur.
  3. Küçük parçalara ayırma işlemi (sharding) önceden yapılır.
  4. Veri kümesi eğitim sırasında karıştırılır.
  5. Daha sonra veri kümesi paralel olarak aralandırılır. Bu işlem, TFRecord veri kümesi oluşturmak üzere dönüştürmek için birden çok dosyayı (cycle_length ile tanımlanır) araya ekler ve işler.
  6. Ardından veri kümesi önceden getirilir. buffer_size, kaç kaydın önceden getirileceğini tanımlar. Bu, genellikle işin mini batch_size'ıdır.
  7. Veri kümesi yeniden karıştırılır. Karıştırmanın ayrıntıları, buffer_size tarafından kontrol edilir.
  8. Veri kümesi tekrarlanır.  Eğitim için veri kümesini num_epochs'a kadar tekrarlar.
  9. Veri kümesi, tf kayıt dosyalarını ayrıştıran ve ardından görüntüyü önceden işleyen ve bunları toplu hale getiren eş zamanlı map_and_batch() işlemine tabi tutulur.
  10. Önceden işlenmiş görüntü bir veri kümesi olarak hazırdır ve yeniden önceden getirilir.


 

Burada, TF Resmi modellerini kullanan eski ve yeni yaklaşımların performansının bir karşılaştırması verilmiştir.

SLN318898_en_US__3image(12053)
Ş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.


 


Optimum performans elde etmek için bakılması gereken diğer teknikler:



 

Doğru ortama sahip olmak önemlidir:

 

İş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 için doğru bağlama parametreleri kullanma:

 

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 işlemin tek bir GPU üzerinde hareket ettiğinden emin olun:

 

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:

  • Veri ardışık düzeninin doğru şekilde kurulması, performans kazanımlarını görmek için kritik öneme sahiptir.
  • Doğru ortamı kurmak, daha iyi performans için iyi bir katkı sağlayıcıdır.
  • MPI için doğru bağlama parametrelerinin kullanılması, performansın iyileştirilmesine yardımcı olur.
  • GPU'lar tam olarak kullanılmadığında profil oluşturun dar boğazları düzeltin.


 


Affected Products

High Performance Computing Solution Resources, Poweredge C4140
Article Properties
Article Number: 000124384
Article Type: Solution
Last Modified: 17 Sep 2021
Version:  5
Find answers to your questions from other Dell users
Support Services
Check if your device is covered by Support Services.