Veri bilimi alanında operasyonel verimlilik, giderek karmaşıklaşan ve büyük hacimli veri setleriyle başa çıkabilmek için kritik öneme sahiptir. GPU hızlandırması, modern iş akışları için vazgeçilmez hale gelmiş ve önemli performans iyileştirmeleri sunmuştur.
RAPIDS, NVIDIA tarafından geliştirilen, veri bilimi pipeline’larını GPU’ları kullanarak hızlandırmak için kod değişiklikleri ile minimal düzeyde çalışan açık kaynaklı kitaplıklar ve çerçeveler koleksiyonudur. cuDF veri manipülasyonu için, cuML makine öğrenimi için ve cuGraph grafik analizi için olmak üzere sunduğu araçlarla, RAPIDS mevcut Python kütüphaneleriyle sorunsuz bir entegrasyon sağlamaktadır. Bu sayede veri bilimcileri daha hızlı ve verimli işlem yapabilmektedir.
Bu yazıda, deneyimli veri bilimcileri için CPU veri bilimi kütüphanelerinden GPU hızlandırmalı iş akışlarına geçiş yaparken dikkate almanız gereken ipuçlarını paylaşacağız.
RAPIDS’i Masaüstü veya Bulut Altyapısında Kurma
RAPIDS ile çalışmaya başlamak oldukça kolaydır, ancak bir dizi bağımlılığı vardır. Tavsiye edilen yaklaşım, resmi RAPIDS Kurulum Kılavuzunu takip etmektir; bu kılavuzda yerel kurulumlar için detaylı talimatlar bulunmaktadır. Çerçeveyi kurmak için pip ile kurulum, Docker imajı veya Conda gibi bir ortam üzerinden kurulum yapabilirsiniz. Bulut ortamında RAPIDS’i kurmak için RAPIDS Bulut Dağıtım Kılavuzuna göz atabilirsiniz. Kurulumdan önce, uyumluluğu kontrol etmek için CUDA sürümünüz ve desteklenen RAPIDS sürümünü kontrol ettiğinizden emin olun.
cuDF ve Pandas için GPU Hızlandırması
RAPIDS’in avantajlarından biri, kullanıcıların GPU hızlandırmalı iş akışları için özel olarak tasarlanmış belirli kütüphaneleri benimsemelerine olanak tanıyan modüler mimarisidir. Bu kütüphaneler arasında, geleneksel pandas tabanlı iş akışlarından GPU optimize edilmiş veri işleme geçişini mümkün kılan cuDF dikkat çekmektedir ve **kod değişikliği gerektirmemektedir**.
Başlamak için, işlem yapmadan önce cuDF uzantısını etkinleştirmeniz gerekmektedir. Bunun için, rapids uzantısını %load_ext cudf.pandas
komutuyla yükleyerek mevcut iş akışlarınıza cuDF DataFrame’i sorunsuz bir şekilde entegre edebilirsiniz; bu sayede pandas’ın tanıdık sözdizimini ve yapısını koruyabilirsiniz.
cuDF, .csv, .json, .pickle, .parquet gibi çeşitli dosya formatlarını desteklemekte ve böylece GPU hızlandırmalı veri manipülasyonu sağlamaktadır.
Aşağıdaki kod, cudf.pandas
uzantısını etkinleştirip iki .csv dosyasını birleştirmenin bir örneğidir:
%load_ext cudf.pandas
import pandas as pd
import cupy as cp
train = pd.read_csv('./Titanic/train.csv')
test = pd.read_csv('./Titanic/test.csv')
concat = pd.concat([train, test], axis = 0)
cuDF uzantısının yüklenmesi, veri filtreleme, gruplama ve birleştirme gibi pandas işlemlerinin GPU üzerinde gerçekleştirilmesini sağlar. Bu, kodda değişiklik yapmadan veya yeniden yazmadan mümkündür. CuDF hızlandırıcısı, pandas API ile uyumlu olarak, CPU’dan GPU’ya geçişi kolaylaştırırken önemli hesaplama hızları sunar.
target_rows = 1_000_000
repeats = -(-target_rows // len(train)) # Tavan bölme
train_df = pd.concat([train] * repeats, ignore_index=True).head(target_rows)
print(train_df.shape) # (1000000, 2)
repeats = -(-target_rows // len(test)) # Tavan bölme
test_df = pd.concat([test] * repeats, ignore_index=True).head(target_rows)
print(test_df.shape) # (1000000, 2)
combine = [train_df, test_df]
(1000000, 12)
(1000000, 11)
filtered_df = train_df[(train_df['Age'] > 30) & (train_df['Fare'] > 50)]
grouped_df = train_df.groupby('Embarked')[['Fare', 'Age']].mean()
additional_info = pd.DataFrame({
'PassengerId': [1, 2, 3],
'VIP_Status': ['No', 'Yes', 'No']
})
merged_df = train_df.merge(additional_info, on='PassengerId', how='left')
Performans Ölçümü: CPU ve GPU Süre Metriği
Veri bilimi alanında, performans optimizasyonu yalnızca hızla ilgili değildir; aynı zamanda hesaplama kaynaklarının nasıl kullanıldığını anlama meselesidir. Bu, işlemlerin CPU ve GPU mimarilerini nasıl kullandığını analiz etmeyi, verimsizlikleri belirlemeyi ve veri iş akışlarını optimize etmek için stratejiler uygulamayı içerir.
Performans profil araçları, %cudf.pandas.profile
gibi, kod yürütümünü detaylı şekilde inceleme imkanı sunarak kritik bir rol oynar. Aşağıdaki yürütme sonucu, her bir işlevin ayrıntılarını ortaya koyarak CPU üzerinde işlenen görevleri, GPU üzerinde hızlandırılmış olanlardan ayırmaktadır:
%%cudf.pandas.profile
train_df[['Pclass', 'Survived']].groupby(['Pclass'],
as_index=False).mean().sort_values(by='Survived', ascending=False)
Pclass Survived
0 1 0.629592
1 2 0.472810
2 3 0.242378
Toplam geçen süre: 5.131 saniye
5 GPU fonksiyon çağrısı 5.020 saniyede gerçekleşti
0 CPU fonksiyon çağrısı 0.000 saniyede gerçekleşti
İstatistikler
+------------------------+------------+-------------+------------+------------+-------------+------------+
| Fonksiyon | GPU çağrısı | GPU toplam süre | GPU kişi başı süre | CPU çağrısı | CPU toplam süre | CPU kişi başı süre |
+------------------------+------------+-------------+------------+------------+-------------+------------+
| DataFrame.__getitem__ | 1 | 5.000 | 5.000 | 0 | 0.000 | 0.000 |
| DataFrame.groupby | 1 | 0.000 | 0.000 | 0 | 0.000 | 0.000 |
| GroupBy.mean | 1 | 0.007 | 0.007 | 0 | 0.000 | 0.000 |
| DataFrame.sort_values | 1 | 0.002 | 0.002 | 0 | 0.000 | 0.000 |
| DataFrame.__repr__ | 1 | 0.011 | 0.011 | 0 | 0.000 | 0.000 |
Bu ayrıntı, farkında olmadan CPU işlemine geri dönen işlemler, uyumsuz cuDF işlevleri, uyumsuz veri türleri veya altoptimal bellek yönetimi gibi noktaları tespit etmeyi kolaylaştırır. Bu tür dönüşlerin belirlenmesi son derece önemlidir; çünkü bu tür geri dönüşler genel performansı önemli ölçüde etkileyebilir. Daha fazla bilgi için, cuDF Profil Aracını Kullanma başlıklı makaleyi inceleyebilirsiniz.
Ayrıca, belirli kod bloklarının çalışma süresini kıyaslamak için %%time
ve %%timeit
gibi Python sihirli komutlarını kullanabilirsiniz. Bu araçlar, CPU ve GPU için çalışma süreleri arasındaki doğrudan karşılaştırmalar yapma imkanı sunar. Benchmarking ile %%time
, CPU ve GPU ortamları arasındaki yürütme sürelerine net bir karşılaştırma sağlar ve paralel işlemle ulaşılabilecek verimlilik kazanımlarını vurgular.
%%time
print("Önce", train_df.shape, test_df.shape, combine[0].shape, combine[1].shape)
train_df = train_df.drop(['Ticket', 'Cabin'], axis=1)
test_df = test_df.drop(['Ticket', 'Cabin'], axis=1)
combine = [train_df, test_df]
print("Sonra", train_df.shape, test_df.shape, combine[0].shape, combine[1].shape)
CPU çıktısı:
Önce (999702, 12) (999856, 11) (999702, 12) (999856, 11)
Sonra (999702, 10) (999856, 9) (999702, 10) (999856, 9)
CPU süreleri: kullanıcı 56.6 ms, sistem: 8.08 ms, toplam: 64.7 ms
Gerçek zaman: 63.3 ms
GPU çıktısı:
Önce (999702, 12) (999856, 11) (999702, 12) (999856, 11)
Sonra (999702, 10) (999856, 9) (999702, 10) (999856, 9)
CPU süreleri: kullanıcı 6.65 ms, sistem: 0 ns, toplam: 6.65 ms
Gerçek zaman: 5.46 ms
%%time
örneği, %10’luk bir hız artışı sağlamakta ve CPU üzerindeki işleme süresini 63.3 milisaniyeden (ms) GPU üzerinde 5.46 ms’ye düşürmektedir. Bu, cuDF pandas kullanılarak yapılan büyük ölçekli veri işlemlerinin verimliliğini vurgulamaktadır. Kullanılan her iki ortamda da kesinlik ve güvenilirlik için %%timeit
komutunu kullanarak daha fazla içgörü elde edebilirsiniz.
%%timeit
for dataset in combine:
dataset['Title'] = dataset.Name.str.extract(' ([A-Za-z]+)\.', expand=False)
pd.crosstab(train_df['Title'], train_df['Sex'])
CPU çıktısı:
1.11 s ± 7.49 ms döngü başına (ortalama ± standart sapma, 7 tekrar, 1 döngü)
GPU çıktısı:
89.6 ms ± 959 µs döngü başına (ortalama ± standart sapma, 7 tekrar, 10 döngü)
%%timeit
örneği, GPU hızlandırması ile %10’luk bir performans iyileştirmesi sağlamakta ve CPU’da her döngü başına geçen süreyi 1.11 saniyeden GPU’da 89.6 ms’ye düşürmektedir. Bu, cuDF pandas’ın yoğun veri işlemleri için sağladığı verimliliği göstermektedir.
GPU Kullanımını Doğrulama
Farklı veri türleri ile çalışırken, sisteminizin GPU’yu etkin bir şekilde kullanıp kullanmadığını doğrulamak önemlidir. Verilerin CPU veya GPU üzerinde işlenip işlenmediğini belirlemenin en basit yolu, tanıdık type
komutunu kullanmaktır. Bu şekilde NumPy ve CuPy dizileri arasında ayrım yapabilirsiniz.
type(guess_ages)
cupy.ndarray
Eğer çıktı np.array
olarak gelirse, veriler CPU üzerinde işlenmektedir. Eğer çıktı cupy.ndarray
ise, veriler GPU üzerinde işlenmektedir. Bu hızlı kontrol, iş akışlarınızın istediğiniz şekilde GPU kaynaklarını kullandığından emin olmanızı sağlar.
İkinci olarak, print
komutunu kullanarak GPU’nun etkin bir şekilde kullanılıp kullanılmadığını teyit edebilir ve cuDF DataFrame’inin işlenip işlenmediğini kontrol edebilirsiniz. Çıktıda hızlı yol (cuDF) veya yavaş yol (pandas) kullanılmakta olduğu belirtilir. Bu basit kontrol, GPU’nun veri işlemlerini hızlandırdığını doğrulamak için kolay bir yol sunar.
print(pd)
<module 'pandas' (ModuleAccelerator(fast=cudf, slow=pandas))>
Son olarak, df.info
gibi komutlar kullanarak cuDF DataFrame’in yapısını inceleyebilir ve hesaplamaların GPU hızlandırmalı olup olmadığını doğrulayabilirsiniz. Bu, işlemlerin GPU üzerinde mi yoksa CPU’ya geri dönüp mi döndüğünü kontrol etmenize yardımcı olur.
train_df.info()
<class 'cudf.core.dataframe.DataFrame'>
RangeIndex: 1000000 kayıt, 0'dan 999999'a
Veri sütunları (toplam 9 sütun):
# Sütun Null Olmayan Sayısı Dtype
--- ------ -------------- -----
0 Survived 1000000 null değil int64
1 Pclass 1000000 null değil int64
2 Sex 1000000 null değil int64
3 Age 1000000 null değil float64
4 SibSp 1000000 null değil int64
5 Parch 1000000 null değil int64
6 Fare 1000000 null değil float64
7 Embarked 997755 null değil object
8 Title 1000000 null değil int64
dtypes: float64(2), int64(6), object(1)
bellek kullanımı: 65.9+ MB
Sonuç
RAPIDS, cuDF pandas gibi araçları aracılığıyla geleneksel CPU tabanlı veri iş akışlarından GPU hızlandırmalı işleme geçişini kolaylaştırmakta ve önemli performans iyileştirmeleri sunmaktadır. %%time, %%timeit gibi özelliklerin yanı sıra %%cudf.pandas.profile
gibi profil araçlarını kullanarak çalışma sürelerini ölçebilir ve optimize edebilirsiniz. GPU kaynaklarının etkili bir şekilde kullanıldığını doğrulamak için type
, print(pd)
ve df.info
gibi basit komutlar iş akışlarınızın durumu hakkında bilgi vermektedir.
Bu yazıda detaylandırılan veri işlemlerini denemek için eşlik eden Jupyter Notebook‘a göz atabilirsiniz.
GPU hızlandırmalı veri bilimi hakkında daha fazla bilgi edinmek için, RAPIDS cuDF ve CuPy Kütüphaneleri Arasında Geçiş: 10 Dakikaya Veri Bilimi ve RAPIDS cuDF’nin pandas’ı 50 kat hızlandırması makalelerine göz atabilirsiniz.
GTC 2025 etkinliğine katılın GTC 2025 ve daha derin içgörüler kazanmak için Veri Bilimi Oturumu‘na kaydolun. Önerilen oturumlar şunlardır:
- RAPIDS ve NVIDIA GPU’ları ile Veri Bilimini Hızlandırmak
- RAPIDS ile Makine Öğrenimi İş Akışlarını Ölçeklendirmek
RAPIDS konusunda uzmanlık kazanmak için GTC’deki aşağıdaki uygulamalı atölye çalışmalarına katılın: