PyTorch İç Yapısı (2019)
(blog.ezyang.com)- 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,int64vb.) - 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:
- 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
- dtype tabanlı dispatch
floatveintgibi veri türlerine göre farklı çekirdekler çağrılır
- Aygıt türü ve layout tabanlı dispatch
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
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:- Python'dan C++ koduna argüman dönüşümü
- VariableType içinde dispatch gerçekleştirilmesi
- Device/layout tabanlı dispatch yapılması
- Son çekirdeğin çalıştırılması
Çekirdek yazma süreci ve araçlar
- PyTorch'ta çekirdekler şu adımlarla yazılır:
- İşlem meta verisinin yazılması: fonksiyon imzası, desteklenen aygıtlar ve veri türlerinin tanımlanması
- Girdi doğrulama: boyut, tür vb. girdilerin doğrulanması
- Çıktı tensörünün tahsis edilmesi
- dtype dispatch: veri türüne göre çekirdeğin çalıştırılması
- Paralel işleme: CPU'da OpenMP, CUDA'da yerleşik paralelleştirme kullanılması
- 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.