- PyTorch'un çalışma zamanı katmanları, ATen tensörlerini, otomatik gradyan hesaplamayı, bir C++ ön yüzünü, TorchScript'i ve CUDA entegrasyonunu kapsayarak hem Python hem de yerel C++ API'lerini sunar.
- C++ ve CUDA uzantıları, otomatik gradyan hesaplamayı, TorchScript'i ve üst düzey ergonomiyi korurken, CUTLASS gibi özel çekirdekleri ve kütüphaneleri entegre etmenize olanak tanır.
- Hassas kontroller, grafikler, özel bellek ayırıcılar ve bellek ayarlaması gibi gelişmiş CUDA özellikleri, modern GPU'larda modellerin ölçeklendirilmesi için çok önemlidir.
- NVIDIA'nın VibeTensor gibi deneysel projeleri, Python, JavaScript, C++ ve CUDA'da PyTorch'un mimarisini yansıtan yapay zeka tarafından oluşturulan çalışma ortamlarını araştırıyor.
Modern yapay zeka çalışma ortamları, Python, C++, JavaScript ve CUDA destekli GPU'ların kesişme noktasında yer alıyor ve PyTorch, tüm bu dünyaları verimli bir şekilde bir araya getirmenin fiili örneği haline geldi. Görünüşte basit olan Python API'lerinin ardında, gelişmiş bir C++ çekirdeği, otomatik türev alma motoru, JIT derleyici, CUDA entegrasyonu ve hatta yapay zeka tarafından üretilen kodun ne kadar ileri gidebileceğini araştıran NVIDIA'nın VibeTensor'u gibi deneysel çalışma ortamları yer alıyor.
Yüksek performanslı yapay zeka sistemleri geliştiriyorsanız, PyTorch'un C++ çalışma ortamının, CUDA arka ucunun, TorchScript'in, C++ uzantılarının ve bellek yönetiminin nasıl çalıştığını anlamak, "çalışır" ile "ölçeklenir ve uçar" arasındaki farkı yaratır. Bu kılavuzda, bu katmanları adım adım inceleyeceğiz, Python ve JavaScript ortamlarıyla nasıl ilişkili olduklarını açıklayacağız ve bunları CUDA araçları ve yapay zeka destekli çalışma ortamları gibi yeni yaklaşımlarla nasıl ilişkilendireceğimizi ele alacağız.
PyTorch bir çalışma ortamı olarak: Python API'sinden C++ ve CUDA'ya
İlk bakışta PyTorch, tamamen Python tabanlı bir kütüphane gibi görünse de, gerçekte çekirdeği C++ ile yazılmış ve CUDA ile sıkı bir entegrasyona sahip, cuDNN, NCCL, oneDNN ve Intel MKL gibi optimize edilmiş kütüphanelerle çalışan katmanlı bir çalışma ortamıdır. Python çoğunlukla işlemleri düzenlerken, asıl ağır işler CPU ve GPU'daki yerel kod tarafından yapılır.
Genel olarak bakıldığında, PyTorch'u birkaç temel bileşenden oluşmuş olarak düşünebilirsiniz: tensör kütüphanesi, otomatik gradyan motoru, sinir ağı yardımcı programları, JIT derleyicisi (TorchScript), çoklu işlem yardımcıları ve veri yükleme ve serileştirme için bir dizi yardımcı program. Birlikte hem NumPy benzeri bir tensör arayüzü hem de esnek bir derin öğrenme platformu sağlarlar.
Herkese açık C++ API'si kabaca bu mimariyi yansıtır ve ATen, Autograd, C++ Ön Uç, TorchScript bağlamaları ve C++ uzantıları olmak üzere her biri hesaplama yığınının belirli bir katmanını ele alan bölümlere ayrılmıştır. Python'ın ötesine geçmeyi, özel C++ veya CUDA çekirdekleriyle entegre olmayı veya modellerinizi bağlayıcılar aracılığıyla Node.js veya tarayıcı çalışma ortamları gibi ortamlara sunmayı planlıyorsanız, bu bileşenleri anlamak çok önemlidir.
Her şeyin altında, PyTorch, derleyici, GPU hızlandırmalı matematik kütüphaneleri, hata ayıklama ve profil oluşturma araçları ve torch.cuda ve özel uzantılar tarafından kullanılan CUDA çalışma ortamını sağlayan NVIDIA CUDA Toolkit'i kullanır. Bu araç seti, PyTorch'un veri merkezlerinde, iş istasyonlarında ve gömülü sistemlerde modern GPU'lardan tam performans almasını sağlayan temel unsurdur.

ATen: tensör ve operatör omurgası
ATen, PyTorch'ta Python veya C++'tan çağrılsın, neredeyse tüm tensör işlemlerinin temelini oluşturan düşük seviyeli tensör kütüphanesidir. Bu, özü tanımlar. at::Tensor CPU ve GPU için uygulanan yüzlerce matematiksel, indeksleme, doğrusal cebir ve indirgeme işlemine ek olarak, çeşitli veri tipleri de içerir.
Her ATen tensörü, aygıt ve veri türü meta verilerini taşır ve CPU veya CUDA uygulamalarına yönlendirme, bu meta verilere bağlı olarak dinamik olarak gerçekleşir; böylece aynı C++ operatör sembolü farklı arka uçlarda sorunsuz bir şekilde çalışabilir. Bu, verileri şu yolla aktarmanıza olanak tanır: .to("cuda") or .cuda() Python'da, çağırdığınız işlemi değiştirmeden.
ATen, C++ API'si aracılığıyla doğrudan kullanılabilse de (her şey orada yer alıyor), at:: Tipik iş akışlarında ATen'e yalnızca üst düzey modüller aracılığıyla dolaylı olarak dokunursunuz (örneğin, ad alanı). torch, torch.nn veya C++ ön yüzü. Yine de, performans açısından kritik kodlar veya özel çekirdekler için, ATen seviyesinde çalışmak genellikle en fazla kontrol imkanını sağlar.
ATen'in tasarımı, hızlı vektörleştirilmiş çekirdekleri, güçlü GPU hızlandırmasını ve iyi CPU performansını vurgulayarak hem araştırma amaçlı prototipleme hem de üretim düzeyindeki iş yükleri için uygun hale getiriyor. Dahili olarak, iyi optimize edilmiş matematiksel yöntemleri yeniden icat etmek yerine, mantıklı olduğu her yerde tedarikçi kütüphanelerine (MKL, cuBLAS, cuDNN, vb.) dayanmaktadır.
Autograd: tensörler üzerinde otomatik türev alma
Autograd, ATen tensörlerini gradyan izleme ile zenginleştiren ve saf tensör matematiğini türevlenebilir hesaplama grafiklerine dönüştüren alt sistemdir. Otomatik gradyan hesaplama etkinleştirildiğinde, tensörler üzerindeki işlemler, eğitim için gradyanları hesaplamak üzere geriye doğru gezilebilen dahili bir grafik oluşturur.
Otomatik türev alma motoru, ara işlemlerin ileri geçiş sırasında kaydedildiği ve talep üzerine geriye doğru tekrar oynatıldığı, genellikle "bant" veya ters modlu türev alma grafiği olarak adlandırılan bir kavram etrafında inşa edilmiştir. çağrı .backward() Bir yaprak tensör üzerinde gradyan tohumlama yöntemiyle bu grafik geçişi başlatılır ve türevler parametrelere eklenir.
Önemli bir incelik, ham maddenin şu olmasıdır: at::Tensor ATen'den gelen tür varsayılan olarak türevlenebilir değildir, bu nedenle C++'da gradyan duyarlı tensörler için şunu kullanırsınız: torch:: ad alanı fabrika fonksiyonları (örneğin) torch::ones) yerine at:: fabrikalar. İlki, otomatik gradyan sistemine bağlı tensörler oluştururken, ikincisi tamamen sayısal kalır.
Bu ayrım kasıtlıdır: otomatik gradyan hesaplama yükünün olup olmayacağına karar vermenizi sağlar; bu da gradyanların gereksiz olduğu yalnızca çıkarım odaklı veya düşük gecikmeli yollar için çok önemlidir. Aynı ayrım C++ Frontend ve TorchScript grafiklerinde de korunmaktadır.

C++ Ön Uç: Python kullanmadan modeller oluşturma ve eğitme
PyTorch C++ Ön Uç, büyük ölçüde şu işlevleri yansıtan üst düzey bir API'dir: torch.nn, torch.optim, torch.utils.data ve ilgili Python modüllerini içerir, ancak modern C++'ın alışılmış tarzında uygulanmıştır. Bu, yerel performansa, mevcut C++ sistemleriyle daha sıkı entegrasyona veya Python'dan bağımsız bir dağıtım ortamına ihtiyaç duyduğunuz senaryolar için tasarlanmıştır.
C++ Frontend'i kullanarak, modelleri modül hiyerarşileri olarak tanımlarsınız, tıpkı şu mantıkla: torch.nn.ModuleParametreler sınıflar içinde kaydedilir ve daha büyük ağlar halinde bir araya getirilir. Katmanların bir "standart kütüphanesi" vardır: evrişimler, RNN'ler, toplu normalleştirme, doğrusal katmanlar ve Python'daki karşılıklarına neredeyse tamamen benzeyen birçok diğer katman.
Ön uç ayrıca SGD, Adam ve RMSprop gibi klasik algoritmalarla optimizasyon API'si, veri kümesi soyutlamaları ve birçok CPU iş parçacığından veri akışı sağlayabilen veri yükleyicileri ve kontrol noktalarının serileştirilmesi için yardımcı programlar sunmaktadır. Özetle, Python'da bir eğitim döngüsü yazmayı biliyorsanız (ve şu gibi sorunlardan kaçınabiliyorsanız): fazla takmak vs yetersiz takmak), bunu C++ ön yüzüne taşımak çoğunlukla mekanik bir işlemdir.
Çoklu GPU sistemlerinde, C++ Frontend, birden fazla CUDA aygıtı üzerinde otomatik model paralelleştirme için yardımcı fonksiyonlar sunar; bu, aşağıdakine benzer bir tarzdadır: torch.nn.parallel.DataParallel. Ayrıca, hibrit bir iş akışı istediğinizde C++ modellerini pybind11 ile Python'a geri bağlamak için destek kodu da içerir.
TorchScript: JIT derlemesi ve Python gerektirmeyen çalıştırma
TorchScript, Python'ın statik olarak analiz edilebilir bir alt kümesi ve PyTorch API'sinin bir araya getirilmesiyle oluşturulmuş, derlenebilen, optimize edilebilen ve dağıtım için serileştirilebilen bir kütüphanedir. Kavramsal olarak, modellerde yaygın olarak kullanılan tensör işlemleri ve kontrol akışı yapıları etrafında tasarlanmış küçük bir programlama dilidir.
C++ tarafında, TorchScript üç temel yetenek sunar: Python'da oluşturulan serileştirilmiş modelleri yükleme ve çalıştırma, TorchScript standart kütüphanesini genişleten özel operatörler tanımlama ve TorchScript kaynak kodunu doğrudan C++'dan derleme. Tüm bunlara şu yolla erişilebilir: torch::jit ad.
Yaygın bir üretim modeli, modelleri tamamen Python'da yazmak ve eğitmek, bunları TorchScript modülleri olarak dışa aktarmak ve ardından bu modülleri, Python çalışma ortamına bağımlı olmadan düşük gecikmeli çıkarım gerçekleştiren bir C++ servisine yerleştirmektir. Bu, özellikle konteynerleştirilmiş mikro hizmetlerde ve performansa duyarlı arka uçlarda oldukça caziptir.
Gelişmiş kullanıcılar, TorchScript'in yerleşik işlemlermiş gibi çağırabileceği CUDA hızlandırmalı çekirdekler de dahil olmak üzere özel operatörler kaydedebilirler; bu özel işlemler serileştirilebilir ve doğru şekilde kaydedildiklerinde hem Python hem de C++ bağlamlarında çalışırlar. Son olarak, şu gibi işlevler torch::jit::compile C++ dizelerinden veya AST benzeri yapılardan anında TorchScript modülleri oluşturmanıza olanak tanır.
C++ ve CUDA uzantıları: Kendi çekirdeklerinizi entegre etme
PyTorch'un C++ uzantı mekanizması, ATen, autograd ve dispatcher'dan yararlanmaya devam ederken, özel C++ ve CUDA kodunu normal Python iş akışlarına eklemenin basit bir yolunu sunar. Bu uzantıları genellikle özel operatörler uygulamak veya yerleşik operatörler tarafından iyi karşılanmayan özel iş yüklerini hızlandırmak için kullanırsınız.
Uzantı API'sinin kendisi yeni tensör semantiği getirmez; bunun yerine, kodunuzu Python'ın paketleme sistemine (setuptools veya alternatif arka uçlar aracılığıyla) ve PyTorch'un JIT derleme araçlarına bağlayarak çekirdeklerin doğru ABI ve bağlantı bayraklarıyla derlenmesini sağlar. Motor kaputunun altında, yardımcılar şöyle: CUDAExtension nvcc için şablon kod ekleyin, yolları ve bağlantı seçeneklerini dahil edin.
Bağlama tarafında, C++ fonksiyonlarını veya sınıflarını Python sembolleri olarak göstermek için genellikle pybind11 kullanılır ve bu bağlamalar şunlarla etkileşime girer: torch::Tensor Python tensörleriyle aynı depolama alanını paylaşan nesneler. Bu, veri kopyalama işlemlerini minimumda tutar ve geri besleme geçişlerini doğru şekilde uygularsanız otomatik gradyan hesaplamasının yeni operatörleri görmesini sağlar.
Derlendikten sonra, bu uzantılar sıradan Python modülleri gibi davranır, eğitim komut dosyalarından içe aktarılabilir ve hatta JIT kullanımı için işlemleri kaydederseniz TorchScript ile sorunsuz bir şekilde çalışabilirler. CUDA ağırlıklı araştırmalar için, bu yöntem genellikle Python'ın verimliliğini korurken yeni çekirdeklerle deneme yapmanın en hızlı yoludur.
Torch ve CUDA kütüphaneleri arasında köprü kurma: CUTLASS ile bir GEMM örneği
NVIDIA GPU'larının tüm performansından yararlanmanız gerektiğinde, PyTorch'un tensör çalışma ortamını, CUTLASS gibi yüksek performanslı CUDA C++ kütüphaneleri veya yerleşik işlemler olarak bulunmayan özel çekirdeklerle birleştirmek yaygın bir uygulamadır. Klasik bir örnek, optimize edilmiş bir GEMM (matris çarpımı) operatörü yazmaktır.
Genel yöntem, kabul eden bir C++ sarmalayıcı fonksiyonu yazmaktır. torch::Tensor Girdileri alır, şekillerini, veri tiplerini ve veri işaretçilerini çıkarır ve bunları CUTLASS'a veya başka bir CUDA kütüphane fonksiyonuna iletir. Tensör boyutları şu yolla elde edilir: .sizes()veri türleri aracılığıyla .dtype()ve ham işaretçiler aracılığıyla .data_ptr() (isteğe bağlı olarak şunlarla birleştirilebilir) reinterpret_cast Eğer özel türlere ihtiyacınız varsa, örneğin cutlass::half_t).
C++'da şablon parametreleri derleme zamanında çözümlenirken, tensör veri tipleri yalnızca çalışma zamanında bilindiğinden, sarmalayıcı genellikle tensörlerin veri tiplerine bağlı olarak doğru şablon örneğini (float16, float32, vb. için) seçen koşullu dağıtım mantığı içerir. Karmaşık şablon hiyerarşileri için, insanlar genellikle birçok dalı elle yazmaktan kaçınmak amacıyla Python komut dosyaları kullanarak bu hazır kodları oluştururlar.
Giriş doğrulaması çok önemlidir: tensörlerin GEMM ile uyumlu şekillere sahip olması, bir CUDA cihazında bulunması ve bellekte bitişik olması gerekir çünkü CUTLASS, bitişik elemanların sıralı olarak yerleştirilmesini bekler. Bitişiklik durumunu şu şekilde kontrol edebilirsiniz: .is_contiguous() ve bunu kullanarak düzeltin .contiguous()Yerinde anlambilim istendiğinde, gerekirse sonuçları orijinal bir tensöre geri kopyalama işlemi gerçekleştirilir.
PyTorch'un stiline uyum sağlamak için, genellikle çıktı tensörlerini isteğe bağlı hale getirmek için şunu kullanırsınız: c10::optional<torch::Tensor>Ve eğer hiçbiri sağlanmamışsa, doğru olanla yeni bir tane tahsis edersiniz. device hem de dtype ATen fabrika fonksiyonlarını kullanarak. Bu tensörü döndürmek, API'yi yerleşik operatörlerle simetrik tutar. torch.mm.
PyBind11 ve setuptools kullanarak CUDA uzantılarını bağlama ve derleme
C++ sarmalayıcı hazır olduğunda, onu Python'a bağlamanız ve derlemeniz gerekir; işte bu noktada pybind11 ve PyTorch'un derleme yardımcı programları devreye girer. Bir pybind11 modülü tipik olarak şu şekilde bir fonksiyon tanımlar: m.def("cutlass_gemm", &cutlass_gemm, "GEMM with CUTLASS", py::arg("A"), py::arg("B"), py::arg("out") = py::none()); C++ fonksiyonunuzu Python koduna açmak için.
Derleme tarafında, düz setuptools doğal olarak nvcc'yi anlamaz, bu nedenle PyTorch, nvcc adlı bir yardımcı sınıf sunar. CUDAExtension Bu, include yollarını, CUDA derleme bayraklarını ve libtorch'a karşı bağlantıyı otomatik olarak yapılandırır. Sınavı geçtiniz. .cpp hem de .cu kaynaklara CUDAExtension tıpkı standart bir setuptools gibi Extension.
Eklenti yüklendiğinde, Python kodunuz onu normal bir modül olarak içe aktarabilir ve bu noktadan itibaren özel işleminize yapılan bir çağrı, yerleşik PyTorch operatörlerine yapılan bir çağrıya neredeyse tamamen benzer görünür. PyTorch'un kurallarına uyduğunuz sürece autograd, TorchScript ve CUDA akışlarıyla etkileşim kurma yeteneğinizi korursunuz.
Eğer derleme işleminin kendisi için PyTorch'a bağımlı olmak istemiyorsanız (örneğin, CUDA kütüphaneniz birden fazla framework'ü hedefliyorsa), CMake ile scikit-build-core gibi alternatif arka uçları kullanabilir veya setuptools'da nvcc entegrasyonunu elle yapılandırabilirsiniz, ancak CUDAExtension PyTorch kullanıcıları için açık ara en basit yöntemdir.
CUDA Araç Seti: derleyici, kütüphaneler ve çalışma zamanı katmanı
NVIDIA CUDA Toolkit, C/C++ derleyicisi, GPU için optimize edilmiş sayısal kütüphaneler, hata ayıklama ve profil oluşturma araçları ve PyTorch tarafından kullanılan düşük seviyeli çalışma ortamını sağlayarak PyTorch'un GPU çalışma ortamının temelini oluşturur. torch.cuda ve özel eklentiler. Gömülü kartlardan bulut kümelerine kadar geniş bir platform yelpazesini hedefliyor.
PyTorch, ağır doğrusal cebir, evrişim ve FFT işlemlerini CUDA kütüphanelerine devrederek, her GPU mimarisinin özelliklerini bilen ve basit GPU kodunun çok ötesinde performans sağlayabilen, son derece optimize edilmiş uygulamalardan yararlanır. Birçok yapay zeka iş yükü için PyTorch'un yeni nesil GPU'larda bu kadar iyi performans göstermesinin ana nedeni budur.
CUDA uzantıları yazan geliştiriciler genellikle nvcc ile derlenmiş C++ çekirdekleri yazmaya devam ediyor ve bunları PyTorch'a geri bağlamak, paylaşımlı kütüphaneleri çağıran Python, C++ veya hatta JavaScript çalışma ortamlarından yönetilebilmelerini sağlıyor. Bu, eski C++ veya CUDA kod tabanlarına sahip olan ancak bunları PyTorch tarzı API'ler aracılığıyla kullanıma sunmak isteyen ekipler için ideal noktadır.
torch.cuda: cihaz seçimi, hassasiyet modları ve yürütme modeli
MKS torch.cuda Bu modül, PyTorch'tan CUDA'ya kullanıcı arayüzü olarak hizmet eder ve aygıt seçimi, akış yönetimi, bellek tahsisi ve çalışma zamanı yapılandırmasını ele alır. Tüm CUDA tensörleri varsayılan olarak şu anda seçili olan cihaza ayarlanmıştır; bunu aşağıdaki komutla değiştirebilirsiniz. torch.cuda.device Bir bağlam yöneticisi olarak veya belirli cihazları açıkça hedefleyerek.
GPU'lar arası işlemler kasıtlı olarak kısıtlanmıştır: kopyalama benzeri işlemler (örneğin, copy_(), to(), cuda()Çoğu işlem, eşler arası bellek erişimi etkinleştirilmediği sürece cihazlar arasında yayılamaz; bu, ince performans ve doğruluk sorunlarını önlemek içindir. Tensorlar, ait oldukları cihazı takip eder ve çıktılar da girdilerle aynı cihazda kalır.
PyTorch, Ampere ve sonraki GPU'lardaki TensorFloat-32 (TF32) dahil olmak üzere CUDA arka uçlarında hesaplama hassasiyeti üzerinde ayrıntılı kontroller sunar; FP16 ve BF16 GEMM'ler için azaltılmış hassasiyet seçenekleri ve donanım tarafından desteklendiğinde tam FP16 biriktirme seçenekleri de mevcuttur. Bu bayraklar, her bir arka uç (CUDA, cuDNN) ve hatta her bir operatör için ayrı ayrı ayarlanabilir; bu sayede sayısal doğruluktan ödün vererek hızı artırabilirsiniz.
GPU işlemleri varsayılan olarak eşzamansızdır: bir CUDA işlemi çağırdığınızda, bu işlem bir aygıt akışına sıraya alınır ancak daha sonra yürütülebilir; bu da CPU hesaplamaları, aktarımlar ve çekirdeklerin çakışmasına olanak tanır. Bu tür kodların doğru zamanlaması için ya açık bir şekilde belirtilmesi gerekir ya da başka bir yöntem tercih edilmelidir. torch.cuda.synchronize() CUDA olayları veya çağrıları; ortam değişkenleri gibi CUDA_LAUNCH_BLOCKING=1 Hata ayıklama için kullanışlıdırlar ancak performans testleri için uygun değillerdir.
Daha gelişmiş kullanım durumları için PyTorch, CUDA akışlarını ve olaylarını sunarak birden fazla paralel akışı düzenlemenize, seçici olarak senkronize etmenize ve tensörlerin üzerlerindeki tüm bekleyen işler bitmeden serbest bırakılmamasını sağlamanıza olanak tanır. Gibi işlevler record_stream() hem de wait_stream() Bu kalıpların merkezinde yer alırlar.
CUDA bellek yönetimi, ayırıcılar ve ayar düğmeleri
PyTorch, sık yapılan bellek tahsislerini ve serbest bırakmalarını GPU ile sürekli senkronizasyona gerek kalmadan hızlı bir şekilde gerçekleştirmek için CUDA aygıtlarında önbelleğe alma özelliğine sahip bir bellek ayırıcı kullanır (bkz. C++'da bellek nasıl çalışır? (ilgili kavramlar için). aramak yerine cudaMalloc hem de cudaFree Her bir tensör için, tahsisler arasında yeniden kullanılabilen bellek bloklarından oluşan havuzlar tutar.
Sonuç olarak, aşağıdaki gibi araçlar nvidia-smi Tensor'ların gerçekte kullandığı bellekten daha fazla "kullanımda" bellek gösterirler, çünkü bu belleğin bir kısmı bellek ayırıcısı tarafından ayrılmıştır ancak şu anda atanmamıştır. Örneğin şu işlevler: memory_allocated(), max_memory_allocated(), memory_reserved() hem de max_memory_reserved() Canlı tensör kullanımını ve önbelleğe alınmış kapasiteyi ayırt etmeye yardımcı olur.
Kullanılmayan önbelleğe alınmış belleği şu şekilde serbest bırakabilirsiniz: torch.cuda.empty_cache()Bu işlem, blokları CUDA sürücüsüne geri verir ancak aktif tensörlerin hala sahip olduğu belleği serbest bırakmaz. Daha detaylı inceleme için, memory_stats() hem de memory_snapshot() Parçalanma veya bellek yetersizliği (OOM) sorunlarını gidermede kritik öneme sahip olabilen düşük seviyeli tahsis bilgileri sağlar.
Tahsis edici davranışı şu yollarla ayarlanabilir: PYTORCH_ALLOC_CONF (veya takma adı PYTORCH_CUDA_ALLOC_CONFBu, arka uç uygulamasını seçmenize, bölme boyutlarını ayarlamanıza, yuvarlama stratejilerini, çöp toplama eşiklerini ve daha fazlasını belirlemenize olanak tanıyan bir ortam değişkenidir. CUDA'yı kullanma seçeneği de mevcuttur. cudaMallocAsyncDesteklenen araç setlerinde alternatif bir arka uç olarak -tabanlı ayırıcı.
PyTorch, yerleşik bellek ayırıcısına ek olarak, C veya C++ dillerinde yazılmış paylaşımlı kütüphaneler aracılığıyla takılabilir CUDA bellek ayırıcılarını da destekler. Bunlar, NCCL'nin NVLink Anahtar Azaltmaları veya özel CPU-GPU bellek yerleştirme stratejileri gibi harici sistemlerle entegre edilebilir ve Python aracılığıyla kullanıma sunulur. torch.cuda.memory.CUDAPluggableAllocator hem de torch.cuda.MemPool.
CUDA Grafikleri ve Performans Odaklı En İyi Uygulamalar
CUDA Grafikleri, bir grup GPU işlemini grafik olarak yakalayarak ve tek bir başlatma çağrısıyla yeniden oynatarak CPU yükünü azaltmak için güçlü bir özelliktir. PyTorch bu özelliği şu şekilde entegre eder: torch.cuda.CUDAGraph, torch.cuda.graph bağlam yöneticisi ve torch.cuda.make_graphed_callables() yardımcı.
Grafik yakalama, iş yükünüzde statik şekiller, deterministik kontrol akışı ve sıcak yolda CPU-GPU senkronizasyonu olmadığında en iyi sonucu verir. Yakalama sırasında GPU işlemleri yürütülmek yerine kaydedilir ve tekrar oynatma sırasında aynı sanal adreslerden okuma ve yazma işlemleri yapılarak aynı çekirdek dizisi çalıştırılır.
Yakalanan grafik sabit tensör düzenlerini varsaydığı için, PyTorch ömürleri grafiğe bağlı olan grafiğe özel bellek havuzları tahsis eder. CUDAGraph Nesneye ve yakalama işlemi içinde oluşturulan tensörlere. Bu havuzlar, tutarlı bir yürütme sırası ve eşzamanlılık olmaması garantisi verildiği takdirde, bellekten tasarruf etmek için ilgili grafikler arasında paylaşılabilir.
Dağıtılmış sistemlerde, özellikle de DistributedDataParallel NCCL ve CUDA Graph entegrasyonu, uyumlu NCCL sürümlerinin sağlanması, belirli eşzamansız hata işleyicilerinin devre dışı bırakılması ve toplu işlemlerin güvenli bir şekilde yakalanabilmesi için ısınma adımlarının ele alınması gibi bazı özen gerektirir. Doğru yapıldığında, istikrarlı, üretim kalitesinde eğitim döngüleri için verimliliği önemli ölçüde artırabilir.
Grafiklerin ötesinde, PyTorch dokümantasyonu, daha hızlı ana bilgisayar-GPU aktarımları için sabitlenmiş CPU belleğini kullanmayı ve bunu tercih etmeyi önermektedir. DistributedDataParallel tekrar DataParallel veya çoklu GPU eğitimi için basit çoklu işlemeyi kullanmak ve CPU ile GPU arasında sorunsuz geçiş sağlayan cihazdan bağımsız kod yazmak yoluyla torch.device. Bu uygulamaların tümü, ergonomi ve performans arasında ideal dengeyi kurmanıza yardımcı olur.
Kurulum, derleme seçenekleri ve donanım arka uçları
PyTorch, Conda, pip wheels veya kaynak koddan kurulabilir; tipik Linux, macOS ve Windows kurulumları için önceden derlenmiş ikili dosyalar ve NVIDIA Jetson platformları için özel sürümler mevcuttur. Her dağıtım, yayınlanmış bir destek matrisine göre belirli CUDA sürümlerini hedeflemektedir.
Kaynak koddan derleme yaparken, Python 3.10 veya daha yeni bir sürüme, modern ve C++17 uyumlu bir derleyiciye (örneğin Linux'ta GCC 9.4+) ve Windows'ta uygun araç zincirine (Visual Studio veya bağımsız Derleme Araçları) ihtiyacınız vardır. İlgili SDK'ları yükleyerek ve aşağıdaki gibi bayraklar ayarlayarak CUDA, ROCm (AMD GPU'lar için) veya Intel GPU desteğiyle veya desteksiz derleme yapabilirsiniz. USE_CUDA, USE_ROCM hem de USE_XPU.
Yalnızca CPU kullanan derlemeler için, özellikle CMake'in varsayılan MSVC çalışma zamanına geri dönebileceği Windows'ta, istenen OpenMP uygulamasının (genellikle Intel OpenMP) ve BLAS kütüphanelerinin bağlanmasına özel dikkat gösterilmesi gerekebilir. CUDA derlemeleri için, belirli işlemleri hızlandırmak amacıyla Magma veya oneDNN gibi ek kütüphaneler kullanılabilir.
PyTorch ayrıca önceden yapılandırılmış CUDA ve cuDNN ortamlarına sahip Docker imajları da sunmaktadır (bkz. bir konteynerleştirmeye girişBu görüntüler, çoklu işlem veri yükleyicileri için paylaşılan bellek bölümlerine dayanır; bu nedenle genellikle paylaşılan belleği artırmanız gerekir. --ipc=host or --shm-size on docker run. Docker ve NVIDIA sürücü sürümlerinizin CUDA araç seti sürümüyle uyumlu olduğundan emin olmak şarttır.
Dokümantasyonun kendisi Sphinx ve özel bir tema ile oluşturulmuştur ve gerekli Python bağımlılıklarını, TeX araçlarını ve PyTorch paketini yerel bir ortamda kurarsanız HTML veya PDF biçiminde oluşturulabilir. Bu özellik, yeni modüller veya doküman metinleri eklediğinizde ve bunları ana depoya katkıda bulunmadan önce önizlemek istediğinizde kullanışlıdır.
VibeTensor: PyTorch'tan esinlenilmiş yapay zeka tarafından oluşturulmuş çalışma ortamı.
NVIDIA'nın VibeTensor projesi, çalışma ortamlarına farklı bir açıdan bakmayı sağlıyor: Kavramsal olarak PyTorch'a benzeyen, deneysel bir yürütme ortamı olup, kod tabanı büyük ölçüde insan gözetimi altında yapay zeka ajanları tarafından oluşturulmuştur. Buradaki fikir, karmaşık bir sistem için kod yazmak üzere yapay zeka asistanlarına büyük ölçüde güvenen "titreşim tabanlı kodlama" yönteminin ne kadar ileriye götürülebileceğini görmek.
VibeTensor'ın mimarisi, Python ve JavaScript dostu bir API'yi, C++ çalışma zamanı çekirdeğini, özel tensör depolama ayırıcılarını, otomatik gradyan motorunu, dağıtıcıyı, gelişmiş bir indeksleme alt sistemini ve CUDA tabanlı bir bellek önbelleğini bir araya getirerek Linux x86_64 ve NVIDIA GPU'larını hedeflemektedir. Hatta çoklu GPU yürütmesi için CUDA P2P kullanan deneysel bir Fabric alt sistemi bile mevcut.
Proje ayrıca, yakında piyasaya sürülecek Blackwell mimarisi (SM100/SM103) için bir arka uç gibi harici GPU eklentilerini de destekliyor ve bu eklentilerin, insanlar tarafından kısıtlamalar ve doğrulama sağlandığı sürece, yapay zeka tarafından üretilen kodla başlatılabileceğini gösteriyor. Performans ve özellikler açısından şu anda PyTorch ile rekabet edemese de, proje yapay zeka destekli sistem programlaması için bir kavram kanıtı niteliğindedir.
Yaklaşık iki aylık geliştirme sürecinde, insan mühendisler çoğunlukla görevleri, kısıtlamaları ve inceleme döngülerini tanımlamaya odaklanırken, yapay zeka ajanları yinelemeli olarak kod üretti, karşılaştırmalar yaptı, derledi, test etti ve uygulamaları iyileştirdi. Bu hibrit iş akışı, yapay zekanın hem gücünü hem de sınırlamalarını vurguluyor: tekrarlayan kalıpların ve şablonların büyük kısmı otomatikleştirilebilir, ancak doğruluk ve mimari hala insan yargısını gerektiriyor.
Uygulayıcılar için VibeTensor, PyTorch'un doğrudan yerine geçebilecek bir alternatiften ziyade, özellikle Python, JavaScript, C++ ve CUDA'nın bir arada kullanıldığı ortamlarda, yapay zekanın tasarım ve evrim süreçlerine derinlemesine dahil olması durumunda gelecekteki çalışma ortamlarının nasıl görünebileceğine dair bir keşif niteliğindedir. Bu, niş iş yükleri için özel çalışma ortamlarının eskisinden çok daha hızlı bir şekilde devreye alınabileceği bir dünyaya işaret ediyor.
PyTorch'un tensör ve otomatik gradyan çekirdeği, C++ ön yüzü, TorchScript, C++ ve CUDA uzantıları, ince ayarlanmış CUDA entegrasyonu ve VibeTensor gibi deneysel çalışmalar gibi tüm bu parçaları bir araya getirdiğinizde, Python, C++, JavaScript ve CUDA'nın sıkı bir şekilde iç içe geçtiği ve geliştiricilerin kendi iş yükleri için üretkenlik, kontrol ve ham performansı en iyi şekilde dengeleyen katmanı akıcı bir şekilde seçebildikleri bir yapay zeka çalışma zamanı ekosisteminin resmini elde edersiniz.