Yardım Kaggle üzerinde TensorFlow ile Büyük Bariyer Resifi korumak Meydan Üyelik

TensorFlow Profiler ile TensorFlow GPU performansını optimize edin

genel bakış

Bu kılavuz, GPU'larınız hakkında fikir edinmek ve bunlardan maksimum performansı elde etmek için TensorFlow Profiler'ı TensorBoard ile nasıl kullanacağınızı ve bir veya daha fazla GPU'nuz yeterince kullanılmadığında hata ayıklamayı gösterecektir.

Profiler'da yeniyseniz:

Hesaplamaların GPU'ya yüklenmesinin, özellikle küçük modeller için her zaman faydalı olmayabileceğini unutmayın. Aşağıdakiler nedeniyle ek yük olabilir:

  • Ana bilgisayar (CPU) ve cihaz (GPU) arasında veri aktarımı; ve
  • Ana bilgisayar GPU çekirdeklerini başlattığında ortaya çıkan gecikme nedeniyle.

Performans optimizasyonu iş akışı

Bu kılavuz, performans sorunlarının tek bir GPU ile başlayıp ardından birden çok GPU'lu tek bir ana bilgisayara nasıl geçileceğini özetlemektedir.

Performans sorunlarının aşağıdaki sırayla hata ayıklaması önerilir:

  1. Performansı bir GPU'da optimize edin ve hatalarını ayıklayın:
    1. Giriş boru hattının bir darboğaz olup olmadığını kontrol edin.
    2. Bir GPU'nun performansında hata ayıklayın.
    3. (Karışık hassas etkinleştirme fp16 ) (float16) ve isteğe bağlı olarak etkinleştirmek XLA .
  2. Çoklu GPU'lu tek ana bilgisayarda performansı optimize edin ve hata ayıklayın.

Örneğin, bir TensorFlow kullanıyorsanız dağıtım stratejisi çoklu GPU ve ihbar optimal GPU kullanımı ile tek bir ana bilgisayar üzerinde bir model eğitmek için şunları yapmalısınız ilk optimize ve multi-GPU sistemini ayıklama önce bir GPU performansı hata ayıklama.

GPU'larda ölçülebilir kodu almak için bir temel olarak, bu kılavuz zaten kullandığınız varsayılmaktadır tf.function . Keras Model.compile ve Model.fit API'leri kullanacak tf.function başlık altında otomatik. İle özel bir eğitim döngü yazarken tf.GradientTape , bakın tf.function ile daha iyi performans sağlamak için nasıl tf.function s.

Sonraki bölümlerde, performans darboğazlarını belirlemeye ve düzeltmeye yardımcı olmak için yukarıdaki senaryoların her biri için önerilen yaklaşımlar tartışılmaktadır.

1. Performansı bir GPU'da optimize edin

İdeal bir durumda, programınızın yüksek GPU kullanımı, minimum CPU (ana bilgisayar) ile GPU (aygıt) iletişimi olması ve giriş hattından ek yük olmaması gerekir.

Performansı analiz etmenin ilk adımı, tek GPU ile çalışan bir model için bir profil elde etmektir.

TensorBoard en Profiler'ın genel bakış sayfası modeliniz bir profil içinde nasıl bir performans bir üst düzey görünüşünü göstermektedir -ki vadede-olabilir program idealdir senaryodan ne kadar uzak olduğunu bir fikir vermektedir.

TensorFlow Profiler Overview Page

Genel bakış sayfasında dikkat edilmesi gereken anahtar numaralar şunlardır:

  1. Adım süresinin ne kadarı gerçek cihaz yürütmesinden geliyor
  2. Cihaza karşı ana bilgisayara yerleştirilen işlemlerin yüzdesi
  3. Kaç çekirdekleri kullanmak fp16

Optimum performansa ulaşmak, her üç durumda da bu sayıları maksimize etmek anlamına gelir. Programınızın derinlemesine anlamak için, TensorBoard en Profiler aşina olması gerekir iz görüntüleyici . Aşağıdaki bölümler, performans darboğazlarını teşhis ederken aramanız gereken bazı yaygın iz görüntüleyici kalıplarını göstermektedir.

Aşağıda, bir GPU üzerinde çalışan bir model izleme görünümünün bir görüntüsü bulunmaktadır. TensorFlow Adı Kapsam ve TensorFlow Ops bölümleri itibaren, ileri pas, kayıp fonksiyonu, geriye pas / degrade hesaplama ve iyileştirici ağırlık güncelleme gibi, modelin farklı bölümlerini tespit edebilir. Ayrıca CUDA akışları bakın yan yana Akışına GPU üzerinde çalışan operasyonlar, sahip olabilir. Her akış belirli görevler için kullanılır. Bu izlemede, Akış # 118 hesaplamak çekirdekleri ve cihazdan cihaza kopyalama başlatmak için kullanılır. # 119 konak cihaza kopyası için kullanılır akarsu ve ana kopyasına cihaz için Akış # 120.

Aşağıdaki iz, performans gösteren bir modelin ortak özelliklerini göstermektedir.

image

Örneğin, GPU hesaplama çizelgesi (Akış # 118) çok az boşluklar ile "meşgul" görünüyor. En az bir cihaza ana kopyalar (Akış # 119) ve cihazdan ana (Akış # 120), hem de adımlar arasında en az boşluklar vardır. Profiler'ı programınız için çalıştırdığınızda, bu ideal özellikleri izleme görünümünüzde tanımlayamayabilirsiniz. Bu kılavuzun geri kalanı, yaygın senaryoları ve bunların nasıl düzeltileceğini kapsar.

1. Giriş işlem hattında hata ayıklayın

GPU performansında hata ayıklamanın ilk adımı, programınızın girdiye bağlı olup olmadığını belirlemektir. Yararlanırız en kolay yolu Profiler'ın kullanmaktır Girdi-boru hattı analizörü giriş boru hattı geçirilen zamanın bir bakış sağlar TensorBoard üzerinde,.

image

Giriş hattınız adım zamanına önemli ölçüde katkıda bulunuyorsa, aşağıdaki olası eylemleri gerçekleştirebilirsiniz:

  • Sen kullanabilirsiniz tf.data e özgü rehber sizin giriş boru hattı hata ayıklama öğrenmek için.
  • Giriş hattının darboğaz olup olmadığını kontrol etmenin bir başka hızlı yolu, herhangi bir ön işleme gerektirmeyen rastgele oluşturulmuş giriş verilerini kullanmaktır. İşte bir örnek bir ResNet modeli için bu tekniği kullanarak. Giriş ardışık düzeni optimalse, gerçek verilerle ve oluşturulan rastgele/sentetik verilerle benzer performansı deneyimlemeniz gerekir. Sentetik veri durumundaki tek ek yük, yine önceden alınabilen ve optimize edilebilen girdi veri kopyasından kaynaklanacaktır.

Buna ek olarak, bakınız giriş veri boru hattı optimize etmek için en iyi uygulamalar .

2. Bir GPU'nun performansında hata ayıklayın

Düşük GPU kullanımına katkıda bulunabilecek birkaç faktör vardır. Aşağıda bakarken sık gözlenen bazı senaryolar vardır iz görüntüleyici ve potansiyel çözümlere.

1. Adımlar arasındaki boşlukları analiz edin

Programınız en iyi şekilde çalışmadığında yaygın bir gözlem, eğitim adımları arasındaki boşluklardır. Aşağıdaki izleme görünümünün görüntüsünde, 8. ve 9. adımlar arasında büyük bir boşluk vardır, bu da GPU'nun bu süre boyunca boşta olduğu anlamına gelir.

image

İz görüntüleyiciniz adımlar arasında büyük boşluklar gösteriyorsa, bu, programınızın girdiye bağlı olduğunun bir göstergesi olabilir. Bu durumda, henüz yapmadıysanız, giriş boru hattınızda hata ayıklama ile ilgili önceki bölüme başvurmalısınız.

Bununla birlikte, optimize edilmiş bir giriş hattıyla bile, CPU iş parçacığı çekişmesi nedeniyle bir adımın sonu ile diğerinin başlangıcı arasında hala boşluklar olabilir. tf.data boru hattı işlemesini parallelize arka plan iş parçacığı kullanır. Bu iş parçacıkları, veri kopyalama veya GPU işlemlerini zamanlama gibi her adımın başında gerçekleşen GPU ana bilgisayar tarafı etkinliğine müdahale edebilir.

Hangi programları GPU bu ops konak tarafında, üzerinde büyük boşluklar oluştuğunu fark ederseniz, ortam değişkeni ayarlayabilirsiniz TF_GPU_THREAD_MODE=gpu_private . GPU çekirdekleri kendi özel iş parçacığı başlatılan ve arkasında sıraya alamadım Bu olmasını sağlar tf.data işin.

Adımlar arasında boşluklar da dışında metrik hesaplamalar, Keras geri aramaları veya ops neden olabilir tf.function ana bilgisayarda çalıştırmak söyledi. Bu operasyonlar, bir TensorFlow grafiği içindeki operasyonlar kadar iyi performansa sahip değildir. Ek olarak, bu işlemlerin bazıları CPU üzerinde çalışır ve tensörleri GPU'dan ileri geri kopyalar.

Giriş işlem hattınızı optimize ettikten sonra hala izleme görüntüleyicide adımlar arasında boşluklar fark ederseniz, adımlar arasındaki model koduna bakmalı ve geri aramaları/metrikleri devre dışı bırakmanın performansı iyileştirip iyileştirmediğini kontrol etmelisiniz. Bu operasyonların bazı detayları da iz görüntüleyicide (hem cihaz hem de ana bilgisayar tarafında) bulunur. Bu senaryodaki tavsiye, bu operasyonların ek yükünü, her adım yerine sabit sayıda adımdan sonra yürüterek amorti etmektir. Kullanırken compile yöntemi tf.keras ayarlayarak, API experimental_steps_per_execution bayrağı otomatik olarak yapar. Özel eğitim döngüler, kullanım için tf.while_loop .

2. Daha yüksek cihaz kullanımı elde edin

1. Küçük GPU çekirdekleri ve ana bilgisayar çekirdeği başlatma gecikmeleri

Ana bilgisayar, çekirdekleri GPU'da çalıştırılmak üzere sıraya koyar, ancak çekirdekler gerçekte GPU'da yürütülmeden önce bir gecikme (yaklaşık 20-40 μsn) söz konusudur. İdeal bir durumda, ana bilgisayar GPU'da yeterli sayıda çekirdeği kuyruğa alır, böylece GPU, ana bilgisayarın daha fazla çekirdeği kuyruğa almasını beklemek yerine, zamanının çoğunu yürütmeye harcar.

Profiler'ın bakış sayfası GPU nedeniyle fırlatma çekirdeklerinde ana bilgisayarda beklemeye boşta olduğunu ne kadar zaman TensorBoard şovlarda. Aşağıdaki resimde, GPU, çekirdeklerin başlatılmasını bekleyen adım süresinin yaklaşık %10'u boyunca boştadır.

image

İz gösterici bu aynı program gösterir konakçı bir grafik işlemci yoğun fırlatma çekirdekleri olan çekirdekler arasındaki küçük boşlukları için.

image

GPU'da çok sayıda küçük operasyon başlatarak (örneğin bir skaler ekleme gibi), ana bilgisayar GPU'ya ayak uyduramayabilir. TensorFlow İstatistikleri 2.77 saniye alarak aynı Profil gösterileri 126.224 Mul operasyonları için TensorBoard içinde aracı. Bu nedenle, her bir çekirdek yaklaşık 21.9 μs'dir, bu çok küçüktür (başlatma gecikmesiyle yaklaşık aynı zamanda) ve potansiyel olarak ana bilgisayar çekirdeği başlatma gecikmelerine neden olabilir.

image

Eğer iz görüntüleyici yapabilirsiniz yukarıdaki resimde gibi GPU üzerinde ops arasındaki gösterileri birçok küçük boşluklar:

  • Küçük tensörleri birleştirin ve vektörleştirilmiş operasyonları kullanın veya başlatılan her çekirdeğin daha fazla iş yapmasını sağlamak için daha büyük bir toplu iş boyutu kullanın, bu da GPU'yu daha uzun süre meşgul tutacaktır.
  • Emin kullandığınız olun tf.function bir saf istekli modda op çalışmıyor böylece, TensorFlow grafikler oluşturmak için. Eğer kullanıyorsanız Model.fit (aynı ile özel eğitim döngüye karşı tf.GradientTape ardından) tf.keras.Model.compile sizin için otomatik olarak yapacaktır.
  • Sigorta ile XLA kullanılarak çekirdeğinin tf.function(jit_compile=True) veya otomatik kümeleme. Daha ayrıntılı bilgi için gitmek karışık hassasiyet ve XLA etkinleştirme yüksek performans elde etmek XLA nasıl etkinleştireceğinizi öğrenmek için aşağıdaki bölümü. Bu özellik, yüksek cihaz kullanımına yol açabilir.
2. TensorFlow op yerleşimi

Profiler'ın genel bakış sayfası gösterir size cihazda vs konak yerleştirilen ops yüzdesi (ayrıca bakarak belirli ops yerleştirilmesini kontrol edebilirsiniz iz görüntüleyici . Beğen aşağıdaki resimde, ana bilgisayardaki ops yüzdesini istiyorum cihaza göre çok küçük.

image

İdeal olarak, yoğun işlem gerektiren işlemlerin çoğu GPU'ya yerleştirilmelidir.

Modelinizdeki operasyonları ve tansörler seti, atanmış hangi cihazların öğrenmek için tf.debugging.set_log_device_placement(True) programınızın ilk ifadesi olarak.

(: Örnek belirli bir aygıtı, bu koşulu geçersiz olabilir onun uygulanması üzerine yerleştirilmek üzere bir operasyon belirtmek bile bazı durumlarda unutmayın tf.unique ). Hatta tek GPU eğitimi için, örneğin bir dağıtım stratejisi, belirterek tf.distribute.OneDeviceStrategy cihazınızda ops daha deterministik yerleşim sonuçlanabilir.

İşlemlerin çoğunluğunun GPU'ya yerleştirilmesinin bir nedeni, ana bilgisayar ile cihaz arasında aşırı bellek kopyalarını önlemektir (ana bilgisayar ile cihaz arasındaki model giriş/çıkış verileri için bellek kopyaları beklenir). Aşırı kopyalama bir örneği, bir grafik işlemci aşağıdaki iz görünümünde gösterilmiştir, # 168 ve # 169 # 167 aktarır.

image

Bu kopyalar, GPU çekirdeklerinin yürütülmesini engellerlerse bazen performansa zarar verebilir. Hafıza operasyonları kopyalamak izleyici iz bu kopyalanan tensörlerinin kaynağıdır ops hakkında daha fazla bilgiye sahip, ama her zaman bir op ile memcopy ilişkilendirmek kolay olmayabilir. Bu durumlarda, hafıza kopyasının her adımda aynı yerde olup olmadığını kontrol etmek için yakındaki operasyonlara bakmak faydalı olur.

3. GPU'larda daha verimli çekirdekler

Programınızın GPU kullanımı kabul edilebilir olduğunda, bir sonraki adım, Tensör Çekirdeklerini veya birleştirme işlemlerini kullanarak GPU çekirdeklerinin verimliliğini artırmaya bakmaktır.

1. Tensör Çekirdeklerini Kullanın

Modern NVIDIA® GPU'lar uzman var tensör Çekirdekleri önemli ölçüde hak çekirdeklerin performansını artırabilir.

Sen TensorBoard en kullanabilirsiniz GPU çekirdek istatistikleri tensör Çekirdek-uygundur ve çekirdekleri tensör Çekirdekleri kullanmakta olduğunuz hangi GPU çekirdekleri görselleştirmek için. Etkinleştirilmesi fp16 (aşağıda Karışık Hassas bölümüne etkinleştirme bakınız) programınızın Genel Matris Çarpma yapmak için bir yoludur (GEMM) çekirdekleri (matmul ops) tensör Çekirdek kullanmaktadır. Hassas fp16 ve giriş / çıkış tensör boyutları 8 veya 16 (üzere tarafından bölünebilen Grafik İşlemcisi çekirdekleri verimli tensör iç kısım, kullanım int8 ).

Marka için GPU'ları için verimli çekirdeğinin nasıl diğer ayrıntılı öneriler için bkz derin performans öğrenme NVIDIA®'dan kılavuzu.

2. Sigorta işlemleri

Kullanım tf.function(jit_compile=True) önemli performans kazançları yol açan daha büyük tanelerini oluşturmak üzere daha küçük ops kaynaştırmak için. Daha fazla bilgi için bakınız XLA rehberi.

3. Karma hassasiyet ve XLA'yı etkinleştirin

Yukarıdaki adımları izledikten sonra, karışık hassasiyet ve XLA'yı etkinleştirmek, performansı daha da iyileştirmek için atabileceğiniz iki isteğe bağlı adımdır. Önerilen yaklaşım, bunları birer birer etkinleştirmek ve performans faydalarının beklendiği gibi olduğunu doğrulamaktır.

1. Karışık hassasiyeti etkinleştirin

TensorFlow Karışık hassas kılavuz gösterileri nasıl etkinleştirmek için fp16 GPU'ları üzerine hassas. Enable AMP tensör Çekirdekleri kullanmak ve kullanımdan hemen karşılaştırıldığında 3x genel hızlandırıcılar kadar gerçekleştirmek için NVIDIA® GPU'larında fp32 Volta ve daha yeni GPU mimarileri üzerinde (float32) hassasiyet.

Matris/tensör boyutlarının, Tensör Çekirdeklerini kullanan çekirdekleri çağırma gereksinimlerini karşıladığından emin olun. GPU çekirdekleri, hassasiyet fp16 olduğunda ve giriş/çıkış boyutları 8 veya 16'ya bölünebildiğinde (int8 için) Tensör Çekirdeklerini verimli bir şekilde kullanır.

cuDNN v7.6.3 ve sonraki sürümlerde, Tensör Çekirdeklerinden yararlanmak için gerektiğinde evrişim boyutlarının otomatik olarak doldurulacağını unutmayın.

Performans yararları maksimize için aşağıdaki en iyi uygulamaları izleyin fp16 hassas.

1. Optimum fp16 çekirdeklerini kullanın

İle fp16 etkin, programınızın matris çarpım (GEMM) çekirdekleri, ilgili kullanmalıdır fp16 tensör Çekirdekleri kullanır sürümü. Ancak, bazı durumlarda, bu olmaz ve etkinleştirme beklenen hıza deneyimi yok fp16 programınız yerine geri verimsiz uygulanmasına düştükçe,.

image

GPU çekirdeğin ops tensör Çekirdek uygun ve çekirdekleri vardır istatistikleri sayfasında gösterileri aslında verimli tensör Çekirdek kullanıyor. Derin öğrenme performansına NVIDIA® kılavuzu tensör Çekirdekleri kaldıraç konusunda ek öneriler içermektedir. Ayrıca, kullanmanın yararları fp16 şimdi op yarım zaman alacak olarak da, daha önce bağlanmış bellek idi çekirdeklerinde gösterecektir.

2. Dinamik ve statik kayıp ölçeklendirmesi

Kullanırken Zarar ölçekleme gereklidir fp16 düşük olması nedeniyle hassas Yetersizlik önlemek için. Daha ayrıntılı olarak açıklanmıştır her ikisi de zarar ölçekleme, dinamik ve statik iki tür vardır Karışık Hassas kılavuz . Sen kullanabilirsiniz mixed_float16 otomatik Keras optimizer içinde kayıp ölçeklendirme etkinleştirmek için ilkeyi.

Performansı optimize etmeye çalışırken, dinamik kayıp ölçeklemenin ana bilgisayar üzerinde çalışan ek koşullu işlemler sunabileceğini ve iz görüntüleyicideki adımlar arasında görünür olacak boşluklara yol açabileceğini hatırlamak önemlidir. Öte yandan, statik kayıp ölçeklemenin bu tür genel giderleri yoktur ve doğru statik kayıp ölçek değerini belirtmeniz gereken yakalama ile performans açısından daha iyi bir seçenek olabilir.

2. XLA'yı tf.function(jit_compile=True) veya otomatik kümeleme ile etkinleştirin

Tek bir GPU ile en iyi performansı elde etmenin son adımı olarak, işlemleri birleştirecek ve daha iyi cihaz kullanımına ve daha düşük bellek ayak izine yol açacak XLA'yı etkinleştirmeyi deneyebilirsiniz. İle programa XLA etkinleştirme hakkında ayrıntılar için tf.function(jit_compile=True) veya otomatik kümeleme, bakın XLA rehber.

Sen küresel JIT düzeyini ayarlayabilirsiniz -1 (off), 1 veya 2 . Daha yüksek bir düzey daha agresiftir ve paralelliği azaltabilir ve daha fazla bellek kullanabilir. İçin değerini ayarlayın 1 bellek kısıtlamaları varsa. XLA derleyicisinin yeni şekillerle karşılaştığında çekirdekleri derlemeye devam etmesi gerekeceğinden, XLA'nın değişken giriş tensörü şekillerine sahip modeller için iyi performans göstermediğini unutmayın.

2. Çoklu GPU'lu tek ana bilgisayarda performansı optimize edin

tf.distribute.MirroredStrategy API tek bir ana bilgisayar üzerinde birden GPU'ları bir GPU dan ölçekli model eğitimi için kullanılabilir. (Bkz, daha TensorFlow ile dağıtılan eğitim nasıl yapılacağı hakkında bilgi edinmek için TensorFlow ile Dağıtılmış eğitim , Kullanım bir GPU ve Kullanım TPU kılavuzları ve Keras ile Dağıtılmış eğitim öğretici.)

Bir GPU'dan birden fazla GPU'ya geçiş ideal olarak kutudan çıkar çıkmaz ölçeklenebilir olsa da, bazen performans sorunlarıyla karşılaşabilirsiniz.

Tek bir GPU ile eğitimden aynı ana bilgisayar üzerinde birden fazla GPU'ya geçerken, ideal olarak, yalnızca gradyan iletişiminin ek yükü ve artan ana bilgisayar iş parçacığı kullanımı ile performans ölçeklendirmesini deneyimlemelisiniz. Bu ek yük nedeniyle, örneğin 1 GPU'dan 2 GPU'ya geçerseniz tam 2 kat hızlanma elde edemezsiniz.

Aşağıdaki izleme görünümü, birden fazla GPU'da eğitim yaparken ek iletişim yükünün bir örneğini gösterir. Gradyanları birleştirmek, bunları replikalar arasında iletmek ve ağırlık güncellemesini yapmadan önce bölmek için bir miktar ek yük vardır.

image

Aşağıdaki kontrol listesi, çoklu GPU senaryosunda performansı optimize ederken daha iyi performans elde etmenize yardımcı olacaktır:

  1. Daha yüksek cihaz kullanımına yol açacak ve birden çok GPU'da iletişim maliyetlerini amorti edecek olan parti boyutunu en üst düzeye çıkarmaya çalışın. Kullanılması Bellek profilcisini program tepe bellek kullanımı ne kadar yakın bir fikir edinmek yardımcı olur. Daha yüksek bir parti boyutunun yakınsamayı etkileyebileceğini, ancak bunun genellikle performans avantajlarından daha ağır bastığını unutmayın.
  2. Tek bir GPU'dan birden çok GPU'ya geçerken, aynı ana bilgisayarın artık çok daha fazla girdi verisini işlemesi gerekiyor. Bu nedenle (1)'den sonra, giriş boru hattı performansının yeniden kontrol edilmesi ve bunun bir darboğaz olmadığından emin olunması önerilir.
  3. Programınızın izleme görünümündeki GPU zaman çizelgesini gereksiz AllReduce çağrıları için kontrol edin, çünkü bu, tüm cihazlar arasında bir senkronizasyona neden olur. Yukarıda gösterilen iz görünümünde, AllReduce ile yapılır NCCLS çekirdek, ve her bir aşama Gradyanlar için, her bir grafik işlemci sadece bir NCCLS çağrı var.
  4. Minimuma indirilebilecek gereksiz D2H, H2D ve D2D kopyalama işlemlerini kontrol edin.
  5. Her bir kopyanın aynı işi yaptığından emin olmak için adım süresini kontrol edin. Örneğin, bir GPU (genellikle bu gerçekleşebilir GPU0 konak yanlışlıkla üzerine daha fazla iş koyarak biter çünkü) oversubscribed edilir.
  6. Son olarak, sırayla yürütülen herhangi bir işlem için izleme görünümünüzdeki tüm GPU'lardaki eğitim adımını kontrol edin. Bu genellikle, programınız bir GPU'dan diğerine kontrol bağımlılıkları içerdiğinde olur. Geçmişte, bu durumda performansta hata ayıklama, duruma göre çözülmüştür. Eğer programda bu davranışı gözlemlemek Eğer bir GitHub sorunu dosyasını sizin iz bakış görüntülerle.

1. Gradyan AllReduce'u optimize edin

Senkronize bir strateji ile eğitim yaparken, her cihaz giriş verilerinin bir kısmını alır.

Model üzerinden ileri ve geri geçişleri hesapladıktan sonra, her cihazda hesaplanan gradyanların toplanması ve azaltılması gerekir. Bu gradyan AllReduce her aygıt üzerinde gradient hesaplamadan sonra gerçekleşir ve en iyi duruma önce örnek ağırlıkları güncelleştirir.

Her grafik işlemcisi, önce modeli katmanlar arasındaki farklılıkların birleştirir kullanılarak grafik işlemcileri üzerinde bunları iletişim tf.distribute.CrossDeviceOps ( tf.distribute.NcclAllReduce varsayılan), ve daha sonra tabaka başına indirgemeden sonra gradyanları döndürür.

Optimize edici, modelinizin ağırlıklarını güncellemek için bu azaltılmış gradyanları kullanacaktır. İdeal olarak, herhangi bir ek yükü önlemek için bu işlem tüm GPU'larda aynı anda gerçekleşmelidir.

AllReduce süresi yaklaşık olarak şu şekilde olmalıdır:

(number of parameters * 4bytes)/ (communication bandwidth)

Bu hesaplama, dağıtılmış bir eğitim işini yürütürken sahip olduğunuz performansın beklendiği gibi olup olmadığını veya daha fazla performans hata ayıklaması yapmanız gerekip gerekmediğini anlamak için hızlı bir kontrol olarak kullanışlıdır. Sen adresinin modelinde parametre sayısını alabilirsiniz Model.summary .

TensorFlow tüketildiğinden Not Her model parametresi boyutunda 4 bayt olduğunu fp32 gradyanlarını iletişim kurmak için (float32). Eğer zaman bile fp16 etkin, NCCLS AllReduce kullanır fp32 parametreleri.

Ölçeklendirmenin avantajlarından yararlanmak için, adım süresinin bu genel giderlere kıyasla çok daha yüksek olması gerekir. Bunu başarmanın bir yolu, toplu iş boyutu adım süresini etkilediğinden, ancak iletişim ek yükünü etkilemediğinden daha yüksek bir toplu iş boyutu kullanmaktır.

2. GPU ana bilgisayar iş parçacığı çekişmesi

Birden fazla GPU çalıştırırken, CPU'nun görevi, GPU çekirdeklerini aygıtlar arasında verimli bir şekilde başlatarak tüm aygıtları meşgul etmektir.

Bununla birlikte, CPU'nun bir GPU üzerinde planlayabileceği çok sayıda bağımsız işlem olduğunda, CPU bir GPU'yu meşgul etmek için çok sayıda ana bilgisayar iş parçacığını kullanmaya karar verebilir ve ardından çekirdekleri deterministik olmayan bir sırayla başka bir GPU'da başlatabilir. . Bu, performansı olumsuz yönde etkileyebilecek bir çarpıklığa veya negatif ölçeklemeye neden olabilir.

İz görüntüleyici gösterileri altında havai zaman verimsiz CPU baş dönmesi ve göz kararması GPU çekirdeği lansmanları, olarak GPU1 boşta ve ardından sonra op yayınlamaya başlar GPU2 başlamıştır.

image

Konak üzerinde tanelerini başlattığını konak gösteriler için izleme görünümü GPU2 bunları başlatmadan önce GPU1 (aşağıda olduğu not tf_Compute* op işlemci parçacığı göstergesi değildir).

image

Programınızın izleme görünümünde GPU çekirdeklerinde bu tür bir şaşırtmayla karşılaşırsanız, önerilen eylem şudur:

  • TensorFlow ortam değişkeni Set TF_GPU_THREAD_MODE için gpu_private . Bu ortam değişkeni, ana bilgisayara bir GPU için iş parçacıklarını gizli tutmasını söyler.
  • Varsayılan olarak, TF_GPU_THREAD_MODE=gpu_private çoğu durumda yeterlidir 2'ye parçacığı sayısını, ayarlar. Ancak, bu sayı TensorFlow ortam değişkeni ayarlayarak değiştirilebilir TF_GPU_THREAD_COUNT parçacığı istenen numaraya.