SON DAKİKA

Nvdia

Veri Bilimi İçin GPU Hızlandırmaya Başlangıç Rehberi

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 konusunda uzmanlık kazanmak için GTC’deki aşağıdaki uygulamalı atölye çalışmalarına katılın:

Kaynak

Nvdia Blog

Düşüncenizi Paylaşın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İlgili Teknoloji Haberleri