Bu kılavuz, TensorFlow modellerinizin performansını izlemek için TensorFlow Profiler'da bulunan araçların nasıl kullanılacağını gösterir. Modelinizin ana bilgisayarda (CPU), aygıtta (GPU) veya hem ana bilgisayar hem de aygıt(lar)ın birleşiminde nasıl performans gösterdiğini öğreneceksiniz.
Profil oluşturma, modelinizdeki çeşitli TensorFlow işlemlerinin (ops) donanım kaynak tüketimini (zaman ve bellek) anlamanıza ve performans darboğazlarını çözmenize ve nihayetinde modelin daha hızlı çalışmasını sağlamaya yardımcı olur.
Bu kılavuz, Profiler'ın nasıl kurulacağı, mevcut çeşitli araçlar, Profiler'ın performans verilerini nasıl topladığına ilişkin farklı modlar ve model performansını optimize etmek için önerilen bazı en iyi uygulamalar konusunda size yol gösterecektir.
Cloud TPU'larda modelinizin performansının profilini çıkarmak istiyorsanız Cloud TPU kılavuzuna bakın.
Profiler ve GPU ön koşullarını yükleyin
TensorBoard için Profiler eklentisini pip ile yükleyin. Profiler'ın TensorFlow ve TensorBoard'un en son sürümlerini gerektirdiğini unutmayın (>=2.2).
pip install -U tensorboard_plugin_profile
GPU'da profil oluşturmak için şunları yapmalısınız:
- TensorFlow GPU destek yazılımı gereksinimlerinde listelenen NVIDIA® GPU sürücüleri ve CUDA® Araç Takımı gereksinimlerini karşılayın.
NVIDIA® CUDA® Profil Oluşturma Araçları Arayüzü'nün (CUPTI) yolda bulunduğundan emin olun:
/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH) | \ grep libcupti
Yolda CUPTI yoksa, şunu çalıştırarak kurulum dizinini $LD_LIBRARY_PATH
ortam değişkeninin başına ekleyin:
export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
Ardından, CUPTI kitaplığının bulunduğunu doğrulamak için yukarıdaki ldconfig
komutunu tekrar çalıştırın.
Ayrıcalık sorunlarını çözün
Docker ortamında veya Linux'ta CUDA® Toolkit ile profil oluşturmayı çalıştırdığınızda, yetersiz CUPTI ayrıcalıklarıyla ilgili sorunlarla karşılaşabilirsiniz ( CUPTI_ERROR_INSUFFICIENT_PRIVILEGES
). Bu sorunları Linux'ta nasıl çözebileceğiniz hakkında daha fazla bilgi edinmek için NVIDIA Geliştirici Belgelerine gidin.
Bir Docker ortamında CUPTI ayrıcalık sorunlarını çözmek için şunu çalıştırın:
docker run option '--privileged=true'
Profil oluşturucu araçları
Profil oluşturucuya, yalnızca bazı model verilerini aldıktan sonra görünen TensorBoard'daki Profil sekmesinden erişin.
Profiler, performans analizine yardımcı olacak çeşitli araçlara sahiptir:
- Genel Bakış Sayfası
- Giriş Hattı Analizörü
- TensorFlow İstatistikleri
- İz Görüntüleyici
- GPU Çekirdeği İstatistikleri
- Bellek Profili Aracı
- Pod Görüntüleyici
Genel bakış sayfası
Genel bakış sayfası, bir profil çalıştırması sırasında modelinizin nasıl performans gösterdiğine dair üst düzey bir görünüm sağlar. Sayfa, ana makineniz ve tüm cihazlar için toplu bir genel bakış sayfası ve model eğitim performansınızı iyileştirmeye yönelik bazı öneriler gösterir. Ayrıca Ana Bilgisayar açılır menüsünden ayrı ana bilgisayarları da seçebilirsiniz.
Genel bakış sayfası verileri aşağıdaki gibi görüntüler:
Performans Özeti : Model performansınızın üst düzey bir özetini görüntüler. Performans özeti iki bölümden oluşur:
Adım-zaman dökümü: Ortalama adım süresini, zamanın harcandığı birden çok kategoriye ayırır:
- Derleme: Çekirdekleri derlemek için harcanan zaman.
- Giriş: Giriş verilerini okumak için harcanan zaman.
- Çıktı: Çıktı verilerini okumak için harcanan zaman.
- Çekirdek başlatma: Ana bilgisayar tarafından çekirdekleri başlatmak için harcanan süre
- Ana bilgisayar hesaplama zamanı..
- Cihazdan cihaza iletişim süresi.
- Cihazda işlem süresi.
- Python ek yükü dahil diğerleri.
Aygıt hesaplama kesinliği - 16 ve 32 bit hesaplamaları kullanan aygıt hesaplama süresinin yüzdesini bildirir.
Adım Zamanı Grafiği : Örneklenen tüm adımlar üzerinden cihaz adım zamanının (milisaniye cinsinden) bir grafiğini görüntüler. Her adım, zamanın harcandığı birden fazla kategoriye (farklı renklerle) bölünür. Kırmızı alan, cihazların ana bilgisayardan giriş verilerini beklerken boşta oturdukları adım süresinin kısmına karşılık gelir. Yeşil alan, cihazın gerçekte ne kadar süre çalıştığını gösterir.
Cihazdaki en iyi 10 TensorFlow işlemi (örn. GPU) : En uzun süre çalışan cihazdaki işlemleri görüntüler.
Her satır, bir operasyonun kendi zamanını (tüm operasyonlar tarafından geçen sürenin yüzdesi olarak), kümülatif zamanı, kategoriyi ve adı görüntüler.
Çalıştırma Ortamı : Aşağıdakileri içeren model çalıştırma ortamının üst düzey bir özetini görüntüler:
- Kullanılan ana bilgisayar sayısı.
- Cihaz tipi (GPU/TPU).
- Cihaz çekirdeği sayısı.
Sonraki Adım için Öneri : Bir modelin girişe bağlı olduğunu bildirir ve model performansı darboğazlarını bulmak ve çözmek için kullanabileceğiniz araçlar önerir.
Giriş boru hattı analizörü
Bir TensorFlow programı bir dosyadan veri okuduğunda, ardışık düzende TensorFlow grafiğinin en üstünde başlar. Okuma işlemi, bir aşamanın çıktısının bir sonraki aşamanın girişi olduğu, seri olarak bağlanmış birden çok veri işleme aşamasına bölünmüştür. Bu veri okuma sistemine giriş boru hattı denir.
Dosyalardan kayıtları okumak için tipik bir ardışık düzen aşağıdaki aşamalara sahiptir:
- Dosya okuma.
- Dosya ön işleme (isteğe bağlı).
- Ana bilgisayardan cihaza dosya aktarımı.
Verimsiz bir girdi işlem hattı, uygulamanızı ciddi şekilde yavaşlatabilir. Bir uygulama, girdi boru hattında zamanın önemli bir bölümünü harcadığında girdiye bağlı olarak kabul edilir. Giriş işlem hattının nerede verimsiz olduğunu anlamak için giriş işlem hattı çözümleyicisinden elde edilen bilgileri kullanın.
Giriş işlem hattı çözümleyicisi, programınızın girişe bağlı olup olmadığını hemen söyler ve giriş işlem hattının herhangi bir aşamasında performans darboğazlarında hata ayıklamak için cihaz ve ana bilgisayar tarafı analizinde size yol gösterir.
Veri girişi işlem hatlarınızı optimize etmek için önerilen en iyi uygulamalar için giriş işlem hattı performansına ilişkin kılavuzu kontrol edin.
Giriş hattı kontrol paneli
Giriş ardışık düzen çözümleyicisini açmak için Profil öğesini seçin, ardından Araçlar açılır menüsünden input_pipeline_analyzer öğesini seçin.
Kontrol paneli üç bölüm içerir:
- Özet : Uygulamanızın girdiye bağlı olup olmadığı ve bağlıysa ne kadar bağlı olduğuna ilişkin bilgilerle birlikte genel girdi ardışık düzenini özetler.
- Cihaz tarafı analizi : Cihaz adım zamanı ve her adımda çekirdekler arasında giriş verilerini beklemek için harcanan cihaz süresi aralığı dahil olmak üzere ayrıntılı, cihaz tarafı analiz sonuçlarını görüntüler.
- Ana bilgisayar tarafı analizi : Ana bilgisayardaki giriş işleme süresinin dökümü de dahil olmak üzere ana bilgisayar tarafında ayrıntılı bir analiz gösterir.
Giriş hattı özeti
Özet , programınızın girişe bağlı olup olmadığını, ana bilgisayardan giriş beklerken harcanan cihaz süresinin yüzdesini sunarak raporlar. Enstrümanlı standart bir girdi ardışık düzeni kullanıyorsanız araç, girdi işleme süresinin çoğunun nerede harcandığını bildirir.
Cihaz tarafı analizi
Cihaz tarafı analizi, cihazda ana bilgisayarda harcanan süreye ve ana bilgisayardan giriş verilerini beklerken ne kadar cihaz süresi harcandığına ilişkin bilgiler sağlar.
- Adım numarasına karşı çizilen adım süresi : Örneklenen tüm adımlar üzerinden cihaz adım süresinin (milisaniye cinsinden) bir grafiğini görüntüler. Her adım, zamanın harcandığı birden fazla kategoriye (farklı renklerle) bölünür. Kırmızı alan, cihazların ana bilgisayardan giriş verilerini beklerken boşta oturdukları adım süresinin kısmına karşılık gelir. Yeşil alan, cihazın gerçekte ne kadar süre çalıştığını gösterir.
- Adım süresi istatistikleri : Cihaz adım süresinin ortalamasını, standart sapmasını ve aralığını ([minimum, maksimum]) raporlar.
Ana bilgisayar tarafı analizi
Ana bilgisayar tarafı analizi, ana bilgisayardaki giriş işleme süresinin ( tf.data
API işlemlerinde harcanan süre) birkaç kategoriye ayrıldığını bildirir:
- Talep üzerine dosyalardan veri okuma : Önbelleğe alma, önceden getirme ve araya ekleme olmadan dosyalardan veri okumak için harcanan zaman.
- Dosyalardan önceden veri okuma : Önbelleğe alma, önceden getirme ve araya ekleme dahil olmak üzere dosyaları okumak için harcanan zaman.
- Veri ön işleme : Görüntü açma gibi ön işleme operasyonlarında harcanan zaman.
- Cihaza aktarılacak verileri kuyruğa alma : Verileri cihaza aktarmadan önce verileri bir besleme kuyruğuna koymak için harcanan süre.
Bireysel giriş operasyonlarının istatistiklerini ve yürütme süresine göre ayrılmış kategorilerini incelemek için Giriş Operasyon İstatistikleri'ni genişletin.
Aşağıdaki bilgileri içeren her girişle birlikte bir kaynak veri tablosu görünecektir:
- Giriş İşlemi : Giriş işleminin TensorFlow işlem adını gösterir.
- Count : Profil oluşturma süresi boyunca op yürütme örneklerinin toplam sayısını gösterir.
- Toplam Süre (ms cinsinden) : Bu örneklerin her birinde harcanan zamanın kümülatif toplamını gösterir.
- Toplam Süre % : Bir operasyonda harcanan toplam süreyi, girdi işlemede harcanan toplam sürenin bir bölümü olarak gösterir.
- Toplam Kendi Kendine Zaman (ms cinsinden) : Bu örneklerin her birinde harcanan kendi kendine zamanın kümülatif toplamını gösterir. Buradaki self time, çağırdığı fonksiyonda harcanan zaman hariç, fonksiyon gövdesi içinde harcanan zamanı ölçer.
- Toplam Kendi Kendine Zaman % . Toplam kendi kendine süreyi, girdi işlemeye harcanan toplam sürenin bir bölümü olarak gösterir.
- Kategori . Giriş işleminin işleme kategorisini gösterir.
TensorFlow istatistikleri
TensorFlow İstatistikleri aracı, bir profil oluşturma oturumu sırasında ana bilgisayar veya cihazda yürütülen her TensorFlow işleminin (op) performansını görüntüler.
Araç, performans bilgilerini iki bölmede görüntüler:
Üst bölmede dört adede kadar pasta grafiği görüntülenir:
- Ana bilgisayardaki her işlemin kendi kendine yürütme süresinin dağılımı.
- Ana bilgisayardaki her op türünün kendi kendine yürütme süresinin dağılımı.
- Cihazdaki her işlemin kendi kendine yürütme süresinin dağılımı.
- Cihazdaki her op türünün kendi kendine yürütme süresinin dağılımı.
Alt bölmede, her işlem için bir satır ve her veri türü için bir sütun (sütun başlığına tıklayarak sütunları sıralayın) ile TensorFlow işlemleriyle ilgili verileri rapor eden bir tablo gösterilir. Bu tablodaki verileri bir CSV dosyası olarak dışa aktarmak için üst bölmenin sağ tarafındaki CSV Olarak Dışa Aktar düğmesini tıklayın.
Dikkat:
Herhangi bir operasyonun alt operasyonları varsa:
- Bir operasyonun toplam "birikmiş" süresi, alt operasyonlarda harcanan zamanı içerir.
- Bir operasyonun toplam "self" süresi, alt operasyonlarda harcanan zamanı içermez.
Ana bilgisayarda bir işlem yürütülürse:
- Op on tarafından yapılan cihazdaki toplam kendi kendine zamanın yüzdesi 0 olacaktır.
- Bu operasyona kadar ve bu operasyon dahil olmak üzere cihazdaki toplam kendi kendine zamanın kümülatif yüzdesi 0 olacaktır.
Cihazda bir işlem yürütülürse:
- Bu operasyonun ana bilgisayardaki toplam kendi kendine zaman yüzdesi 0 olacaktır.
- Bu operasyona kadar ve bu operasyon dahil olmak üzere ana bilgisayarda toplam kendi kendine zamanın kümülatif yüzdesi 0 olacaktır.
Pasta grafiklere ve tabloya Boşta kalma süresini dahil etmeyi veya hariç tutmayı seçebilirsiniz.
İz görüntüleyici
İz görüntüleyici şunları gösteren bir zaman çizelgesi görüntüler:
- TensorFlow modeliniz tarafından yürütülen operasyonların süreleri
- Sistemin hangi bölümü (ana bilgisayar veya cihaz) bir işlemi yürütür. Tipik olarak, ana bilgisayar giriş işlemlerini yürütür, eğitim verilerini önceden işler ve cihaza aktarırken, cihaz gerçek model eğitimini yürütür.
İz görüntüleyici, modelinizdeki performans sorunlarını belirlemenize ve ardından bunları çözmek için adımlar atmanıza olanak tanır. Örneğin, yüksek düzeyde, zamanın çoğunu girdi eğitiminin mi yoksa model eğitiminin mi aldığını belirleyebilirsiniz. Detaya inerek, hangi operasyonların yürütülmesinin en uzun sürdüğünü belirleyebilirsiniz. İz görüntüleyicinin cihaz başına 1 milyon olayla sınırlı olduğunu unutmayın.
İz görüntüleyici arayüzü
İz görüntüleyiciyi açtığınızda, en son çalıştırmanızı görüntüleyen görünür:
Bu ekran aşağıdaki ana öğeleri içerir:
- Zaman çizelgesi bölmesi : Cihazın ve ana bilgisayarın zaman içinde yürüttüğü işlemleri gösterir.
- Ayrıntılar bölmesi : Zaman Çizelgesi bölmesinde seçilen işlemler için ek bilgileri gösterir.
Zaman Çizelgesi bölmesi aşağıdaki öğeleri içerir:
- Üst çubuk : Çeşitli yardımcı kontroller içerir.
- Zaman ekseni : İz başlangıcına göre zamanı gösterir.
- Bölüm ve parça etiketleri : Her bölüm birden fazla parça içerir ve solda, bölümü genişletmek ve daraltmak için tıklayabileceğiniz bir üçgen vardır. Sistemdeki her işlem elemanı için bir bölüm vardır.
- Araç seçici : Yakınlaştırma, Kaydırma, Seçme ve Zamanlama gibi iz görüntüleyiciyle etkileşim kurmak için çeşitli araçlar içerir. Bir zaman aralığını işaretlemek için Zamanlama aracını kullanın.
- Olaylar : Bunlar, bir operasyonun yürütüldüğü süreyi veya eğitim adımları gibi meta-olayların süresini gösterir.
Bölümler ve parçalar
İz görüntüleyici aşağıdaki bölümleri içerir:
- Her aygıt düğümü için, aygıt yongasının ve yonga içindeki aygıt düğümünün numarasıyla etiketlenmiş bir bölüm (örneğin,
/device:GPU:0 (pid 0)
). Her aygıt düğümü bölümü aşağıdaki parçaları içerir:- Adım : Cihazda yürütülen egzersiz adımlarının süresini gösterir.
- TensorFlow Ops : Cihazda yürütülen işlemleri gösterir
- XLA Ops : Kullanılan derleyici XLA ise, cihazda çalışan XLA işlemlerini (ops) gösterir (her TensorFlow işlemi bir veya birkaç XLA işlemine çevrilir. XLA derleyicisi XLA işlemlerini cihazda çalışan koda çevirir).
- Ana makinenin CPU'sunda çalışan iş parçacıkları için "Ana İş Parçacıkları" etiketli bir bölüm. Bölüm, her CPU iş parçacığı için bir iz içerir. Bölüm etiketlerinin yanında görüntülenen bilgileri yok sayabileceğinizi unutmayın.
Olaylar
Zaman çizelgesindeki olaylar farklı renklerde görüntülenir; renklerin kendilerinin belirli bir anlamı yoktur.
İz görüntüleyici, TensorFlow programınızdaki Python işlev çağrılarının izlerini de görüntüleyebilir. tf.profiler.experimental.start
API'sini kullanıyorsanız, profil oluşturmaya başlarken ProfilerOptions
adlı tuple öğesini kullanarak Python izlemeyi etkinleştirebilirsiniz. Alternatif olarak, profil oluşturmak için örnekleme modunu kullanırsanız, Profil Yakala iletişim kutusundaki açılır seçenekleri kullanarak izleme düzeyini seçebilirsiniz.
GPU çekirdek istatistikleri
Bu araç, her GPU hızlandırmalı çekirdek için performans istatistiklerini ve kaynak işlemi gösterir.
Araç, bilgileri iki bölmede görüntüler:
Üst bölme, geçen en yüksek toplam süreye sahip CUDA çekirdeklerini gösteren bir pasta grafiği görüntüler.
Alt bölme, her benzersiz çekirdek-op çifti için aşağıdaki verileri içeren bir tablo görüntüler:
- Çekirdek-op çiftine göre gruplandırılmış toplam GPU süresinin azalan düzende bir sıralaması.
- Başlatılan çekirdeğin adı.
- Çekirdek tarafından kullanılan GPU kayıtlarının sayısı.
- Bayt cinsinden kullanılan paylaşılan (statik + dinamik paylaşılan) belleğin toplam boyutu.
-
blockDim.x, blockDim.y, blockDim.z
olarak ifade edilen blok boyutu. -
gridDim.x, gridDim.y, gridDim.z
olarak ifade edilen ızgara boyutları. - Operasyonun Tensör Çekirdeklerini kullanmaya uygun olup olmadığı.
- Çekirdeğin Tensor Core talimatları içerip içermediği.
- Bu çekirdeği başlatan operasyonun adı.
- Bu çekirdek-op çiftinin oluşum sayısı.
- Mikrosaniye cinsinden toplam GPU süresi.
- Mikrosaniye cinsinden ortalama GPU süresi.
- Mikrosaniye cinsinden minimum GPU süresi.
- Mikrosaniye cinsinden maksimum geçen GPU süresi.
Bellek profili aracı
Bellek Profili aracı, profil oluşturma aralığı sırasında cihazınızın bellek kullanımını izler. Bu aracı aşağıdakiler için kullanabilirsiniz:
- En yüksek bellek kullanımını ve TensorFlow operasyonlarına karşılık gelen bellek tahsisini belirleyerek bellek yetersiz (OOM) sorunlarının hatalarını ayıklayın. Ayrıca, çok kiracılı çıkarım çalıştırdığınızda ortaya çıkabilecek OOM sorunlarının hatalarını ayıklayabilirsiniz.
- Hata ayıklama bellek parçalanma sorunları.
Bellek profili aracı, verileri üç bölümde görüntüler:
- Bellek Profili Özeti
- Bellek Zaman Çizelgesi Grafiği
- Bellek Döküm Tablosu
Bellek profili özeti
Bu bölüm, aşağıda gösterildiği gibi TensorFlow programınızın bellek profilinin üst düzey bir özetini görüntüler:
Bellek profili özeti altı alana sahiptir:
- Bellek Kimliği : Kullanılabilir tüm aygıt bellek sistemlerini listeleyen açılır menü. Açılır menüden görüntülemek istediğiniz bellek sistemini seçin.
- #Allocation : Profil oluşturma aralığı sırasında yapılan bellek ayırma sayısı.
- #Deallocation : Profil oluşturma aralığındaki bellek ayırma sayısı
- Bellek Kapasitesi : Seçtiğiniz bellek sisteminin toplam kapasitesi (GiB cinsinden).
- Tepe Yığın Kullanımı : Model çalışmaya başladığından beri en yüksek bellek kullanımı (GiB'lerde).
- Tepe Bellek Kullanımı : Profil oluşturma aralığındaki en yüksek bellek kullanımı (GiB cinsinden). Bu alan aşağıdaki alt alanları içerir:
- Zaman Damgası : Zaman Çizelgesi Grafiğinde en yüksek bellek kullanımının ne zaman gerçekleştiğinin zaman damgası.
- Yığın Rezervasyonu : Yığında ayrılmış bellek miktarı (GiB cinsinden).
- Heap Ayırma : Yığına ayrılan bellek miktarı (GiB cinsinden).
- Boş Bellek : Boş bellek miktarı (GiB cinsinden). Bellek Kapasitesi, Yığın Rezervasyonu, Yığın Tahsisi ve Boş Belleğin toplamıdır.
- Parçalanma : Parçalanma yüzdesi (düşük daha iyidir). Yüzde olarak hesaplanır
(1 - Size of the largest chunk of free memory / Total free memory)
.
Bellek zaman çizelgesi grafiği
Bu bölüm, bellek kullanımının (GiB cinsinden) bir grafiğini ve zamana karşı parçalanma yüzdesini (ms cinsinden) görüntüler.
X ekseni, profil oluşturma aralığının zaman çizelgesini (ms cinsinden) temsil eder. Soldaki Y ekseni bellek kullanımını (GiB'lerde) ve sağdaki Y ekseni parçalanma yüzdesini temsil eder. X eksenindeki her zaman noktasında, toplam bellek üç kategoriye ayrılır: yığın (kırmızı), yığın (turuncu) ve boş (yeşil). Aşağıdaki gibi o noktada bellek ayırma/serbest bırakma olaylarıyla ilgili ayrıntıları görüntülemek için belirli bir zaman damgasının üzerine gelin:
Açılır pencere aşağıdaki bilgileri görüntüler:
- timestamp(ms) : Seçilen olayın zaman çizelgesindeki konumu.
- olay : Olay türü (tahsis veya serbest bırakma).
- request_size(GiBs) : İstenen bellek miktarı. Bu, serbest bırakma olayları için negatif bir sayı olacaktır.
- tahsis_boyutu(GiBs) : Ayrılan gerçek bellek miktarı. Bu, serbest bırakma olayları için negatif bir sayı olacaktır.
- tf_op : Tahsisi/tahsisi talep eden TensorFlow işlemi.
- step_id : Bu olayın gerçekleştiği eğitim adımı.
- bölge_tipi : Ayrılan bu belleğin veri varlığı türü. Olası değerler geçiciler için
temp
, etkinleştirmeler ve gradyanlar içinoutput
ve ağırlıklar ve sabitler içinpersist
/dynamic
. - data_type : Tensör öğesi türü (örneğin, 8 bitlik işaretsiz tamsayı için uint8).
- tensor_shape : Ayrılan/tahsis edilen tensörün şekli.
- memory_in_use(GiBs) : Bu zaman noktasında kullanımda olan toplam bellek.
Bellek dökümü tablosu
Bu tablo, profil oluşturma aralığındaki en yüksek bellek kullanımı noktasındaki etkin bellek tahsislerini gösterir.
Her TensorFlow Op için bir satır vardır ve her satırda aşağıdaki sütunlar bulunur:
- İşlem Adı : TensorFlow işleminin adı.
- Ayırma Boyutu (GiBs) : Bu operasyona ayrılan toplam bellek miktarı.
- Talep Edilen Boyut (GiBs) : Bu işlem için talep edilen toplam bellek miktarı.
- Olaylar : Bu operasyon için tahsis sayısı.
- Bölge türü : Ayrılan bu belleğin veri varlığı türü. Olası değerler geçiciler için
temp
, etkinleştirmeler ve gradyanlar içinoutput
ve ağırlıklar ve sabitler içinpersist
/dynamic
. - Veri türü : Tensör öğesi türü.
- Shape : Ayrılan tensörlerin şekli.
Kapsül görüntüleyici
Pod Görüntüleyici aracı, tüm çalışanlar için bir eğitim adımının dökümünü gösterir.
- Üst bölmede, adım numarasını seçmek için bir kaydırıcı bulunur.
- Alt bölmede yığılmış bir sütun grafiği görüntülenir. Bu, birbirinin üzerine yerleştirilmiş parçalı adım-zaman kategorilerinin üst düzey bir görünümüdür. Yığılmış her sütun benzersiz bir çalışanı temsil eder.
- Fareyle yığılmış bir sütunun üzerine geldiğinizde, sol taraftaki kart, adım dökümü hakkında daha fazla ayrıntı gösterir.
tf.data darboğaz analizi
tf.data
darboğaz analiz aracı, programınızdaki tf.data
giriş hatlarındaki darboğazları otomatik olarak algılar ve bunların nasıl düzeltileceği konusunda öneriler sunar. Platformdan (CPU/GPU/TPU) bağımsız olarak tf.data
kullanan herhangi bir programla çalışır. Analizi ve tavsiyeleri bu kılavuza dayanmaktadır.
Aşağıdaki adımları izleyerek bir darboğaz tespit eder:
- En çok girdiye bağlı ana bilgisayarı bulun.
- Bir
tf.data
giriş hattının en yavaş yürütmesini bulun. - Profil oluşturucu izlemesinden girdi işlem hattı grafiğini yeniden oluşturun.
- Giriş boru hattı grafiğinde kritik yolu bulun.
- Kritik yoldaki en yavaş dönüşümü bir darboğaz olarak tanımlayın.
Kullanıcı Arayüzü üç bölüme ayrılmıştır: Performans Analizi Özeti , Tüm Giriş İşlem Hatlarının Özeti ve Giriş İşlem Hattı Grafiği .
Performans analizi özeti
Bu bölüm, analizin özetini sunar. Profilde algılanan yavaş tf.data
giriş işlem hatları hakkında rapor verir. Bu bölüm ayrıca, en fazla girdiye bağlı ana bilgisayarı ve maksimum gecikme süresine sahip en yavaş girdi ardışık düzenini gösterir. En önemlisi, giriş hattının hangi bölümünün darboğaz olduğunu ve nasıl düzeltileceğini tanımlar. Darboğaz bilgisi, yineleyici türü ve uzun adı ile sağlanır.
tf.data yineleyicinin uzun adı nasıl okunur
Uzun bir ad, Iterator::<Dataset_1>::...::<Dataset_n>
olarak biçimlendirilir. Uzun <Dataset_n>
, yineleyici türüyle eşleşir ve uzun addaki diğer veri kümeleri aşağı akış dönüşümlerini temsil eder.
Örneğin, aşağıdaki giriş işlem hattı veri kümesini göz önünde bulundurun:
dataset = tf.data.Dataset.range(10).map(lambda x: x).repeat(2).batch(5)
Yukarıdaki veri kümesindeki yineleyiciler için uzun adlar şöyle olacaktır:
Yineleyici Türü | Uzun isim |
---|---|
Menzil | Yineleyici::Toplu::Tekrar::Harita::Aralık |
Harita | Yineleyici::Toplu::Tekrar::Harita |
Tekrar et | Yineleyici::Toplu::Tekrar |
Grup | Yineleyici::Toplu |
Tüm giriş işlem hatlarının özeti
Bu bölüm, tüm ana bilgisayarlardaki tüm girdi işlem hatlarının özetini sağlar. Tipik olarak bir giriş boru hattı vardır. Dağıtım stratejisini kullanırken, programın tf.data
kodunu çalıştıran bir ana bilgisayar giriş hattı ve ana bilgisayar giriş hattından veri alan ve cihazlara aktaran birden fazla cihaz giriş hattı vardır.
Her girdi işlem hattı için yürütme süresinin istatistiklerini gösterir. Bir arama 50 μs'den uzun sürerse yavaş sayılır.
Giriş hattı grafiği
Bu bölüm, yürütme süresi bilgisiyle birlikte giriş boru hattı grafiğini gösterir. Hangi ana makineyi ve giriş hattını göreceğinizi seçmek için "Ana Bilgisayar" ve "Giriş Ardışık Düzeni"ni kullanabilirsiniz. Giriş işlem hattının yürütmeleri, Sıra açılır menüsünü kullanarak seçebileceğiniz azalan düzende yürütme süresine göre sıralanır.
Kritik yol üzerindeki düğümlerin ana hatları kalındır. Kritik yol üzerinde en uzun kendi kendine kalma süresine sahip düğüm olan darboğaz düğümü kırmızı bir çerçeveye sahiptir. Diğer kritik olmayan düğümlerin gri kesikli ana hatları vardır.
Her düğümde Başlangıç Zamanı , yürütmenin başlangıç zamanını gösterir. Aynı düğüm, örneğin girdi boru hattında bir Batch
op varsa, birden çok kez yürütülebilir. Birden çok kez yürütülürse, ilk yürütmenin başlangıç zamanıdır.
Toplam Süre , yürütmenin duvar zamanıdır. Birden çok kez yürütülürse, tüm yürütmelerin duvar sürelerinin toplamıdır.
Self Time , doğrudan alt düğümleriyle çakışan zamanın olmadığı Toplam Süredir.
"# Çağrılar", giriş işlem hattının yürütülme sayısıdır.
Performans verilerini toplayın
TensorFlow Profiler, TensorFlow modelinizin ana bilgisayar etkinliklerini ve GPU izlerini toplar. Profiler'ı programatik mod veya örnekleme modu aracılığıyla performans verilerini toplayacak şekilde yapılandırabilirsiniz.
Profil oluşturma API'leri
Profil oluşturma işlemini gerçekleştirmek için aşağıdaki API'leri kullanabilirsiniz.
TensorBoard Keras Geri Çağırma (
tf.keras.callbacks.TensorBoard
) kullanılarak programlı mod# Profile from batches 10 to 15 tb_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, profile_batch='10, 15') # Train the model and use the TensorBoard Keras callback to collect # performance profiling data model.fit(train_data, steps_per_epoch=20, epochs=5, callbacks=[tb_callback])
tf.profiler
İşlev API'sini kullanan programlı modtf.profiler.experimental.start('logdir') # Train the model here tf.profiler.experimental.stop()
Bağlam yöneticisini kullanan programlı mod
with tf.profiler.experimental.Profile('logdir'): # Train the model here pass
Örnekleme modu: TensorFlow model çalıştırmanızla bir gRPC sunucusu başlatmak için
tf.profiler.experimental.server.start
kullanarak isteğe bağlı profil oluşturma gerçekleştirin. gRPC sunucusunu başlattıktan ve modelinizi çalıştırdıktan sonra, TensorBoard profil eklentisindeki Profil Yakala düğmesi aracılığıyla bir profil yakalayabilirsiniz. Zaten çalışmıyorsa, bir TensorBoard örneğini başlatmak için yukarıdaki Profil oluşturucuyu yükle bölümündeki komut dosyasını kullanın.Örnek olarak,
# Start a profiler server before your model runs. tf.profiler.experimental.server.start(6009) # (Model code goes here). # Send a request to the profiler server to collect a trace of your model. tf.profiler.experimental.client.trace('grpc://localhost:6009', 'gs://your_tb_logdir', 2000)
Birden çok çalışanın profilini çıkarmak için bir örnek:
# E.g. your worker IP addresses are 10.0.0.2, 10.0.0.3, 10.0.0.4, and you # would like to profile for a duration of 2 seconds. tf.profiler.experimental.client.trace( 'grpc://10.0.0.2:8466,grpc://10.0.0.3:8466,grpc://10.0.0.4:8466', 'gs://your_tb_logdir', 2000)
Aşağıdakileri belirtmek için Profil Yakala iletişim kutusunu kullanın:
- Profil hizmeti URL'lerinin veya TPU adlarının virgülle ayrılmış listesi.
- Bir profil oluşturma süresi.
- Cihaz, ana bilgisayar ve Python işlev çağrısı izleme düzeyi.
- İlk başta başarısız olursa Profil Oluşturucunun profilleri yakalamayı kaç kez yeniden denemesini istersiniz.
Özel eğitim döngülerinin profilini çıkarma
TensorFlow kodunuzdaki özel eğitim döngülerinin profilini çıkarmak için, Profil Oluşturucu için adım sınırlarını işaretlemek üzere eğitim döngüsünü tf.profiler.experimental.Trace
API ile donatın.
name
argümanı adım isimleri için bir önek olarak kullanılır, step_num
anahtar kelimesi argümanı adım isimlerine eklenir ve _r
anahtar kelime argümanı bu trace olayının Profiler tarafından bir adım olayı olarak işlenmesini sağlar.
Örnek olarak,
for step in range(NUM_STEPS):
with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
train_data = next(dataset)
train_step(train_data)
Bu, Profiler'ın adım tabanlı performans analizini etkinleştirecek ve adım olaylarının iz görüntüleyicide görünmesine neden olacaktır.
Giriş işlem hattının doğru analizi için veri kümesi yineleyicisini tf.profiler.experimental.Trace
bağlamına eklediğinizden emin olun.
Aşağıdaki kod parçacığı bir anti-kalıptır:
for step, train_data in enumerate(dataset):
with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
train_step(train_data)
Profil oluşturma kullanım durumları
Profil oluşturucu, dört farklı eksen boyunca bir dizi kullanım durumunu kapsar. Bazı kombinasyonlar şu anda desteklenmektedir ve diğerleri gelecekte eklenecektir. Kullanım durumlarından bazıları şunlardır:
- Yerel ve uzak profil oluşturma : Bunlar, profil oluşturma ortamınızı kurmanın iki yaygın yoludur. Yerel profil oluşturmada, profil oluşturma API'si, modelinizin yürüttüğü aynı makinede, örneğin GPU'lara sahip yerel bir iş istasyonunda çağrılır. Uzaktan profil oluşturmada, profil oluşturma API'si, modelinizin yürütüldüğü yerden farklı bir makinede, örneğin bir Cloud TPU'da çağrılır.
- Birden çok çalışanın profilini çıkarma : TensorFlow'un dağıtılmış eğitim özelliklerini kullanırken birden çok makinenin profilini oluşturabilirsiniz.
- Donanım platformu : Profil CPU'ları, GPU'lar ve TPU'lar.
Aşağıdaki tablo, yukarıda bahsedilen TensorFlow destekli kullanım örneklerine hızlı bir genel bakış sağlar:
Profil Oluşturma API'sı | Yerel | Uzak | Birden çok işçi | Donanım Platformları |
---|---|---|---|---|
TensorBoard Keras Geri Arama | Desteklenen | Desteklenmiyor | Desteklenmiyor | CPU, GPU |
tf.profiler.experimental başlatma/durdurma API'si | Desteklenen | Desteklenmiyor | Desteklenmiyor | CPU, GPU |
tf.profiler.experimental client.trace API | Desteklenen | Desteklenen | Desteklenen | CPU, GPU, TPU |
Bağlam yöneticisi API'si | Desteklenen | Desteklenmiyor | Desteklenmiyor | CPU, GPU |
Optimum model performansı için en iyi uygulamalar
Optimum performans elde etmek için aşağıdaki önerileri TensorFlow modellerinize uygun olarak kullanın.
Genel olarak, cihaz üzerinde tüm dönüşümleri gerçekleştirin ve platformunuz için cuDNN ve Intel MKL gibi kitaplıkların en son uyumlu sürümlerini kullandığınızdan emin olun.
Giriş verileri ardışık düzenini optimize edin
Veri girişi ardışık düzeninizi optimize etmek için [#input_pipeline_analyzer] içindeki verileri kullanın. Verimli bir veri girişi ardışık düzeni, aygıt boşta kalma süresini azaltarak model yürütme hızınızı önemli ölçüde artırabilir. Veri girişi ardışık düzeninizi daha verimli hale getirmek için Daha iyi performans bölümünde ayrıntılı olarak açıklanan en iyi uygulamaları tf.data API kılavuzuyla ve aşağıdakilerle birleştirmeye çalışın.
Genel olarak, sırayla yürütülmesi gerekmeyen herhangi bir işlemi paralel hale getirmek, veri girişi ardışık düzenini önemli ölçüde optimize edebilir.
Çoğu durumda, bazı çağrıların sırasını değiştirmek veya argümanları modeliniz için en iyi şekilde çalışacak şekilde ayarlamak yardımcı olur. Giriş verileri ardışık düzenini optimize ederken, optimizasyonların etkisini bağımsız olarak ölçmek için eğitim ve geri yayılım adımları olmadan yalnızca veri yükleyiciyi kıyaslayın.
Giriş işlem hattının bir performans darboğazı olup olmadığını kontrol etmek için modelinizi sentetik verilerle çalıştırmayı deneyin.
Çoklu GPU eğitimi için
tf.data.Dataset.shard
kullanın. Verimdeki azalmaları önlemek için giriş döngüsünde çok erken parçaladığınızdan emin olun. TFRecords ile çalışırken, TFRecords'un içeriğini değil, TFRecords listesini parçaladığınızdan emin olun.num_parallel_calls
kullanaraktf.data.AUTOTUNE
değerini dinamik olarak ayarlayarak birkaç işlemi paralel hale getirin.Saf TensorFlow operasyonlarına kıyasla daha yavaş olduğu için
tf.data.Dataset.from_generator
kullanımını sınırlamayı düşünün.Serileştirilemediğinden ve dağıtılmış TensorFlow'da çalışması desteklenmediğinden
tf.py_function
kullanımını sınırlamayı düşünün.Giriş işlem hattına yönelik statik iyileştirmeleri kontrol etmek için
tf.data.Options
kullanın.
Giriş hattınızı optimize etme konusunda daha fazla rehberlik için tf.data
performans analizi kılavuzunu da okuyun.
Veri artırmayı optimize edin
Görüntü verileriyle çalışırken, çevirme, kırpma, döndürme vb. gibi uzamsal dönüşümler uyguladıktan sonra farklı veri türlerine yayın yaparak veri büyütmenizi daha verimli hale getirin.
NVIDIA® DALI kullanın
GPU/CPU oranı yüksek bir sisteminiz olduğu gibi bazı durumlarda, yukarıdaki optimizasyonların tümü, CPU döngülerinin sınırlamalarından kaynaklanan veri yükleyicideki darboğazları ortadan kaldırmak için yeterli olmayabilir.
Bilgisayarla görme ve sesli derin öğrenme uygulamaları için NVIDIA® GPU'ları kullanıyorsanız, veri hattını hızlandırmak için Veri Yükleme Kitaplığı'nı ( DALI ) kullanmayı düşünün.
Desteklenen DALI operasyonlarının listesi için NVIDIA® DALI: İşlem belgelerine bakın.
İş parçacığı ve paralel yürütme kullanın
İşlemleri daha hızlı yürütmek için tf.config.threading
API ile birden çok CPU iş parçacığında çalıştırın.
TensorFlow, varsayılan olarak paralellik iş parçacığı sayısını otomatik olarak ayarlar. TensorFlow işlemlerini çalıştırmak için kullanılabilen iş parçacığı havuzu, mevcut CPU iş parçacığı sayısına bağlıdır.
tf.config.threading.set_intra_op_parallelism_threads
kullanarak tek bir operasyon için maksimum paralel hızlanmayı kontrol edin. Birden fazla işlemi paralel olarak çalıştırırsanız, hepsinin mevcut iş parçacığı havuzunu paylaşacağını unutmayın.
Engellemeyen bağımsız operasyonlarınız varsa (grafikte aralarında yönlendirilmiş yol olmayan operasyonlar), mevcut iş parçacığı havuzunu kullanarak eşzamanlı olarak çalıştırmak için tf.config.threading.set_inter_op_parallelism_threads
kullanın.
Çeşitli
NVIDIA® GPU'larda daha küçük modellerle çalışırken, model performansında önemli bir artış sağlamak için tüm CPU tensörlerini CUDA sabitlenmiş bellekle ayrılmaya zorlamak için tf.compat.v1.ConfigProto.force_gpu_compatible=True
ayarını yapabilirsiniz. Ancak, ana bilgisayar (CPU) performansını olumsuz etkileyebileceğinden, bu seçeneği bilinmeyen/çok büyük modeller için kullanırken dikkatli olun.
Cihaz performansını iyileştirin
Cihazdaki TensorFlow model performansını optimize etmek için burada ve GPU performans optimizasyon kılavuzunda ayrıntıları verilen en iyi uygulamaları izleyin.
NVIDIA GPU'ları kullanıyorsanız, aşağıdakileri çalıştırarak GPU ve bellek kullanımını bir CSV dosyasına kaydedin:
nvidia-smi
--query-gpu=utilization.gpu,utilization.memory,memory.total,
memory.free,memory.used --format=csv
Veri düzenini yapılandır
Kanal bilgilerini (görüntüler gibi) içeren verilerle çalışırken, en son kanalları tercih etmek için veri düzeni biçimini optimize edin (NCHW yerine NHWC).
Son kanal veri formatları, Tensör Çekirdeği kullanımını iyileştirir ve özellikle AMP ile birleştiğinde evrişimli modellerde önemli performans iyileştirmeleri sağlar. NCHW veri düzenleri hala Tensör Çekirdekleri tarafından çalıştırılabilir, ancak otomatik transpoze işlemleri nedeniyle ek yük getirir.
tf.keras.layers.Conv2D
, tf.keras.layers.Conv3D
ve tf.keras.layers.RandomRotation
gibi katmanlar için data_format="channels_last"
ayarını yaparak veri düzenini NHWC düzenlerini tercih edecek şekilde optimize edebilirsiniz.
Keras arka uç API'si için varsayılan veri düzeni biçimini ayarlamak için tf.keras.backend.set_image_data_format
kullanın.
L2 önbelleğini maksimuma çıkarın
When working with NVIDIA® GPUs, execute the code snippet below before the training loop to max out the L2 fetch granularity to 128 bytes.
import ctypes
_libcudart = ctypes.CDLL('libcudart.so')
# Set device limit on the current device
# cudaLimitMaxL2FetchGranularity = 0x05
pValue = ctypes.cast((ctypes.c_int*1)(), ctypes.POINTER(ctypes.c_int))
_libcudart.cudaDeviceSetLimit(ctypes.c_int(0x05), ctypes.c_int(128))
_libcudart.cudaDeviceGetLimit(pValue, ctypes.c_int(0x05))
assert pValue.contents.value == 128
Configure GPU thread usage
The GPU thread mode decides how GPU threads are used.
Set the thread mode to gpu_private
to make sure that preprocessing does not steal all the GPU threads. This will reduce the kernel launch delay during training. You can also set the number of threads per GPU. Set these values using environment variables.
import os
os.environ['TF_GPU_THREAD_MODE']='gpu_private'
os.environ['TF_GPU_THREAD_COUNT']='1'
Configure GPU memory options
In general, increase the batch size and scale the model to better utilize GPUs and get higher throughput. Note that increasing the batch size will change the model's accuracy so the model needs to be scaled by tuning hyperparameters like the learning rate to meet the target accuracy.
Also, use tf.config.experimental.set_memory_growth
to allow GPU memory to grow to prevent all the available memory from being fully allocated to ops that require only a fraction of the memory. This allows other processes which consume GPU memory to run on the same device.
To learn more, check out the Limiting GPU memory growth guidance in the GPU guide to learn more.
Miscellaneous
Increase the training mini-batch size (number of training samples used per device in one iteration of the training loop) to the maximum amount that fits without an out of memory (OOM) error on the GPU. Increasing the batch size impacts the model's accuracy—so make sure you scale the model by tuning hyperparameters to meet the target accuracy.
Disable reporting OOM errors during tensor allocation in production code. Set
report_tensor_allocations_upon_oom=False
intf.compat.v1.RunOptions
.For models with convolution layers, remove bias addition if using batch normalization. Batch normalization shifts values by their mean and this removes the need to have a constant bias term.
Use TF Stats to find out how efficiently on-device ops run.
Use
tf.function
to perform computations and optionally, enable thejit_compile=True
flag (tf.function(jit_compile=True
). To learn more, go to Use XLA tf.function .Minimize host Python operations between steps and reduce callbacks. Calculate metrics every few steps instead of at every step.
Keep the device compute units busy.
Send data to multiple devices in parallel.
Consider using 16-bit numerical representations , such as
fp16
—the half-precision floating point format specified by IEEE—or the Brain floating-point bfloat16 format.
Additional resources
- The TensorFlow Profiler: Profile model performance tutorial with Keras and TensorBoard where you can apply the advice in this guide.
- The Performance profiling in TensorFlow 2 talk from the TensorFlow Dev Summit 2020.
- The TensorFlow Profiler demo from the TensorFlow Dev Summit 2020.
Known limitations
Profiling multiple GPUs on TensorFlow 2.2 and TensorFlow 2.3
TensorFlow 2.2 and 2.3 support multiple GPU profiling for single host systems only; multiple GPU profiling for multi-host systems is not supported. To profile multi-worker GPU configurations, each worker has to be profiled independently. From TensorFlow 2.4 multiple workers can be profiled using the tf.profiler.experimental.client.trace
API.
CUDA® Toolkit 10.2 or later is required to profile multiple GPUs. As TensorFlow 2.2 and 2.3 support CUDA® Toolkit versions only up to 10.1, you need to create symbolic links to libcudart.so.10.1
and libcupti.so.10.1
:
sudo ln -s /usr/local/cuda/lib64/libcudart.so.10.2 /usr/local/cuda/lib64/libcudart.so.10.1
sudo ln -s /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.2 /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.1