“Unified Virtual Memory ile RAPIDS cuDF ile Pandas’ı Güçlendirin”

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:

  1. 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.
  2. 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:

An nsys-profile showing calls to cudaMemPrefetchAsync being made before execution of libcudf kernels.
Şekil 1. libcudf çekirdeklerinin çalıştırılmasından önce cudaMemPrefetchAsync çağrılarının yapıldığını gösteren bir nsys profili.

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:

  1. 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.
  2. Ö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.

Şekil 2. Pandas ve cuDF-pandas ile birleştirme sürelerinin karşılaştırılması. Pandas 28.2 saniye alırken cuDF-pandas sadece 2.19 saniye alıyor.
CPU donanımı: Intel(R) Xeon(R) Gold 6130 CPU @ 2.10GHz, GPU donanımı: NVIDIA T4

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.

Şekil 3. Büyük bir tablonun parquet dosyasına yazma sürelerinin pandas ile cuDF-pandas karşılaştırması. Pandas 28.1 saniye alırken cuDF-pandas 14.4 saniyede işlemi gerçekleşti.
CPU donanımı: Intel(R) Xeon(R) Gold 6130 CPU @ 2.10GHz, GPU donanımı: NVIDIA T4

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.

Kaynak

Nvdia Blog

Exit mobile version