Bir iz açmadan önce bir soru seçme
Bir iz, belirli bir soruya daha iyi yanıt verir: hesaplama verileri mi bekliyor, bir kopya mı yineleniyor yoksa küçük bir operatör çok sık mı çağrılıyor? Girdiyi, çıktıyı ve adımınızın sınırlarını tanımlayın. Eğitim için adımın backward, optimize edici güncellemesi ve batch okumasını içerip içermediğini belirtin. Çıkarım için model yüklemeyi ve isteği ayırın.
Doğruluğunu bildiğiniz kısa bir senaryo tutun. Şekilleri, batch'i, kesinliği, model modunu, olası derlemeyi ve veri kaynağını not edin. Basitleştirilmiş bir girdi bir davranışı yalıtmaya yardımcı olabilir, ancak artık tam yükü temsil etmeyebilir. Bu farkı kayıtta belirtin.
Nihai birimi sabitleyin: adım başına milisaniye veya saniyede işlenen örnek sayısı. Olay toplamları geçen sürenin yerini tutmaz. Okuma ve aktarım sınırları aynı olan pencereleri karşılaştırın.
CPU zamanını, GPU işini ve beklemeyi ayırt etme
CPU işlemleri hazırlar ve başlatır; GPU bunları daha sonra yürütebilir. Bu nedenle bir Python aralığı başlatma, bekleme veya her ikisini birden içerebilir. PyTorch'un CUDA belgeleri, hassas ölçümlerin bu asenkronluğu hesaba katması gerektiğini, özellikle kapsama uygun senkronizasyon veya olaylar yoluyla belirtir.
Hedefli bir GPU süresi ölçümü için CUDA olayları uygun olabilir. Uçtan uca gecikme için bu gecikmeye dahil olan işin bitmesini bekleyin ve isteğin tamamını ölçün. Bu iki birimi karıştırmayın. Her işlem arasına eklenen bir senkronizasyon, gerçek bir örtüşmeyi ortadan kaldırabilir ve anlamaya çalıştığınız programı dönüştürebilir.
Profilleyicide bir operatörün öz süreleri ile alt işlemleri içeren süreleri de farklı sorulara yanıt verir. Tablo satırlarını toplamadan önce zaman çizelgesine bakın. Eşzamanlı veya iç içe geçmiş etkinlikler, ayrık geçen süre dilimlerini temsil etmez.
Bir başlangıç aşaması ve etkin bir pencere ayırma
İlk geçiş başlatma, yükleme veya derleme içerebilir. Sorunuzun bu başlangıca mı yoksa zaten stabilize olmuş bir aşamaya mı yönelik olduğuna karar verin. Kullanım için önemli olduklarında, başlangıç maliyetini genelmiş gibi sunulan bir ortalamadan silmek yerine her iki gözlemi de saklayın.
schedule işlevi bekleme, toplama hazırlığı ve etkin pencereyi ayırt etmeye olanak tanır. Profilleyicinin ısınması, modelinizin kararlı rejime ulaştığının kanıtı değildir. Karşılaşılan şekilleri ve önbelleklerin durumunu da kontrol edin. Değişken girdili bir uygulama, birkaç iterasyondan sonra yeni yollarla karşılaşabilir.
Aşağıda önerilen öğretici plan bir adımı bekler, bir adımı hazırlar ve iki adımı yakalar. Dört adım mekanizmayı açıklamaya yeter, bir performans dağılımı oluşturmaya yetmez. Gerçek bir kampanyada gerekçelendirilmiş bir pencere seçin ve analizden sonra ölçümü profilleyici dışında yineleyin.
Önerilen örnek: okunabilir sınırlara sahip dört adım
Aşağıdaki fragment çalıştırılmadı. model, optimizer, loss_fn, loader ve device'in var olduğunu, modelin device üzerinde olduğunu ve yükleyicinin en az dört adet x, y çifti batch sağladığını varsayar. Güncellemeler gerçekleştirir: bunun için öngörülmüş deneysel bir durum kullanın, ağırlıklarını korumanız gereken bir oturum değil.
Etiketler CPU okumayı, aktarımı ve eğitimi birbirinden ayırır. Yineleyici pencere oluşturulmadan önce oluşturulur, bu da başlatılmasının bir kısmını kapsam dışında bırakır. Dosya, mevcut bir izin üzerine yazılmasını önlemek için yeni seçilir. Örnek, kullanılamayan GPU toplamayı sessizce CPU izi olarak GPU analizi gibi sunmak yerine reddeder.
step() sinyali her adımdan sonra planlamayı ilerletir. Resmi tarif, yinelemeler ile toplama arasındaki bu bağı açıklar. ROCm yığınında PyTorch aygıtı hâlâ cuda olarak adlandırılır; ancak hızlandırıcı toplamanın kullanılabilirliği derlemeye ve araçlarına bağlıdır. Sonuçta gerçekten mevcut olan etkinlikleri doğrulayın.
from pathlib import Path
import torch
from torch.profiler import (
profile, schedule, record_function,
ProfilerActivity, supported_activities,
)
trace = Path("trace-etape.json")
if trace.exists():
raise FileExistsError("Yeni bir iz adı seçin")
activities = [ProfilerActivity.CPU]
if device.type == "cuda":
if ProfilerActivity.CUDA not in supported_activities():
raise RuntimeError("Bu derlemede GPU toplama kullanılamıyor")
activities.append(ProfilerActivity.CUDA)
iterator = iter(loader)
model.train()
with profile(
activities=activities,
schedule=schedule(wait=1, warmup=1, active=2, repeat=1),
record_shapes=False, profile_memory=False, with_stack=False,
on_trace_ready=lambda p: p.export_chrome_trace(str(trace)),
) as prof:
for _ in range(4):
with record_function("lecture_batch_cpu"):
x, y = next(iterator)
with record_function("transfert"):
x, y = x.to(device), y.to(device)
with record_function("entrainement"):
optimizer.zero_grad(set_to_none=True)
loss = loss_fn(model(x), y)
loss.backward()
optimizer.step()
prof.step()
print(prof.key_averages().table(
sort_by="self_cpu_time_total", row_limit=8,
))Bir gözlemi doğrulanabilir bir hipoteze dönüştürmek
Etkin pencereyle başlayın ve beklenen etiketlerin görünüp görünmediğini kontrol edin. Ardından etkinlikler arasındaki boşlukları, kopyaları ve tekrarları inceleyin. lecture_batch_cpu içindeki uzun bir bekleme giriş hattına işaret eder; depolamayı doğrudan ölçmez. Sık kopyalama, tensörlerin yerleşimini incelemeye davet eder, ancak gereksiz olduklarını kanıtlamaz.
Tek bir hipotez kurun ve ardından kontrollü bir değişiklik önerin. Örneğin, bir sabit her adımda yeniden oluşturuluyor ve aktarılıyorsa, sonucu değiştirmeden yaşam süresinin birkaç adımı kapsayıp kapsayamayacağını kontrol edin. Bir operatör baskın görünüyorsa, bir yenisini aramadan önce şekillerini ve çağrı sayısını inceleyin.
Aşağıdaki satırlar olası okumalardır, çalıştırılmış bir izden çıkarılmış tespitler değildir. Hiçbir süre veya hızlanma bildirilmez. Yararlı sonuç, öne sürülen nedeni doğrulayabilecek veya çürütebilecek bir sonraki deneydir.
Tüm sütunları görmek için tabloyu kaydırın.| Olası gözlem | Hipotez | Sonraki kontrol |
|---|---|---|
| Okuma sırasında etkinlik olmayan GPU | Giriş hattı yetişemiyor | Batch önceden hazırlanmış aynı hesaplama |
| Bir sabitin yinelenen kopyaları | Uygun olmayan yerleşim veya yaşam süresi | Bir kez taşı, çıktıları doğrula |
| Çok sayıda küçük başlatma | Parçalanmış iş | Gruplamayı ve genel maliyeti incele |
| Uzun bir operatör | Belirleyici şekil veya algoritma | Aynı operatörü ve girdilerini karşılaştır |
İnstrumentasyonun maliyetini ve bilgilerini sınırlamak
Kısa ve az seçenekli bir toplamayla başlayın. Şekilleri, yığınları veya belleği yalnızca bir soru gerektiriyorsa etkinleştirin. PyTorch API'si bu bilgilerin ek maliyet yüklediğini belirtir; şekillerin toplanması tensörlere referansları bile tutabilir. Bu nedenle ayrıntılı bir profil, programın sürelerini veya bellek kullanımını değiştirebilir.
Bir iz, operatör adlarını, şekilleri ve seçeneklere bağlı olarak kod yollarını içerebilir. Paylaşmadan önce inceleyin. Bir bölge etiketi, e-posta, token, özel yol veya giriş içeriği barındırmadan adımı tanımlamalıdır. Ortamınıza uygun bir iz görüntüleyici seçin ve toplamayı kendi kontrolünüzde tutun.
Beklenen GPU olayları yoksa, zamanlarını sıfırla doldurmayın. Gözlemlenmediklerini belirtin ve toplama desteğini inceleyin. Araçta bir olayın bulunmaması, hesaplamanın olmadığının kanıtı değildir.
Optimizasyonu profil oluşturucu dışında doğrulama
Aynı ilgili durumdan başlayın ve değişiklikten önceki ve sonraki doğruluğu karşılaştırın. Eğitim için, ek bir adım ağırlıkları değiştirir; art arda başlatılan iki yakalama mutlaka eşdeğer bir karşılaştırma oluşturmaz. Farkı açıklayabilmek için kodu, parametreleri ve başlangıç noktasını koruyun.
Ardından senaryoyu ayrıntılı toplama olmadan, aynı ısınma ve birden çok geçişle ölçün. Kapsamı, ham değerleri ve dağılımlarını raporlayın. Yerel bir iyileştirme tüm döngüde kaybolabilir veya kaliteyi düşürebilir: her ikisi de kararda kalmalıdır.
Son olarak, gerçekte gerekli kaynakları netleştirmek için gözlemleri kullanın. İş istasyonunuzun bir izi Kernodeck tekliflerini sıralamaz ve kiralanan bir sunucunun ana işlemcisini veya ağını kanıtlamaz. GPU karşılaştırması, ilgili kaynaklar üzerinde karşılaştırılabilir bir yük, koşullar ve sonuçlar gerektirir.