Büyük ölçekli model eğitiminde GPU'nun yalnızca %40–50 verimlilikte çalıştığı durumlar son derece yaygındır. Sorunun kaynağı çoğu zaman GPU kodu değil; veri akışı, senkronizasyon gecikmeleri veya verimsiz operasyonlardır. TensorFlow Profiler bu darboğazları milisaniye çözünürlüğüyle görünür kılar.
TF Profiler Nedir ve Neden Önemli?
TensorFlow Profiler, eğitim döngüsündeki her operasyonun ne kadar süre aldığını, CPU-GPU arasındaki veri transferlerini, bellek bant genişliğini ve input pipeline verimini ölçen yerleşik bir performans analiz aracıdır. TensorBoard'a entegre çalışır; ayrı bir kurulum gerektirmez.
Kurulum ve Temel Profil Alma
TF Profiler, TensorFlow 2.x ile birlikte gelir. Callback olarak eğitim döngüsüne eklenmesi yeterlidir:
import tensorflow as tf # Log dizinini tanımlayın log_dir = "logs/profiler" # TensorBoard + Profiler callback tensorboard_cb = tf.keras.callbacks.TensorBoard( log_dir=log_dir, histogram_freq=1, profile_batch="5,10" # 5-10. batch arasını profil et ) model.fit( dataset, epochs=10, callbacks=[tensorboard_cb] ) # TensorBoard'u başlatın: # tensorboard --logdir=logs/profiler
profile_batch parametresinde ilk birkaç batch'i atlayın; başlangıçtaki JIT derleme maliyeti profili kirletir. 5–15. batch arası kararlı bir ölçüm penceresi sağlar.
Input Pipeline Darboğazları
Profil raporunda GPU idle zamanı yüksekse ilk bakılacak yer tf.data pipeline'ıdır. GPU'nun boş beklediği her milisaniye doğrudan verimlilik kaybıdır.
.prefetch(tf.data.AUTOTUNE) ile pipeline stall'larını ortadan kaldırın.num_parallel_calls=tf.data.AUTOTUNE ile çok çekirdekli CPU'larda paralel yürütün..cache() ile disk I/O'yu tamamen ortadan kaldırın. Epoch başına ciddi kazanım sağlar.# ❌ Yavaş pipeline dataset = tf.data.TFRecordDataset(files) dataset = dataset.map(parse_fn) dataset = dataset.batch(32) # ✅ Optimize edilmiş pipeline AUTOTUNE = tf.data.AUTOTUNE dataset = ( tf.data.TFRecordDataset(files, num_parallel_reads=AUTOTUNE) .cache() .shuffle(buffer_size=10000, reshuffle_each_iteration=True) .map(parse_fn, num_parallel_calls=AUTOTUNE) .batch(32, drop_remainder=True) .prefetch(AUTOTUNE) )
Op-Level Profil ve Trace Viewer
TensorBoard'daki Trace Viewer, her operasyonun zaman çizelgesini gösterir. Hangi op'un en uzun sürdüğü, hangi kernel'ın GPU thread'lerini bloke ettiği buradan okunur.
Trace Viewer'da uzun süren op'ların tümü problem değildir. Bir matmul op'u uzun sürüyor ama GPU kullanımı yüksekse bu normaldir. Sorun, aralarındaki boşluklardır.
| Gözlem | Olası Sebep | Çözüm | Etki |
|---|---|---|---|
| GPU idle zamanı yüksek | Input pipeline yavaş | prefetch + paralel map | Yüksek |
| CPU op'ları dominant | @tf.function eksik | Graph mode aktif et | Yüksek |
| Çok fazla kernel çağrısı | Küçük op'ların birikimi | XLA fusion | Orta |
| H2D/D2H transferler | CPU-GPU senkronizasyonu | tf.device yerleşimi | Orta |
| OOM tekrarlayan | Gradient accumulation yok | Batch boyutunu küçült / AMP | Kritik |
XLA Derleyici Optimizasyonları
XLA (Accelerated Linear Algebra), TensorFlow graph'ını analiz edip birden fazla op'u tek bir GPU kernel'ına "fuse" eder. Bu, kernel başlatma maliyetini ve bellek bant genişliği tüketimini önemli ölçüde azaltır.
# Yöntem 1: Tüm modeli JIT derle tf.config.optimizer.set_jit(True) # Yöntem 2: Sadece eğitim adımını derle (önerilen) @tf.function(jit_compile=True) def train_step(x, y): with tf.GradientTape() as tape: logits = model(x, training=True) loss = loss_fn(y, logits) grads = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables)) return loss # İlk çağrı derleme yapar (~30s), sonrakiler hızlıdır
Tipik Transformer veya CNN modellerinde XLA ile %15–40 hız artışı rapor edilmektedir. Kazanım, op sayısı ve model boyutuyla orantılıdır. Küçük modellerde derleme maliyeti kazanımı geçebilir.
Mixed Precision ile Entegrasyon
Profil sonuçları GPU VRAM baskısına işaret ediyorsa FP16/BF16 mixed precision hem bellek kullanımını yarıya indirir hem de Tensor Core'ların etkinliğini artırır.
from tensorflow.keras import mixed_precision # A100/H100 için bfloat16; RTX serisi için float16 policy = mixed_precision.Policy("mixed_bfloat16") mixed_precision.set_global_policy(policy) # Loss scaling (float16 için gerekli, bfloat16 için opsiyonel) optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3) optimizer = mixed_precision.LossScaleOptimizer(optimizer) # Model otomatik olarak yeni policy ile çalışır model = build_model() # Değişiklik gerekmez
Optimizasyon Kontrol Listesi
Profil aldıktan sonra aşağıdaki sırayla ilerleyin; her adımda tekrar profil alarak değişimin etkisini ölçün:
jit_compile=True ekleyin, ilk derleme sonrası hız kazanımını ölçün.Sık Sorulan Sorular
TF Profiler hangi TensorFlow sürümünden itibaren kararlı?
JAX veya PyTorch kullanıyorsam ne yapmalıyım?
jax.profiler ve Perfetto UI kullanılabilir. PyTorch için torch.profiler benzer kavramları uygular. XLA optimizasyonları JAX'ta varsayılan olarak aktiftir; ayrıca etkinleştirmeye gerek yoktur.Profil alırken eğitim yavaşlıyor mu?
XLA tüm modellerde işe yarar mı?
padding ile sabit şekle geçmek ve drop_remainder=True kullanmak derlemeyi stabil kılar.Multi-GPU senaryosunda profil nasıl alınır?
tf.distribute.MirroredStrategy ile kullanımda, her GPU için ayrı trace oluşturulur. TensorBoard'da cihazlar arasındaki senkronizasyon maliyeti (AllReduce) ayrıca görülür ve optimize edilebilir.GPU Sunucunuzda Profil Almak İster misiniz?
YapayZekaServer ve GTM Teknoloji danışmanları, Magnetar ve Supermicro GPU sunucuları için teknik destek sunar.
Profesyonel Danışmanlık Al →