- GPU, binlerce çekirdeğe sahip büyük ölçekli paralel bir işlemcidir ve aynı anda çok sayıda işi işleyecek şekilde tasarlanmıştır
- CPU karmaşık ve sıralı işlerde başarılıdır, ancak aynı anda işleyebileceği görev sayısı sınırlıdır
- Buna karşılık GPU, binlerce iş parçacığı üzerinden işleri paralel olarak işleyerek büyük miktarda veriyi hızla işleme konusunda güçlüdür
- Örneğin NVIDIA RTX 4090 GPU, 16.384 CUDA çekirdeğine sahiptir; bu da ileri seviye CPU'ların 16~24 çekirdeğiyle karşılaştırılabilir
- Her GPU çekirdeği bir CPU çekirdeğinden daha yavaştır, ancak çok sayıdaki çekirdeğin paralel çalışması sayesinde matris işlemleri gibi büyük ölçekli hesaplamalar için uygundur
CUDA ve Python
- NVIDIA'nın CUDA'sı (Compute Unified Device Architecture), GPU üzerinde çalışan programlar yazmayı sağlayan bir platform ve C++ uzantısıdır
- CUDA, geliştiricilerin doğrudan GPU'da çalışan kod yazabilmesi için bir programlama modeli ve API sağlar
- Bu sayede paralelleştirilebilen işler CPU'dan GPU'ya offload edilerek performans artışı hedeflenebilir
- Python geliştiricileri Numba gibi araçları kullanarak GPU hızlandırmadan yararlanabilir
- Numba, Python kodunu CUDA destekli GPU'larda çalışabilecek şekilde derleyen bir Python derleyicisidir
- Böylece Python geliştiricileri, minimum düzeyde yeni sözdizimi ve terimle GPU hızlandırmalı hesaplamaya kolayca başlayabilir
- CUDA Python, CUDA driver ve runtime API'leri için Cython/Python wrapper'ları sunarak Python geliştiricilerinin GPU'nun paralel hesaplama gücünden yararlanmasını sağlar
- CUDA Python, PIP ve Conda üzerinden kurulabilir
CUDA'da iş parçacığı ve blok yapısı
- CUDA'da kernel, GPU üzerinde çalışan bir fonksiyondur; kernel çalıştırıldığında yüzlerce veya binlerce paralel iş parçacığı aynı anda çalışarak farklı verileri işler
- Bu modele SIMT (Single-Instruction Multiple-Thread) modeli denir
- İş parçacıkları warp'lar (32 iş parçacığından oluşan gruplar) halinde düzenlenir ve warp'lar bloklar halinde gruplanır
- Her blok bir streaming multiprocessor (SM) üzerinde çalışır ve SM, sınırlı kaynaklara sahiptir (register'lar, shared memory vb.)
- Blok boyutu, bu kaynakların tahsisini ve warp'ların eşzamanlı çalışma sayısını (occupancy) etkiler
- İş parçacığı bloklarının sayısı ve boyutu uygun şekilde ayarlanarak GPU kaynakları verimli kullanılabilir
Bellek yönetimi ve optimizasyon
- CUDA programlamasında CPU (host) ile GPU (device) arasındaki bellek yönetimi açıkça yapılmalıdır
- Tipik akış şu şekildedir:
- GPU belleği ayırma (
cudaMalloc)
- Veriyi host'tan device'a kopyalama (
cudaMemcpy)
- Kernel çalıştırma
- Sonuçları device'tan host'a kopyalama (
cudaMemcpy)
- GPU belleğini serbest bırakma (
cudaFree)
- Shared memory, bir blok içindeki iş parçacıklarının veriyi hızlıca paylaşabilmesini sağlayan on-chip bellektir; bu sayede bellek erişim hızı artırılabilir
- İş parçacıkları arası senkronizasyon
__syncthreads() kullanılarak gerçekleştirilir; bu da race condition'ları önlemeye yardımcı olur
LLM'ler için özel CUDA kernel'ları
- Büyük dil modeli (LLM) iş yüklerinde, bellek ek yükünü azaltmak ve verimliliği artırmak için birden fazla işlemi tek bir kernel içinde birleştiren özel CUDA kernel'ları geliştirilmektedir
- Örneğin FlashAttention, Transformer'daki self-attention'ı optimize ederek bellek okuma ve yazmalarını azaltır ve böylece verimliliği büyük ölçüde artırır
- FlashAttention, shared memory kullanarak işlemleri tile'lara böler ve bu sayede uzun sequence'lerde bile yüksek verim sağlar
- Bu tür optimizasyonlarla, derin öğrenmede bellek bant genişliğinin darboğaz haline gelmesi sorunu çözülebilir
PyTorch ve CUDA uygulamalarının karşılaştırması
- PyTorch'ta yüksek seviyeli soyutlamalar sayesinde GPU işlemleri kolayca gerçekleştirilebilir
- Örneğin iki vektörün toplamını alma işlemi şu şekilde basitçe uygulanabilir:
import torch
# GPU üzerinde iki büyük vektör oluştur
a = torch.rand(1000000, device='cuda')
b = torch.rand(1000000, device='cuda')
# Eleman bazında toplama
c = a + b
- Ancak performans optimizasyonunun gerekli olduğu durumlarda, CUDA doğrudan kullanılarak özel kernel'lar yazılabilir
- CUDA kullanıldığında bellek erişim desenleri, iş parçacığı düzeni, shared memory kullanımı gibi unsurlar ayrıntılı biçimde ayarlanarak performans en üst düzeye çıkarılabilir
- Örneğin FlashAttention'ın CUDA uygulaması, bellek erişimini optimize eder ve işlemleri shared memory içinde tile'layarak performansı artırır
- Bu tür düşük seviyeli optimizasyonlar sayesinde PyTorch'un yüksek seviyeli uygulamasından daha yüksek performans elde edilebilir
Sonuç
- GPU'nun paralel işleme gücünden yararlanarak büyük ölçekli veri işleme ve karmaşık hesaplamalar verimli şekilde gerçekleştirilebilir
- CUDA, GPU'nun bu performansından en üst düzeyde yararlanmayı sağlayan bir platformdur ve Python geliştiricileri de Numba gibi araçlarla CUDA'nın avantajlarından faydalanabilir
- CUDA'nın iş parçacığı ve blok yapısını, bellek yönetimi tekniklerini vb. anlamak daha verimli GPU programlamasını mümkün kılar
- Özellikle derin öğrenme gibi alanlarda özel CUDA kernel'ları yazarak performans en üst düzeye çıkarılabilir
- PyTorch gibi yüksek seviyeli framework'ler kullanılırken bile, gerektiğinde düşük seviyeli CUDA optimizasyonlarıyla daha yüksek performans hedeflenebilir
1 yorum
Hacker News görüşleri
Aptalca bir soru: Bir mühendis olarak, yapay zekanın matematiksel yönlerini öğrenmeden CUDA ya da GPU mimarisinin düşük seviyelerine derinlemesine inmek mümkün mü? Eğer mümkünse, nasıl başlanır? Optimizasyonu ve belirli hesaplamalar için neden GPU kullanıldığını öğrenmek gerekiyor gibi görünüyor
Oldukça harika bir yazı. AI tarafından üretilmiş gibi görünen satır içi quizler (Soru-Cevap), kavrayışı test etmek için çok faydalı. Keşke tüm eğitimlerde bu özellik olsa
Tüm CUDA eğitimlerinin hedefinin yapay zeka olup olmadığını, yoksa örneğin genel bilimsel hesaplama için olanların da bulunup bulunmadığını merak ediyorum. Yüksek performanslı hesaplama için bir kanadın üzerindeki hava akışı gibi şeyleri denemek eğlenceli olurdu
Paylaştığın için teşekkürler, okumaktan keyif aldım. Biraz ilgili bir sorum var: DeepSeek'in CUDA'yı baypas ederek çalışmayı daha verimli hale getirme yöntemi hakkında bir içgörüsü olan var mı diye merak ediyorum
Jensen verirse, Guido alır
Şu kitap: "Programming Massively Parallel Processors", CPU mimarisinden GPU mimarisine geçenler için özel olarak hazırlanmış gibi görünüyor
Ayrıca https://github.com/rust-gpu/rust-gpu ve https://github.com/rust-gpu/rust-cuda bağlantılarına da göz atın
İlgili bağlantılar: https://sakana.ai/ai-cuda-engineer/ ve https://reddit.com/r/MachineLearning/…
Son zamanlarda neyin değiştiği ve geçmişte yalnızca CPU'da mümkün olan simülasyonların artık GPU'da (ör. isaac sim) baştan sona yapılabilmesini neyin sağladığı hakkında fikri olan var mı diye merak ediyorum
PySpur'un web sitesinde yer aldığı için, PySpur ve n8n gibi yapay zeka ajanlarına yönelik UI araçlarıyla deneyimi olan biri var mı diye merak ediyorum. Eğlencesine birkaç fikrin prototipini çıkarmak için işe yarayabilecek bir şey arıyorum. Self-hosting yapmam gerekeceğinden ($), Open Hands gibi kurulumu nispeten kolay bir şeyi tercih ederim