PyTorch'u öğrenmek nispeten basittir, ancak PyTorch'un iç mekanizmasını öğrenebilir misiniz? Son zamanlarda, 14 yıllık makine öğrenimi deneyimine sahip büyük bir tanrı olan Christian, PyTorch'un temel mekanizmasını tanıttı. Bu bilgi gerçek kullanımda gerekli olmasa da, PyTorch çekirdeğini keşfetmek, sezgilerimizi ve kod anlayışımızı büyük ölçüde geliştirebilir. Alt katman uygulaması büyük bir tanrıdır ~
PyTorch'un kurucuları, Pytorch'un felsefesinin en öncelikli olanı çözmek, yani hesaplama grafiklerimızı anında oluşturmak ve çalıştırmak olduğunu belirtti. Bu, onu tanımlarken Jupyter Notebook'da çalıştırılabilen Python'un programlama felsefesine uymaktadır.Bu nedenle, PyTorch'un iş akışı Python'un bilimsel hesaplama kütüphanesi NumPy'ye çok yakındır.
Christian, PyTorch'un "gen" - dahili çalışma mekanizması nedeniyle çok kullanışlı olduğunu belirtti. Bu rapor, PyTorch temel modüllerinin nasıl kullanılacağını veya PyTorch ile bir sinir ağının nasıl eğitileceğini tanıtmaz.Christian, PyTorch'un çekirdek mekanizmasının sezgisel bir biçimde nasıl tanıtılacağına, yani her modülün nasıl çalıştığına odaklanır.
Christian, Reddit'e yaptığı açıklamada, raporun bu kez konuşma videosunu kayıt sorunu nedeniyle yükleyemediğini, bu nedenle şimdilik yalnızca PPT konuşmasını paylaşabileceğini söyledi. Bununla birlikte, Christian yakın zamanda bu konuyla ilgili başka bir konuşma yapacak, böylece bir dahaki sefere PyTorch'u tanıtan bir videoyu dört gözle bekleyebiliriz.
Konuşma PPT adresi: https://speakerdeck.com/perone/pytorch-under-the-hood
Baidu bulut adresi: https://pan.baidu.com/s/1aaE0I1geF7VwEnQRwmzBtA
Aşağıdakiler, esas olarak tensör ve JIT derleyicisinin altında yatan işletim mekanizmasını tanıtan bu dersin ana gündemidir:
PyTorch'un çeşitli bileşen mekanizmalarını tartışmadan önce, genel iş akışını anlamamız gerekir. PyTorch, zorunlu / istekli adı verilen bir paradigma kullanır, yani her kod satırı, tam hesaplama grafiğinin bir bölümünü tanımlamak için bir grafiğin oluşturulmasını gerektirir. Tam hesaplama grafiği oluşturulmamış olsa bile, bu küçük hesaplama grafiklerini bağımsız olarak bileşenler olarak çalıştırabiliriz.Bu dinamik hesaplama grafiğine "çalıştırma tanımla" yöntemi denir.
Aslında, yeni başlayanlar tüm süreci anladıklarında bunu kullanmayı öğrenebilirler, ancak temeldeki mekanizma kodu anlamaya ve kontrol etmeye yardımcı olur.
Tensör
Kavramsal olarak bir tensör, vektörlerin ve matrislerin bir genellemesidir.PyTorch'daki bir tensör, aynı veri türünden elemanlar içeren çok boyutlu bir matristir. PyTorch'un arayüzü Python olmasına rağmen, alt katman esas olarak C ++ 'da uygulanmaktadır ve Python'da, entegre C ++ kodu genellikle "uzantı" olarak adlandırılır.
Çünkü tensörler çoğunlukla veri taşır ve hesaplamalar yapar. PyTorch'un tensör hesaplaması, en düşük ve temel tensör işlem kitaplığı ATen'i kullanır ve otomatik farklılaştırması, yine ATen çerçevesi üzerine inşa edilen Autograd'ı kullanır.
Python nesnesi
C / C ++ 'da yeni bir Python nesne türü tanımlamak için THPVariable benzer yapıyı aşağıdaki gibi tanımlamanız gerekir. İlk PyObject_HEAD makrosu, Python nesnelerini standartlaştırmayı ve bir tür nesnesine işaretçi ve ref sayısı olan bir alan içeren başka bir yapıya genişlemeyi amaçlamaktadır.
Python API'sinde Py_INCREF ve Py_DECREF adı verilen ve Python nesnelerinin referans sayısını artırmak ve azaltmak için kullanılabilen iki ek makro vardır.
PyThon'da değişkenler, veri yapıları ve işlevler gibi her şey bir nesnedir.
SIFIR KOPYALAMA tensörü
Numpy dizilerinin kullanımı çok yaygın olduğundan, Numpy ve PyTorch tensörleri arasında dönüştürme yapmamız gerekir. Bu nedenle PyTorch, NumPy dizileri ve PyTorch tensörleri arasında dönüştürmek için_numpy ve numpy olmak üzere iki yöntem sağlar.
Tensör depolamanın maliyeti nispeten yüksek olduğundan, yukarıdaki dönüştürme işlemi sırasında verileri kopyalarsak, bellek kullanımı çok büyük olacaktır. PyTorch tensörünün bir avantajı, doğrudan kopyalamak yerine dahili NumPy dizisine bir gösterici tutmasıdır. Bu, PyTorch'un bu verilere sahip olacağı ve NumPy dizi nesnesiyle aynı bellek alanını paylaşacağı anlamına gelir.
Sıfır Kopyalama biçimi gerçekten çok fazla bellek tasarrufu sağlayabilir, ancak yerinde ve yukarıda gösterildiği gibi standart işlemler arasındaki fark biraz belirsiz olacaktır. Np_array = np_array +1.0 kullanırsanız, torch_array belleği değişmez, ancak np_array + = 1.0 kullanırsanız, torch_array'in belleği değişecektir.
CPU / GPU bellek ayırma
Tensörün gerçek ham verileri hemen tensör yapısında değil, tensör yapısının bir parçası olan "Depolama" dediğimiz yerde depolanır. Genel olarak, tensör depolaması, Allocator aracılığıyla bilgisayar belleğinde (CPU) veya video belleğinde (GPU) depolanabilir.
BÜYÜK RESİM
Son olarak PyTorch, THTensor yapısının aşağıdaki şekilde gösterilebileceğini iddia ediyor. THTensor'un ana yapısı, boyut / adımlar / boyutlar / ofsetler / gibi bilgileri tutan ve ayrıca THStorage'ı depolayan tensör verileridir.
JIT
PyTorch anında çalışma modunda olduğu için, hata ayıklamanın veya kodu kontrol etmenin vb. Kolay olduğunu gösterir. PyTorch 1.0'da, bir dizi derleme aracı olan torch.jit'i ilk kez tanıttı ve asıl amacı araştırma ile ürün dağıtımı arasındaki boşluğu kapatmaktır. JIT, Python'un bir alt dili olan Torch Script adlı bir dil içerir. Torch Script kullanan kod, çok büyük optimizasyonlara ulaşabilir ve sonraki C ++ API'lerinde kullanılmak üzere serileştirilebilir.
Aşağıdaki, çalıştırmak için Python kullanan yaygın bir Eager modudur ve ayrıca Komut Dosyası modunu da çalıştırabilirsiniz. İstekli mod, blok prototipler ve deneyler için uygundur ve Komut Dosyası modu, optimizasyon ve dağıtım için uygundur.
Öyleyse neden TORCHSCRIPT kullanıyorsunuz? Christian şu nedenleri verdi:
PyTorch JIT ana süreci
Aşağıda gösterildiği gibi, JIT esas olarak kodu veya Python'un soyut sözdizimi ağacını (AST) girecektir, burada AST, Python kaynak kodunun sözdizimi yapısını temsil etmek için ağaç yapısını kullanacaktır. Ayrıştırma, sözdizimsel yapıyı ve hesaplama grafiğini ayrıştırıyor olabilir, ardından dilbilgisi incelemesini kod optimizasyon süreci izler ve son olarak yalnızca derlenmesi ve yürütülmesi gerekir.
Optimizasyon, açma döngüleri gibi model hesaplama grafikleri için kullanılabilir. Aşağıda gösterilen Peephole optimizasyonunda, derleyici, performansı artırmak için CPU komutlarının özelliklerini ve bazı dönüştürme kurallarını birleştirerek yalnızca bir veya daha fazla temel blokta üretilen koda odaklanır. Gözetleme deliği optimizasyonu, genel analiz ve talimat dönüştürme yoluyla kod performansını da artırabilir.
Aşağıda gösterilen matrisin iki cihazı, optimize edilmesi gereken matrisin kendisine eşittir.
gerçekleştirillen
Python yorumlayıcısının kodu yürütebildiği gibi, PyTorch'un JIT işlemi sırasında ara temsil talimatlarını yürütmek için bir yorumlayıcısı da vardır:
Son olarak, Christian ayrıca birçok dahili işletim mekanizması tanıttı, ancak bunlar zor oldukları ve şimdilik hiçbir video açıklaması sağlanmadığı için okuyucular belirli PPT içeriğine bakabilirler.