cuDF-pandas
, daha önceki bir yazıda tanıtıldığı gibi, GPU hızlandırmalı bir kütüphanedir. Bu kütüphane, mevcut kodunuzda herhangi bir değişiklik yapmadan, pandas’ın performansını önemli ölçüde artırarak, sağladığı hız artışları sayesinde verilerinizi %50’ye kadar daha hızlı işleyebilmenizi sağlar. NVIDIA RAPIDS ekosisteminin bir parçası olarak, cuDF-pandas
, mümkün olduğunda işlemleri GPU üzerinde gerçekleştirirken, gerektiğinde CPU’ya (pandas aracılığıyla) geri dönerek kullanıcıların familiar pandas API’sini ve üçüncü parti kütüphaneleri uyumlu bir şekilde kullanabilmesine olanak tanır. Sadece cuDF-pandas
‘ı yükleyerek, kullanıcılar mevcut pandas iş akışlarını sürdürebilir ve CPU/GPU birleşik deneyimlerinden faydalanabilirler.
Arka planda, cuDF-pandas
varsayılan olarak yönetilen bir bellek havuzu kullanır ve bu sayede, fiziksel GPU belleğini aşan veri kümeleriyle başa çıkabilir. Bu, CUDA Unified Virtual Memory (UVM) aracılığıyla sağlanır ve sistem ile cihaz belleği arasında birleşik bir adres alanı oluşturarak bellek yönetimini kolaylaştırır. UVM, cuDF-pandas
‘ın GPU belleğini aşan uygulama yüklerini yönetmesine olanak tanır ve ihtiyaç oldukça verileri otomatik olarak CPU ile GPU arasında taşır.
Bu yazıda, UVM’nin neden bu kadar önemli olduğuna ve sağladığı avantajlara değineceğiz.
UVM Neden Gereklidir?
Unified Virtual Memory, GPU hızlandırmalı veri işlemede ortaya çıkan iki temel sorunu çözmek için kritik öneme sahiptir:
- Sınırlı GPU Belleği: Özellikle tüketici sınıfı GPU’ların, modern veri setlerinin gereksinimlerinden çok daha az belleği bulunmaktadır. UVM, sistem belleğini kullanarak, fiziksel GPU belleğini aşan yüklerin üstesinden gelinmesine olanak tanır.
- Kullanım Kolaylığı: UVM, bellek yönetimini basitleştirir; çünkü verilerin CPU ve GPU arasında taşınmasını otomatik olarak yönetir. Bu durum, programlama karmaşıklığını azaltır ve kullanıcıların iş akışlarına odaklanmalarını sağlar.
UVM’nin Ayrıntıları
Unified Virtual Memory (UVM), CUDA 6.0 ile birlikte tanıtılmıştır ve CPU ile GPU arasında paylaşılan tek bir sanal adres alanı oluşturarak geliştiriciler için bellek yönetimini basitleştirir. UVM, erişim kalıplarına bağlı olarak verileri sayfa granülünde taşır:
- GPU, ana bellek (host memory) içindeki verilere eriştiğinde, sayfa hatası oluşur ve bu veri GPU bellek alanına geçer.
- Tamamen GPU belleği dolduğunda, daha az kullanılan sayfalar ana belleğe geri evrim geçirir.
UVM, bellek kapasitesini genişletirken, açık bellek transferlerine olan ihtiyacı ortadan kaldırarak programlamayı basitleştirir. Ancak, sayfa hataları ve taşınma gecikmeleri nedeniyle performans darboğazları oluşturabilir. Bu problemleri önlemek için, cudaMemPrefetchAsync
gibi ön alan yükleme optimizasyonları kullanılır. Aşağıda, libcudf
çekirdekleri çalıştırılmadan hemen önce cudaMemPrefetchAsync
çağrılarını gösteren bir nsys profil grafiği bulunmaktadır:
UVM hakkında daha derin bilgi ve ön alan yükleme gibi optimizasyonların yanı sıra cudaMemAdvise
ile ilgili pratik örnekler için, Unified Memory for CUDA Beginners adlı teknik blogu inceleyebilirsiniz. Bu blog, UVM’nin farklı GPU mimarileri üzerindeki etkileşimini açıklar ve gerçek dünya uygulamalarında performansı maksimize etme ipuçları sunar.
cuDF-pandas’un UVM’den Faydalanması
cuDF-pandas
içinde, UVM, yüksek performanslı veri işlemede merkezi bir rol oynar:
- Yönetilen Bellek Havuzu: Varsayılan olarak,
cuDF-pandas
UVM destekli bir yönetilen bellek havuzu kullanır. Bu havuz, ayırma yüklerini azaltır ve hem ana bellek hem de cihaz belleğinin verimli kullanımını sağlar. - Ön Alan Yükleme Optimizasyonu: Ön alan yükleme, verilerin GPU’ya erişilmeden önce taşınmasını sağlar, bu sayede sayfa hatalarını azaltır. Özellikle büyük veri setleri gerektiren I/O işlemleri veya join (birleştirme) işlemleri sırasında ön alan yükleme, veri akışlarının daha düzgün gerçekleşmesini sağlar. Bu ön alan yükleme çağrıları, belirli çekirdekler için
libcudf
katmanında yer almaktadır.
Örnek: Büyük Birleştirme ve Parquet Yazma İşlemi Google Colab’de
Çok büyük iki tablo üzerinde birleştirme işlemi yapmayı düşünelim. Bu işlem, sınırlı GPU belleği ile Google Colab’da cuDF-pandas
kullanarak gerçekleştirilecektir:
- UVM olmadan: Bu işlem, yetersiz cihaz belleği nedeniyle başarısız olurdu.
- UVM etkin olduğunda: Veri setleri, ana bellek ile cihaz belleğine bölünür. Birleştirme işlemi 진행 ederken, yalnızca gerekli veri parçaları GPU’ya taşınır.
- Ön alan yükleme, bu süreci daha da optimize eder; böylece ilgili veriler, hesaplama öncesinde cihaz belleğine getirilir.
Kullanıcılar, kod değişikliği yapmadan daha büyük veri setleri için GPU’ları kullanabilir. Unified Virtual Memory (UVM) sayesinde, hızlandırmalar işlemlere göre değişiklik gösterse de, son kullanıcı uygulamaları için önemli kazanımlar sağlanarak istikrar korunur.
Aynı durum büyük bir parquet dosyasına yazma işlemi için de geçerlidir. cudf
ile MemoryError
hatası alacak bir işlem, cuDF-pandas
ile başarıyla tamamlanır ve hatta pandas
‘dan daha hızlı gerçekleşir.
Sonuç
Unified Virtual Memory, cuDF-pandas
‘ın temel taşlarından biridir ve büyük veri setlerini verimli bir şekilde işlerken, düşük seviye GPU’larla uyumlu bir çalışma sağlar. Yönetilen bellek havuzları ve ön alan yükleme gibi özellikleri kullanarak, cuDF-pandas
veri işleme süreçlerinde hem performans hem de istikrar sunmakta, bu da veri bilimi iş akışlarını genişletip kullanımı kolay hale getirmenin ideal bir yolu olmaktadır.
Bu yazının uygulamalarını görmek için şu Google Colab defterini deneyebilirsiniz. Bu sayede, GPU bellek kapasitesini aşan veri setleri ile çalışma yeteneğini gözlemleyebilirsiniz.