Dalam artikel ini, kita akan menyelidiki pengaturcaraan GPU dengan Python. Dengan menggunakan kemudahan Python, anda dapat membuka kekuatan pengkomputeran luar biasa GPU kad video anda (unit pemprosesan grafik). Dalam contoh ini, kami akan bekerjasama dengan perpustakaan CUDA NVIDIA.
Keperluan
Untuk latihan ini, anda memerlukan mesin fizikal dengan Linux dan GPU berasaskan NVIDIA, atau melancarkan contoh berasaskan GPU di Amazon Web Services. Sama ada mesti berfungsi dengan baik, tetapi jika anda memilih untuk menggunakan mesin fizikal, anda perlu memastikan bahawa pemacu proprietari NVIDIA dipasang, lihat arahan: https: // linuxhint.com / install-nvidia-driver-linux
Anda juga perlu memasang CUDA Toolkit. Contoh ini menggunakan Ubuntu 16.04 LTS secara khusus, tetapi terdapat muat turun yang tersedia untuk sebilangan besar pengedaran Linux utama di URL berikut: https: // pembangun.nvidia.com / muat turun cuda
Saya lebih suka .muat turun berdasarkan deb, dan contoh-contoh ini akan menganggap anda memilih laluan tersebut. Fail yang anda muat turun adalah .pakej deb tetapi tidak mempunyai .sambungan deb, jadi menamakan semula ia menjadi .deb di akhir membantu dia. Kemudian anda memasangnya dengan:
sudo dpkg -i pakej-nama.deb
Sekiranya anda diminta memasang kunci GPG, ikuti arahan yang diberikan untuk melakukannya.
Sekarang anda perlu memasang pakej cuda itu sendiri. Untuk melakukannya, jalankan:
sudo apt-get update sudo apt-get install cuda -y
Bahagian ini memerlukan sedikit masa, jadi anda mungkin ingin mengambil secawan kopi. Setelah selesai, saya cadangkan reboot untuk memastikan semua modul dimuat semula dengan betul.
Seterusnya, anda memerlukan pengedaran Anaconda Python. Anda boleh memuat turunnya di sini: https: // www.anaconda.com / muat turun / # linux
Dapatkan versi 64-bit dan pasangkan seperti ini:
sh Anaconda *.sh
(bintang dalam arahan di atas akan memastikan bahawa arahan itu dijalankan tanpa mengira versi kecil)
Lokasi pemasangan lalai semestinya baik, dan dalam tutorial ini, kami akan menggunakannya. Secara lalai, ia dipasang ke ~ / anaconda3
Pada akhir pemasangan, anda akan diminta untuk memutuskan sama ada anda ingin menambahkan Anaconda ke jalan anda. Jawab ya di sini untuk memudahkan menjalankan perintah yang diperlukan. Untuk memastikan perubahan ini berlaku, setelah pemasang selesai sepenuhnya, log keluar kemudian log masuk semula ke akaun anda.
Maklumat lanjut mengenai Memasang Anaconda: https: // linuxhint.com / pasang-anaconda-python-on-ubuntu /
Akhirnya kita perlu memasang Numba. Numba menggunakan penyusun LLVM untuk menyusun kod Python ke mesin. Ini bukan sahaja dapat meningkatkan prestasi kod Python biasa tetapi juga menyediakan gam yang diperlukan untuk menghantar arahan ke GPU dalam bentuk binari. Untuk melakukan ini, jalankan:
conda pasang numba
Batasan dan Faedah Pengaturcaraan GPU
Sangat menggoda untuk berfikir bahawa kita dapat mengubah mana-mana program Python menjadi program berasaskan GPU, dengan cepat meningkatkan prestasinya. Walau bagaimanapun, GPU pada kad video berfungsi jauh berbeza daripada CPU standard di komputer.
CPU menangani banyak input dan output yang berbeza dan mempunyai pelbagai petunjuk untuk menangani situasi ini. Mereka juga bertanggung jawab untuk mengakses memori, menangani bus sistem, menangani cincin perlindungan, menyegmentasi, dan fungsi input / output. Mereka adalah multitasker ekstrem tanpa fokus khusus.
Sebaliknya, GPU dibina untuk memproses fungsi mudah dengan kelajuan yang cepat. Untuk mencapai ini, mereka mengharapkan keadaan input dan output yang lebih seragam. Dengan mengkhususkan diri dalam fungsi skalar. Fungsi skalar memerlukan satu atau lebih input tetapi hanya mengembalikan satu output. Nilai-nilai ini mestilah jenis yang ditentukan sebelumnya oleh numpy.
Contoh Kod
Dalam contoh ini, kami akan membuat fungsi mudah yang mengambil senarai nilai, menambahkannya bersama, dan mengembalikan jumlahnya. Untuk menunjukkan kehebatan GPU, kita akan menjalankan salah satu fungsi ini pada CPU dan satu pada GPU dan memaparkan waktu. Kod yang didokumentasikan ada di bawah:
import numpy sebagai np dari timeit import default_timer sebagai timer dari numba import vectorize # Ini semestinya bernilai tinggi. Pada mesin ujian saya, ini memerlukan # 33 saat untuk berjalan melalui CPU dan lebih dari 3 saat di GPU. NUM_ELEMENTS = 100000000 # Ini adalah versi CPU. def vector_add_cpu (a, b): c = np.sifar (NUM_ELEMENTS, dtype = np.float32) untuk i dalam jarak (NUM_ELEMENTS): c [i] = a [i] + b [i] return c # Ini adalah versi GPU. Perhatikan penghias @vectorize. Ini memberitahu # numba untuk mengubahnya menjadi fungsi vektor GPU. @vectorize (["float32 (float32, float32)"], target = "cuda") def vector_add_gpu (a, b): kembalikan a + b; def utama (): a_source = np.satu (NUM_ELEMENTS, dtype = np.float32) b_source = np.satu (NUM_ELEMENTS, dtype = np.float32) # Waktu fungsi CPU bermula = pemasa () vector_add_cpu (a_source, b_source) vector_add_cpu_time = timer () - start # Time fungsi GPU bermula = pemasa () vector_add_gpu (a_source, b_source) vector_add_gpu_time = pemasa () - mulai # Laporan kali cetak ("Fungsi CPU mengambil% f saat.Cetakan "% vector_add_cpu_time) (" Fungsi GPU mengambil% f saat."% vector_add_gpu_time) kembali 0 jika __name__ ==" __main__ ": main ()
Untuk menjalankan contoh, taip:
python gpu-contoh.py
CATATAN: Jika anda menghadapi masalah semasa menjalankan program anda, cuba gunakan "conda install accelerate".
Seperti yang anda lihat, versi CPU berjalan lebih perlahan.
Sekiranya tidak, maka lelaran anda terlalu kecil. Laraskan NUM_ELEMENTS ke nilai yang lebih besar (pada saya, tanda pulang modal nampaknya sekitar 100 juta). Ini kerana penyediaan GPU memerlukan sedikit masa tetapi ketara, jadi untuk menjadikan operasi itu sepadan, beban kerja yang lebih tinggi diperlukan. Sebaik sahaja anda menaikkannya di atas ambang untuk mesin anda, anda akan melihat peningkatan prestasi yang ketara dari versi GPU berbanding versi CPU.
Kesimpulannya
Saya harap anda menikmati pengenalan asas kami dalam Pengaturcaraan GPU dengan Python. Walaupun contoh di atas adalah remeh, ia menyediakan kerangka yang anda perlukan untuk mengembangkan idea anda dengan lebih memanfaatkan kekuatan GPU anda.