Python veri bilimi dünyasında, pandas kütüphanesi, verileri sezgisel bir şekilde manipüle etmek ve analiz etmek için uzun zamandır tercih edilen bir araç olmuştur. Ancak, veri hacimleri arttıkça CPU tabanlı pandas iş akışları, performans sorunlarına neden olmaya başlayabilir.
Bu noktada, cuDF ve onun pandas hızlandırıcı modu olan cudf.pandas
devreye giriyor. Bu mod, mümkün olduğunda GPU’lar üzerinden işlemleri hızlandırarak, desteklenmeyen işlemler için CPU’ya otomatik olarak geri dönüyor. Bu yaklaşımın temel taşlarından biri cudf.pandas
profilidir; bu profil, kodunuzun ne kadarının GPU, ne kadarının CPU üzerinde çalıştığını anlamanızı sağlıyor.
Bu yazıda, cudf.pandas
profilinin ne olduğu, nasıl kullanılacağı ve hızlandırılmış pandas iş akışlarınızı anlamak ve optimize etmek için neden kritik olduğu üzerinde duracağız.
cuDF.pandas Profili Üzerine Genel Bakış
cudf.pandas.profile
sihirli komutu, Jupyter ve IPython ortamlarında, pandas tarzı kodunuzu anlık olarak analiz eden bir profil aracı olarak karşımıza çıkıyor. cudf.pandas
uzantısını etkinleştirdikten sonra, bu profil her bir işlemin çalışma cihazını (GPU veya CPU) rapor ediyor ve belirli bir fonksiyon veya metodun ne kadar sıklıkla çağrıldığını sayıyor.
Bu verileri toplayarak, aşağıdakileri hızlı bir şekilde belirleyebilirsiniz:
- GPU’da tamamen hızlandırılan işlemler.
- CPU’ya geri dönen işlemler.
- Olumsuz performansa yol açabilecek olası darboğazlar veya gereksiz veri transferlerinin nerede olabileceği.
Profilin Etkinleştirilmesi
Başlamak için, not defterinizde cudf.pandas
uzantısını yükleyin; bunu diğer IPython sihirleri gibi yapabilirsiniz:
%load_ext cudf.pandas
import pandas as pd
Bundan sonra, CSV okuma, DataFrame birleştirme veya grup işlemleri gibi pandas kodları yazmaya başlayabilirsiniz ve cudf.pandas
bunları GPU üzerinden hızlandırmak için otomatik olarak karar verecektir.
Profilin Uygulanması
cudf.pandas
profilini kullanmanın birkaç yolu vardır:
- Hücre düzeyinde profil kullanımı
- Satır düzeyinde profil kullanımı
- Komut satırı aracılığıyla profil kullanımı
Hücre Düzeyinde Profil Kullanımı
Jupyter veya IPython’da, profil kullanımını hücre bazında etkinleştirebilirsiniz:
%%cudf.pandas.profile
df = pd.DataFrame({'a': [0, 1, 2], 'b': [3, 4, 3]})
df.min(axis=1)
out = df.groupby('a').filter(lambda group: len(group) > 1)
Hücre işini tamamladıktan sonra, GPU ve CPU üzerinde hangi işlemlerin çalıştığını gösteren bir çıktıyla karşılaşacaksınız. Bu çıktı, her bir işlemin ne sıklıkla çağrıldığını ve performans darboğazlarını keşfetmenize yardımcı olacaktır.
Satır Düzeyinde Profil Kullanımı
Daha derine inmek ve hücredeki her bir satırın nasıl performans gösterdiğini görmek için şu kod örneğini çalıştırın:
%%cudf.pandas.line_profile
df = pd.DataFrame({'a': [0, 1, 2], 'b': [3, 4, 3]})
df.min(axis=1)
out = df.groupby('a').filter(lambda group: len(group) > 1)
Bu durumda, profil satır bazında yürütme detaylarını gösterir, bu da CPU dönüşlerine veya performans yavaşlamalarına neden olan özel satırları kolayca tespit etmenizi sağlar.
Komut Satırından Profil Kullanımı
Ayrıca, cudf.pandas
profilini komut satırından --profile
argümanını geçirerek çalıştırabilirsiniz.
Aşağıda demo.py
dosyasının içeriği verilmiştir:
import pandas as pd
s = pd.Series([1, 2, 3])
s = (s * 10) + 2
print(s)
Aşağıdaki komutu çalıştırın:
python -m cudf.pandas --profile demo.py
Profil istatistikleri çıktısını göreceksiniz:
Toplam süre: 0.852 saniye
4 GPU işlem çağrısı 0.029 saniyede yapıldı
0 CPU işlem çağrısı 0.000 saniyede yapıldı
İstatistikler
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓
┃ İşlev ┃ GPU çağrısı ┃ GPU toplam süre ┃ GPU çağrısı başına süre ┃ CPU çağrısı ┃ CPU toplam süre ┃ CPU çağrısı başına süre ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━┩
│ Series │ 1 │ 0.002 │ 0.002 │ 0 │ 0.000 │ 0.000 │
│ OpsMixin.__mul__ │ 1 │ 0.011 │ 0.011 │ 0 │ 0.000 │ 0.000 │
│ OpsMixin.__add__ │ 1 │ 0.008 │ 0.008 │ 0 │ 0.000 │ 0.000 │
│ object.__str__ │ 1 │ 0.008 │ 0.008 │ 0 │ 0.000 │ 0.000 │
└──────────────────┴────────────┴─────────────┴─────────────┴────────────┴─────────────┴─────────────┘
Neden Profil Üzerinde Düşünmek Önemlidir?
GPU hızlandırmada her şey otomatik olarak desteklenmiyor. Bazı işlemler—belirli Python düzeyindeki fonksiyonlar, özel lambdalar veya henüz GPU’da uygulanmamış DataFrame yöntemleri—CPU geri dönüşlerine neden olabilir.
Profil, bu geri dönüşlerin nerede gerçekleştiğini görmenizi sağlar. Bu bilgilere sahip olmak, iş akışınızı ayarlamanız, belirli işlevleri yeniden yazmanız veya iyileştirme alanlarını araştırmanız konusunda yardımcı olur:
- CPU-tabanlı işlemleri yeniden yazın: Bazı kullanıcı tanımlı fonksiyonlar veya işlemler, GPU dostu hale getirilecek şekilde değiştirilebilir.
- Sık veri transferlerini izleyin: CPU ve GPU arasında aşırı veri transferleri, hızlandırma kazanımlarını olumsuz etkileyebilir. Bunları tespit etmek, maksimum hız kazanımı için kritik öneme sahiptir.
- Güncel kalın:cuDF, devamlı olarak işlevsellik ekliyor ve pandas ile kapatılan boşlukları kapatıyor.
CPU tabanlı olan yöntemleri bilmek, gelecekteki iyileştirmeleri takip etmenize yardımcı olur.
Sonuç
Pandas kullanıcı deneyimi, modern veri biliminde merkezî bir öneme sahipken, büyük veri setlerine ölçeklenirken çoğunlukla CPU performansı zora girebilir.
Bu noktada, cudf.pandas
ile, aynı sezgisel API’yi kullanarak mümkün olduğunda GPU hızından yararlanır ve desteklenmeyen işlemler için otomatik olarak CPU’ya geri dönebilirsiniz. cudf.pandas
profilerı, bu karmaşık CPU/GPU ekosistemini anlamanın anahtarıdır. Hızlandırma fırsatlarını belirleyip, kodunuzu en iyi performans için iyileştirmenize yardımcı olur.
Projenizde denemekten çekinmeyin. Kodunuzu profil edinerek ve CPU geri dönüşlerini tespit ederek, pandas’ı sevdiğiniz API düzeyinden ayrılmadan daha ileriye taşıyabilirsiniz.
GPU hızlandırmalı hale getirmeyi istediğiniz API’ler ile ilgili sorunlarınız varsa, lütfen buradan bir GitHub sorunu açın.