Yapay zeka çağı için GPU hayatta kalma araç kiti
(journal.hexmos.com)- Yapay zeka geliştirme artık yalnızca CPU tarzı sıralı yürütme ile yeterli değil; eğitim ve çıkarım performansını doğru şekilde ele almak için GPU’nun büyük ölçekli paralel işleme modelini anlamak gerekiyor
- CPU, tüketici sınıfı sistemlerde genelde 2~16 çekirdek ile tek iş parçacıklı ve koşullu dallanmalı işlerde güçlüdür; GPU ise binlerce küçük çekirdeğiyle matris işlemleri, görüntü işleme ve derin öğrenme için avantaj sağlar
- AWS, P3/P4, P5/Inf1, G4 ve Amazon SageMaker gibi GPU çalışma ortamları sunar; p3.2xlarge saat başına $3.06, p5.48xlarge $98.32, g4dn.xlarge ise yaklaşık $0.526 düzeyindedir
- NVIDIA CUDA, geliştiricilerin GPU bellek ayırma, veri kopyalama, kernel çalıştırma ve derlemeye kadar uzanan paralel yürütme akışını doğrudan yönetebilmesini sağlar
- Dizi toplama, Mandelbrot üretimi ve kedi-köpek sınıflandırma CNN örnekleri, sıralı döngülerin GPU iş parçacıklarına nasıl bölündüğünü gösterir; Mandelbrot örneğinde süre CPU’da 4.07 saniyeden GPU’da 0.0046 saniyeye düşer
Neden yalnızca CPU bilgisi yetmiyor
- Birçok geliştirici öğrenme ve problem çözmeyi CPU merkezli yaklaşımla edindi, ancak CPU temelde sıralı mimariye dayanarak çalışır
- Geleneksel CPU, komutları doğrusal biçimde yürütür ve az sayıdaki güçlü çekirdeği tek iş parçacıklı performans için optimize eder
- Birden fazla işin aynı anda yürütülmesi gereken durumlarda, sıralı yürütme yaklaşımı nedeniyle işleri tek tek ele almanın maliyeti büyür
- Çoklu iş parçacığıyla performans artırılabilir, ancak CPU’nun temel tasarım felsefesi hâlâ sıralı yürütmeye daha yakındır
Yapay zeka modelleri ve paralel işleme
- Transformer gibi modern yapay zeka mimarileri, eğitim performansını artırmak için paralel işleme kullanır
- RNN sıralı çalışırken, GPT gibi Transformer’lar birçok kelimeyi aynı anda işleyebilir; bu da eğitim verimliliğini ve model kapasitesini artırır
- Paralel eğitim daha büyük modelleri mümkün kılar ve daha büyük modeller daha iyi çıktılar üretebilecek bir temel sağlar
- Paralellik yalnızca doğal dil işleme için değil, görüntü tanıma için de geçerlidir
- AlexNet, görüntünün farklı bölümlerini aynı anda işleyerek desenleri tanımlamaya örnektir
- CPU, tek iş parçacıklı performans merkezli tasarımı nedeniyle karmaşık yapay zeka modellerinin gerektirdiği yoğun paralel hesaplamayı verimli biçimde dağıtıp çalıştırmakta zorlanır
GPU darboğazları nasıl azaltır
- GPU, CPU’daki büyük ve güçlü çekirdekler yerine çok sayıda küçük ve özelleşmiş çekirdek kullanan bir yapıyla tasarlanmıştır
- Grafik işleme ve karmaşık matematiksel hesaplamalar gibi aynı tür işlemlerin büyük ölçekte tekrarlandığı iş yüklerinde GPU’nun paralelliği belirginleşir
- TensorFlow gibi derin öğrenme çerçeveleri, model eğitimi ve çıkarımı hızlandırmak için GPU performansından yararlanacak şekilde optimize edilmiştir
- Sinir ağı eğitimi çok sayıda matris işlemi içerir ve GPU, geniş çekirdek sayısıyla bu işlemleri paralelleştirmede güçlüdür
CPU ve GPU’nun rol farkı
-
CPU
- CPU, sıralı işleme odaklı tasarlanmıştır; tek bir komut akışını doğrusal olarak yürüten işlerde güçlüdür
- Genel amaçlı hesaplama, sistem işleri ve koşullu dallanma içeren karmaşık algoritmaları işlemek için uygundur
- Tüketici sınıfı CPU’lar genelde 2~16 çekirdek aralığında, görece az sayıda çekirdeğe sahiptir
- Her çekirdek kendi komut kümesini bağımsız biçimde işleyebilir
-
GPU
- GPU, paralel mimari ile tasarlanmıştır ve aynı anda çok sayıda alt işi yürütmede verimlidir
- Grafik işleme, karmaşık matematiksel hesaplamalar ve paralelleştirilebilen algoritmaların yürütülmesinde avantajlıdır
- İşleri daha küçük paralel birimlere bölerek birden çok işlemi aynı anda yürütür
- GPU çekirdekleri çoğu zaman binlerce adettir ve streaming multiprocessors (SMs) veya benzeri yapılardan oluşur
- Görüntü-video işleme, derin öğrenme ve bilimsel simülasyonlar gibi aynı anda çok veriyle çalışan işler için uygundur
AWS üzerinde seçilebilecek GPU ortamları
- AWS, makine öğrenmesi gibi işlerde kullanılabilecek çeşitli GPU instance seçenekleri sunar
-
Genel amaçlı GPU instance’ları
-
Çıkarım için optimize edilmiş instance’lar
- Çıkarım, eğitilmiş bir yapay zeka modeline gerçek zamanlı veri vererek tahmin üretme veya bir görevi çözme sürecidir
- P5 ve Inf1, düşük gecikme ve maliyet verimliliğinin önemli olduğu makine öğrenmesi çıkarımı için uyarlanmıştır
- p5.48xlarge saat başına $98.32’dır ve her biri 80GB belleğe sahip 8 adet NVIDIA H100 GPU, toplamda 640GB video belleği sunar
-
Grafik için optimize edilmiş instance’lar
- G4 instances, grafik yoğun işleri işlemek üzere tasarlanmıştır
- Video oyunu geliştiricileri G4 instance’larını kullanarak oyunlar için 3D grafik işleyebilir
- g4dn.xlarge saat başına $0.526’dır ve 16GB belleğe sahip 1 adet NVIDIA T4 GPU kullanır
-
Yönetilen makine öğrenmesi hizmeti
- Amazon SageMaker, makine öğrenmesi için yönetilen bir hizmettir ve P3, P4, P5 gibi GPU tabanlı instance’lara erişim sağlar
- SageMaker, altyapıyı doğrudan yönetmeden makine öğrenmesine başlamak isteyen kurumlar için uygundur
- Ayrı olarak Amazon SageMaker fiyatlandırma belgesi sunulmaktadır
NVIDIA CUDA’nın temel kullanımı
- CUDA, NVIDIA tarafından geliştirilen bir paralel hesaplama platformu ve programlama modelidir; GPU hızlandırıcıları kullanarak uygulamaların daha hızlı çalışmasını sağlar
- Örnekler, GPU bellek ayırma, veri kopyalama, kernel çalıştırma ve sonucun geri alınmasından oluşan CUDA geliştirme akışını gösterir
-
Kurulum akışı
- CUDA üzerinden base installer ve driver installer indirilir
- Ana dizindeki
.bashrcdosyasına şu ortam değişkenleri eklenirexport PATH="/usr/local/cuda-12.3/bin:$PATH"export LD_LIBRARY_PATH="/usr/local/cuda-12.3/lib64:$LD_LIBRARY_PATH"
- Aşağıdaki komutlar çalıştırılır
sudo apt-get install cuda-toolkitsudo apt-get install nvidia-gds
- Değişikliklerin uygulanması için sistem yeniden başlatılır
-
Yararlı doğrulama komutları
lspci | grep VGA: sistemdeki GPU’ları tanımlar ve listelernvidia-smi: NVIDIA GPU’ların kullanım oranı, sıcaklığı, bellek kullanımı gibi ayrıntılı bilgileri verirsudo lshw -C display: ekran kartı gibi görüntü denetleyicisi bilgilerini veririnxi -G: GPU ve ekran dahil grafik alt sistemine dair bilgileri gösterirsudo hwinfo --gfxcard: sistemdeki ekran kartı hakkında ayrıntılı bilgi almak için kullanılır
CUDA ile dizi toplamayı paralelleştirme
- Dizi toplama, GPU paralelleştirmesini anlatmak için uygun bir problemdir
- Örnek diziler
A = [1,2,3,4,5,6],B = [7,8,9,10,11,12]ve sonuçC = [8,10,12,14,16,18]şeklindedir - CPU yaklaşımı, dizi elemanlarını tek tek dolaşarak toplama yapar
- Veri miktarı arttıkça sıralı yaklaşımın süresi uzar; GPU ise
1+7,2+8,3+9gibi işlemleri aynı anda yapabilir - CUDA örneği
.cukernel dosyası kullanır__global__, GPU üzerinde çağrılan bir kernel fonksiyonunu ifade edervectorAdd,a,b,colmak üzere üç tamsayı işaretçisi alır ve vektör toplamayı gerçekleştirirthreadIdx.x, mevcut iş parçacığının indeksini alır- Her iş parçacığı, kendisine karşılık gelen elemanın toplamını
c[i]içine yazar
mainfonksiyonu GPU bellek ayırma, veri kopyalama, kernel çalıştırma ve sonuç kopyalama sırasıyla ilerlercudaMallocilecudaA,cudaB,cudaCbelleği GPU üzerinde ayrılırcudaMemcpyileaveb, host’tan GPU’ya kopyalanırvectorAdd <<<1, sizeof(a) / sizeof(a[0])>>>ile kernel çalıştırılır- Sonuç vektörü
cudaC, GPU’dan host’a geri kopyalanır
- Derleme ve çalıştırma için
nvcckomutu kullanılır - Tam kod sunulmaktadır
Python’da görüntü üretiminde GPU kullanımı
- Mandelbrot kümesi üretimi, belirli bir denklemde sayıların davranışına göre karmaşık görsel desenler oluşturan ve yoğun kaynak gerektiren bir işlemdir
- CPU tabanlı Python örneği her pikseli dolaşarak Mandelbrot değerini hesaplar ve 1024×1536 boyutlu bir görüntüyü üretmek 4.07 saniye sürer
- GPU hızlandırmalı sürüm Numba library kullanır
@jitdekoratörü, Python kodunu makine koduna dönüştüren Just-In-Time derleme yaparcuda.jitilemandel_gpuoluşturulur vedevice=Trueverilerek GPU üzerinde çalışması sağlanırmandel_kernel, CUDA GPU üzerinde çalışır ve Mandelbrot üretim işini GPU iş parçacıklarına dağıtır
create_fractal_gpu, GPU bellek ayırma, iş parçacığı-blok ayarı, GPU kernel çalıştırma, senkronizasyon ve sonuç kopyalama işlemlerini yaparthreadsperblock = (16, 16)kullanılırcuda.synchronize()ile GPU işinin tamamlanması beklenird_image.copy_to_host(image)ile sonuç CPU tarafına kopyalanır
- GPU çalışma süresi 0.0046 saniye’dir; bu da CPU tabanlı koda göre çok daha hızlıdır
- Tam kod sunulmaktadır
GPU ile kedi-köpek sınıflandırma sinir ağı eğitimi
- GPU’nun yapay zekada nasıl kullanıldığını göstermek için kedi ve köpekleri ayıran bir sinir ağı örneği kullanılır
- Ön hazırlık olarak CUDA ve TensorFlow gerekir
- TensorFlow,
pip install tensorflow[and-cuda]ile kurulabilir - Veri kümesi olarak Kaggle Dogs vs. Cats kullanılır
- İndirdikten sonra kedi ve köpek görselleri eğitim klasöründe farklı alt klasörlere ayrılır
- TensorFlow,
- Model, evrişimsel sinir ağı (CNN) kullanır
- pandas ve numpy veri işleme için kullanılır
Sequential, sinir ağı katmanlarını doğrusal biçimde dizmek için kullanılırConvolution2D,MaxPooling2D,Dense,FlattenCNN’i oluşturan katmanlardırImageDataGenerator, eğitim sırasında gerçek zamanlı veri artırma için kullanılır
- Eğitim verisi
ImageDataGeneratorile yüklenir- Eğitim verisine
rescale=1./255,shear_range=0.2,zoom_range=0.2,horizontal_flip=Trueuygulanır - Girdi görüntüleri
(64, 64)boyutunda, batch size 32 ve ikili sınıflandırma modunda ayarlanır
- Eğitim verisine
- CNN yapısı evrişim, max pooling, flatten, Dense katmanları ve sigmoid çıkıştan oluşur
- Model,
adamoptimizer’ı,binary_crossentropyloss’u veaccuracymetriği ile derlenir - Eğitim
epochs=25,validation_steps=2000ile yürütülür veclassifier.save('trained_model.h5')ile.h5dosyasına kaydedilir - Çıkarım kodu
trained_model.h5dosyasını yükler, görüntüyü(64, 64)boyutuna dönüştürür ve tahmin değeri 0.5 veya üzerindeysedog, aksi haldecatçıktısı verir - Tam kod sunulmaktadır
GPU kullanımının kapsamı
- Yapay zeka çağında GPU yeteneklerini görmezden gelmek zorlaştı ve geliştiricilerin GPU kapasitesini daha iyi anlaması gerekiyor
- Sıralı algoritmalardan paralelleştirilmiş algoritmalara geçişle birlikte GPU, karmaşık hesaplamaları hızlandıran bir araca dönüşüyor
- GPU’nun paralel işleme yeteneği, özellikle yapay zeka ve makine öğrenmesi işlerinde büyük veri kümeleri ile karmaşık sinir ağı mimarilerini ele almada avantaj sağlar
- GPU, geleneksel makine öğrenmesi alanının ötesinde bilimsel araştırma, simülasyon ve veri yoğun işlerde de kullanılır
- Paralel işleme yeteneği; ilaç keşfi, iklim modelleme ve finansal simülasyon gibi farklı alanlardaki problemlerin çözümünde değerlendirilir
1 yorum
Hacker News görüşleri
Bu yazıdaki kod hatalı. CUDA çekirdeği hiç çağrılmıyor: https://github.com/RijulTP/GPUToolkit/blob/f17fec12e008d0d37...
Mandelbrot kümesini JIT derlenmiş kodla “hesaplama” süresinin %90'ı, gerçek hesaplama yerine fonksiyon derlemeye gidiyor
CUDA'yı düzgün öğrenmek istiyorsanız matris çarpımı uygulamak iyi bir alıştırmadır; bakmaya değer eğitimler de şunlardır: https://cnugteren.github.io/tutorial/pages/page1.html ve https://siboehm.com/articles/22/CUDA-MMM
32 bit kayan noktalı X ve Y vektörleri ile A skalerini alır, her X[i] değerini A ile çarpıp sonra Y[i]'ye ekler: https://developer.nvidia.com/blog/six-ways-saxpy/
“Her geliştiricinin bilmesi gerekir” deniyor ama aslında bu, daha çok AI'da GPU'nun nasıl kullanıldığı üzerine bir yazı. Geliştiricilerin çoğu AI geliştiricisi değil; AI ile doğrudan etkileşime de girmiyorlar, GPU'yu doğrudan da kullanmıyorlar
Ayrıca GPU'ların var olmasının temel nedeni olan 3D grafikler neredeyse hiç ele alınmıyor
Temel bilgiye sahip olursanız yöneticilerin pazarladığı “AI” söylemlerini de daha iyi anlarsınız
“Yakın alanlara gerek yok” tavrı okulda sık gördüğüm bir şeydi. Sistem yönetimi tarafında arkadaşlarım programlama bilmeye gerek olmadığını söylerdi ama script yazmak gerekiyordu; yazılım geliştirme okulunda ise ağ bilmeye gerek olmadığı söylenirdi ama birkaç yıl sonra iş ilanlarında DevOps her yerde görünmeye başladı
Yazı kabaca 1500 kelimeyse, ders çalışır gibi okusanız yaklaşık 12 dakika sürer; kod örneklerini çalıştırarak 2 saat harcamak bile büyük bir yatırım sayılmaz. Tabii bunun için o yazının iyi bir giriş metni olması gerekir
curlile JSON isteği göndermeyi bilmemesiyle dostça dalga geçtiğimi hatırlıyorum. Hâlâ gömülü sistem geliştiricisiyim ama sonrasında backend, frontend ve altyapı hakkında çok şey öğrendim; önümüzdeki birkaç yılda sektör genelinde AI konusunda benzer bir durumun yaşanması da oldukça olası görünüyorAI'da Python'ın baskın olmasının nedeni, Python-C ilişkisi ile CPU-GPU ilişkisi arasında bir benzerlik olması olabilir
GPU'nun performansı çok iyi ama doğrudan onun için kod yazmak zor olduğu için insanlar GPU'yu PyTorch gibi yüksek seviyeli API çağrıları üzerinden kullanıyor
C de yüksek performanslı ama kodlaması zor; bu yüzden Python, C'nin üzerinde bir soyutlama katmanı olarak kullanılıyor
İnsanların GPU'ları bu kadar derinlemesine anlaması gerekip gerekmediği net değil. Özellikle AI eğitimi ya da operasyonlarının derinine inmeyenler için bu daha da geçerli; Moore yasasının sona ermesi ve hız artışının ana yolunun çoklu iş parçacıklılığı olması durumunda, paralel programlama paradigmasına uygun yeni dillerin ortaya çıkması muhtemel. Mojo da bunun başlangıç noktası gibi görünüyor
Basit yinelemeli hesaplamalardan başlayıp, arka planda tüm komutların akıllıca bütün CPU çekirdeklerini paralel kullanması ve mümkün olan işleri GPU'ya aktarması gibi bir tasarım
Böyle bir deneme daha önce yapıldı mı, hatta ilkesel olarak mümkün mü diye merak ediyorum
“CPU birden fazla işle karşılaşınca kaynaklarını her işi tek tek işleyecek şekilde dağıtır” açıklaması fazla basit. CPU'nun hâlâ o kadar basit olmasını isterdim bile
Yazının programlama modeline odaklanması anlaşılır ama performans açısından “CPU komutları sıralı yürütür” demek temelden yanlış. Pipeline'lar komutları paralel yürütür, SIMD vardır ve birden fazla çekirdek aynı problem üzerinde birlikte çalışabilir
Asıl büyük fark, CPU'nun tek bir iş parçacığını verimli çalıştırmak için kontrol akışını işlemeye çok daha fazla silikon ve güç ayırması; GPU'nun ise bu kaynakları daha fazla hesaplama birimine ayırıp çok sayıda iş parçacığını çalıştırarak kontrol akışı ve bellek gecikmesini gizlemesidir
CPU’nun seri kod için, GPU’nun ise paralel kod için iyi olduğu sözü bir ölçüde doğru, ancak oldukça kaba bir yaklaşık. Birkaç yüz watt düzeyinde benzer bir güç bütçesi varsayılırsa, CPU’da hiper iş parçacıkları da dahil olmak üzere bağımsız işleri tek tek çalıştıran yaklaşık 100 “çekirdek” bulunur ve dallanma tahmini ile boru hattı sayesinde bellek gecikmesi gizlenir
GPU’da ise yaklaşık 100 “hesaplama birimi” vardır; her birim yaklaşık 80 bağımsız işi dönüşümlü yürütür ve diğer işin bir sonraki komutunu çalıştırarak bellek gecikmesini gizler
Terminoloji oldukça kafa karıştırıcıdır; CPU’da 256 bit genişliğinde vektör birimleri, GPU’da ise 2048 bit genişliğinde vektör birimleri bulunma olasılığı yüksektir, ancak biraz uzaktan bakınca iki mimari epey benzer görünür
Adı da Xeon Chi olabilirdi
Çoğu programlama dili CPU gibi sıralı işlemeye uygun tasarlanmışken, Erlang/Elixir’nin GPU gibi paralelliğe uygun tasarlandığı düşünülürse Nx / Axon’un yükselip yükselmeyeceğini merak ediyorum: https://github.com/elixir-nx/
Bir satın alma rehberine ihtiyaç var. En az ne kadar harcamak gerektiğini ve bütçe aralıklarına göre en iyi seçimin ne olduğunu bilmek istiyorum. Sorun şu ki bu bilgi zaman zaman değişiyor ve sürekli güncel tutulan bir kaynak olup olmadığını bilmiyorum
https://colab.google/
https://www.kaggle.com/docs/notebooks
https://www.paperspace.com/gradient/free-gpu
Yine “her geliştiricinin bilmesi gereken” türü clickbait yazılara mı döndük
Karmaşıklığı doğrudan ele almayı seviyorum ve bilgisayar donanımı gibi alanlarda hem nicel yöntemleri hem de nitel ayrıntıları belli ölçüde bildiğim için, bir alanın ayrıntılarını düzgünce anlatan yazıları memnuniyetle karşılıyorum
Örneğin “What every programmer should know about memory” gerçekten her programcının bilmesi gereken bir şey mi, bu ayrı mesele; ama iyi bir programcının bilgisayarın gerçekte nasıl çalıştığına dair bir sezgisi olmalı. O yazıdan alınacak temel nokta olan yerellik, hızlı, takip etmesi kolay ve probleme iyi uyan iyi kodda sık sık doğal olarak ortaya çıkar
Güzel bir yazı, ancak AWS P5 instance P4d ve P4de ile birlikte açıkça çıkarımdan çok eğitime uygundur. Çıkarım için daha uygun instance türleri, sırasıyla T4 ve A10G GPU kullanan G4dn ve G5’tir
GPU programlama konusunda neredeyse tamamen yeniyim ama bu yazıyı keyifle okudum. Basit bir “köpek mi kedi mi” sinir ağını bu kadar kolay eğitebilecek kadar ilerlenmiş olması şaşırtıcı