2 puan yazan GN⁺ 2025-03-23 | Henüz yorum yok. | WhatsApp'ta paylaş
  • PyTorch'un iç yapısını açıklayan, PyTorch'un C++ kod tabanına katkıda bulunmak isteyenler için hazırlanmış bir rehber
  • Bu yazının amacı, PyTorch'un tensör kütüphanesi yapısını ve otomatik türev alma (autograd) tekniğini anlamaya ve kod tabanında yolunu bulmaya yardımcı olmaktır

PyTorch tensörlerinin temel yapısı

  • PyTorch'ta tensör en temel veri yapısıdır
  • Tensör, float ve int gibi skaler değerleri saklayabilen n boyutlu bir veri yapısıdır
  • Tensör şu meta verileri içerir:
    • Boyut (size): tensörün boyut bilgisi
    • dtype: saklanan veri türü (float32, int64 vb.)
    • device: verinin saklandığı konum (CPU, CUDA vb.)
    • stride: verinin fiziksel bellekteki ofset bilgisi
  • Stride'ın rolü

    • stride, mantıksal indeksi fiziksel bellek konumuna dönüştürmek için kullanılır
    • stride, her boyut için ofset belirler ve fiziksel bellek konumunu saptamak için indekse stride değeriyle çarpım uygular
    • stride sayesinde yeni bir tensör oluşturmadan aynı veriyi view biçiminde farklı şekilde görmek mümkündür

Tensör ve Storage kavramı

  • PyTorch'ta tensör gerçek veriyi doğrudan tutmaz → veriyi Storage yönetir
  • Tensor = boyut + dtype + device + stride + offset bilgisi
  • Birden fazla tensör tek bir Storage'ı paylaşabilir → View kavramını destekler
  • Storage ile tensörün ayrılması sayesinde bellek verimli kullanılabilir

Tensör işlemlerinin dispatch süreci

  • PyTorch'ta işlemler iki aşamalı dispatch sürecinden geçer:
    1. Aygıt türü ve layout tabanlı dispatch
      • CPU tensörü ile CUDA tensörüne göre farklı uygulama kodları çalıştırılır
    2. dtype tabanlı dispatch
      • float ve int gibi veri türlerine göre farklı çekirdekler çağrılır
      Reklam

PyTorch tensör genişletme modeli

  • Tensörün üç ana genişletme öğesi:

    • Device: CPU, GPU, TPU vb. üzerinde bellek tahsis yöntemini tanımlar
    • Layout: tensörün bellekte nasıl saklandığını tanımlar (ör. ardışık saklama, seyrek (sparse) saklama vb.)
    • dtype: tensörün her öğesinde saklanacak veri türünü tanımlar
  • Genişletme seçenekleri:

    • PyTorch kodunu doğrudan değiştirerek tensör genişletilebilir
    • Mevcut tensörü saran bir wrapper class yazılabilir
    • Otomatik türev alma sırasında wrapper gerekiyorsa doğrudan genişletme gerekir
    Reklam

Otomatik türev alma (Autograd) nasıl çalışır

  • PyTorch, geri yayılım (reverse-mode differentiation) tabanlı otomatik türev alma yapar
  • İleri geçiş (forward) işlemi sırasında grafik oluşturulur → geri yayılım sırasında grafik taranarak türev alınır
  • Autograd şu ek bilgileri yönetir:
    • AutogradMeta: tensöre bağlı, geri yayılımda kullanılan meta veri
    • İşlem sonuçlarını kaydeder ve geri yayılım sırasında türev hesaplar

PyTorch kod yapısı ve dosya konumları

  • PyTorch kod tabanındaki başlıca dizinler:
    • torch/ → Python modülleri (Python kodu)
    • torch/csrc/ → Python ve C++ bağlama kodu, otomatik türev alma motoru, JIT derleyicisi vb.
    • aten/ → tensör işlemi tanımları (çekirdek işlemlerin çoğunu içerir)
    • c10/ → tensör ve Storage gibi çekirdek veri yapılarının tanımı

PyTorch'ta işlem yürütme süreci

  • Örnek: torch.add() çağrıldığında yürütme süreci:
    1. Python'dan C++ koduna argüman dönüşümü
    2. VariableType içinde dispatch gerçekleştirilmesi
    3. Device/layout tabanlı dispatch yapılması
    4. Son çekirdeğin çalıştırılması
Reklam

Çekirdek yazma süreci ve araçlar

  • PyTorch'ta çekirdekler şu adımlarla yazılır:
    1. İşlem meta verisinin yazılması: fonksiyon imzası, desteklenen aygıtlar ve veri türlerinin tanımlanması
    2. Girdi doğrulama: boyut, tür vb. girdilerin doğrulanması
    3. Çıktı tensörünün tahsis edilmesi
    4. dtype dispatch: veri türüne göre çekirdeğin çalıştırılması
    5. Paralel işleme: CPU'da OpenMP, CUDA'da yerleşik paralelleştirme kullanılması
    6. Veri erişimi ve hesaplama: TensorAccessor, TensorIterator vb. kullanılması

Başlıca dispatch makroları

  • AT_DISPATCH_ALL_TYPES → dtype'a göre dispatch yapar
  • Çeşitli veri türleri için makro desteği vardır → performans optimizasyonu mümkündür

Performans optimizasyonu ve çalışma verimini artırma ipuçları

  • Header dosyalarını mümkün olduğunca az değiştirin → değişiklik tüm kodun yeniden derlenmesine yol açar
  • Yerel geliştirme ortamı kurun → CI kullanırken zaman kaybını azaltır
  • ccache kullanın → yeniden derleme süresinden tasarruf edilebilir
  • Güçlü bir sunucu kullanın → C++ derleme ve CUDA build süreçlerinde süreyi kısaltabilir

PyTorch katkı rehberi

  • Başlamak için uygun katkı alanları:
    • triaged etiketi bulunan issue'lar → PyTorch geliştiricileri tarafından incelenmiş issue'lar
    • dokümantasyon iyileştirmeleri ve bug yeniden üretimine yardım
    • PyTorch RFC'lerine (özellik önerileri) görüş bildirme
  • PyTorch, açık kaynak katkıcıları sayesinde büyüdü ve topluluk katılımını memnuniyetle karşılıyor

Henüz yorum yok.

Henüz yorum yok.