"Enter"a basıp içeriğe geçin

Python ile GPU Programlama – Linux Önerileri

Bu yazıda, Python kullanarak GPU programlamayı inceleyeceğiz. Python’un kolaylığıyla, video kartınızın GPU’sunun (Grafik İşleme Birimi) inanılmaz bilgi işlem gücünü açığa çıkarabilirsiniz. Bu örnekte, NVIDIA’nın CUDA kitaplığı ile çalışacağız.

Gereksinimler

Bu alıştırma için ya Linux ve NVIDIA tabanlı bir GPU ile fiziksel bir makineye ihtiyacınız olacak ya da Amazon Web Services üzerinde GPU tabanlı bir örnek çalıştıracaksınız. Her ikisi de iyi çalışmalıdır, ancak fiziksel bir cihaz kullanmayı seçerseniz, NVIDIA’ya özel sürücülerin kurulu olduğundan emin olmanız gerekir, talimatlara bakın:

Ayrıca CUDA Toolkit’i kurmanız gerekecektir. Bu örnek özellikle Ubuntu 16.04 LTS’yi kullanır, ancak çoğu büyük Linux dağıtımı için indirmeler aşağıdaki URL’de mevcuttur:

Ben .deb tabanlı indirmeyi tercih ediyorum ve bu örnekler sizin o yolu seçtiğinizi varsayacak. İndirdiğiniz dosya bir .deb paketidir, ancak .deb uzantısı yoktur, bu nedenle sonunda .deb olarak yeniden adlandırmak yardımcı olur. Ardından şununla yüklersiniz:

sudo dpkg -i paket-adı.deb

Bir GPG anahtarı yüklemeniz istenirse, lütfen bunu yapmak için verilen talimatları izleyin.

Şimdi cuda paketinin kendisini kurmanız gerekecek. Bunu yapmak için şunu çalıştırın:

sudo apt-get güncellemesi. sudo apt-get kurulumu cuda -y. 

Bu kısım biraz uzun sürebilir, bu yüzden bir fincan kahve içmek isteyebilirsiniz. İşiniz bittiğinde, tüm modüllerin düzgün bir şekilde yeniden yüklendiğinden emin olmak için yeniden başlatmanızı öneririm.

Ardından, Anaconda Python dağıtımına ihtiyacınız olacak. Buradan indirebilirsiniz:

64 bit sürümünü edinin ve aşağıdaki şekilde kurun:

sh anakonda *. sh

(yukarıdaki komuttaki yıldız işareti, küçük sürümden bağımsız olarak komutun çalışmasına neden olur)

Varsayılan yükleme konumu iyi olmalı ve bu eğitim için bunu kullanacağız. Varsayılan olarak ~/anaconda3’e kurulur.

Kurulumun sonunda Anaconda’yı yolunuza eklemek isteyip istemediğiniz sorulacaktır. Gerekli komutları çalıştırmayı kolaylaştırmak için burada evet olarak yanıtlayın. Bu değişikliğin yapılmasına izin vermek için oturumu kapatın ve yükleyici tamamen tamamlandıktan sonra hesabınızda tekrar oturum açın.

Anaconda’yı yükleme hakkında daha fazla bilgi:

Son olarak Numba’yı kurmamız gerekecek. Numba, Python’u makine koduna çevirmek için LLVM yorumlayıcısını kullanır. Bu, yalnızca normal Python kodunun performansını iyileştirmekle kalmaz, aynı zamanda talimatları GPU’ya ikili biçimde göndermek için gerekli yapıştırıcıyı da sağlar. Bunu yapmak için şunu çalıştırın:

conda kurulum numarası

GPU Programlamanın Sınırlamaları ve Faydaları

Herhangi bir Python programını GPU tabanlı bir programa dönüştürebileceğimizi ve performansını büyük ölçüde hızlandırabileceğimizi düşünmek cazip geliyor. Bununla birlikte, bir video kartındaki grafik işlem birimi, bir bilgisayardaki standart CPU’dan önemli ölçüde farklı çalışır.

CPU’lar birçok farklı giriş ve çıkışı yönetir ve bu durumların üstesinden gelmek için çeşitli talimatlara sahiptir. Ayrıca belleğe erişimden, sistem veri yolunun işlenmesinden, döngü korumasının, parçalanmanın ve G/Ç işlevselliğinin yürütülmesinden de sorumludurlar. Özellikle odaklanmasalar da çok görevlidirler.

Öte yandan, GPU’lar basit işleri inanılmaz bir hızla halletmek için tasarlanmıştır. Bunu başarmak için daha tutarlı bir girdi ve çıktı durumu beklerler. Sayısal fonksiyonlarda uzmanlaşarak. Bir skaler fonksiyon bir veya daha fazla girdi alır ancak yalnızca bir çıktı verir. Bu değerler numpy tarafından öntanımlı tiplerde olmalıdır.

örnek simgeler

Bu örnek için, bir değerler listesi alan, bunları toplayan ve toplamı döndüren basit bir işlev yaratacağız. GPU’nun gücünü göstermek için, bu işlevlerden birini CPU’da, birini de GPU’da çalıştıracağız ve süreleri göstereceğiz. Belgelenmiş kod aşağıdadır:

numpy'yi np olarak içe aktarın. timeit'ten default_timer'ı zamanlayıcı olarak içe aktarın. from number import vectorize # Bu, oldukça yüksek bir değer olmalıdır. Test makinemde bu sürdü. # CPU üzerinden çalıştırmak için 33 saniye ve GPU'da 3 saniyeden biraz fazla. NUM_ELEMENTS = 100000000 # Bu, CPU sürümüdür. def vector_add_cpu (a, b): c = np.zeros (NUM_ELEMENTS, dtype=np.float32) i aralığında (NUM_ELEMENTS): c[i] = a[i] + b[i] return c # Bu GPU sürümü. @vectorize dekoratörüne dikkat edin. Bu anlatır. # bunu bir GPU vektörlü fonksiyona dönüştürmek için numara. @vectorize(["float32(float32, float32)"], target="cuda") def vector_add_gpu (a, b): a + b döndür; def main(): a_source = np.ones (NUM_ELEMENTS, dtype=np.float32) b_source = np.ones (NUM_ELEMENTS, dtype=np.float32) # CPU işlevinin başlama zamanı = timer() vector_add_cpu (a_source, b_source) vector_add_cpu_time = timer() - start # GPU işlevinin başlama zamanı = timer() vector_add_gpu (a_source, b_source) vector_add_gpu_time = timer() - başlatma # Rapor süreleri print("CPU işlevi %f saniye sürdü." % vector_add_cpu_time) print("GPU işlevi %f saniye sürdü." % vector_add_gpu_time) __name__ == "__main__" ise 0 döndürür: ana()

Örneği çalıştırmak için şunu yazın:

python gpu-example.py

Not: Programı çalıştırmakta sorun yaşıyorsanız, “conda install boost” kullanmayı deneyin.

Gördüğünüz gibi, CPU sürümü çok yavaş çalışıyor.

Değilse, kopyalarınız çok küçüktür. NUM_ELEMENTS’i daha büyük bir değere ayarlayın (benimkinin başabaş noktası yaklaşık 100 milyon gibi görünüyor). Bunun nedeni, GPU’nun kurulmasının kısa ama fark edilebilir bir süre almasıdır, dolayısıyla işlemin buna değmesi için daha büyük bir iş yükü gerekir. Donanım eşiğinizi aştığınızda, GPU sürümünde CPU sürümüne göre önemli performans iyileştirmeleri fark edeceksiniz.

çözüm

Python ile GPU programlamaya yönelik temel tanıtımımızı umarım beğenmişsinizdir. Yukarıdaki örnek önemsiz olsa da, GPU’nuzun gücünü kullanarak fikirlerinizi geliştirmek için ihtiyaç duyduğunuz çerçeveyi sağlar.

Linux Kaynak LLC, [e-posta korumalı]
1210 Kelly Park Çevresi, Morgan Hill, CA 95037

Diğer gönderilerimize göz at

[wpcin-random-posts]

İlk Yorumu Siz Yapın

Bir yanıt yazın

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