Ulasan: Nvidia's Rapids membawa analisis Python ke GPU

Membina model pembelajaran mesin adalah proses berulang. Selalunya hafalan dan rutin, ini adalah permainan "terpantas melalui kemenangan kitaran," kerana semakin cepat anda dapat berulang, semakin mudah untuk meneroka teori baru dan mendapatkan jawapan yang baik. Ini adalah salah satu sebab penggunaan praktikal AI syarikat pada masa ini didominasi oleh perusahaan terbesar, yang dapat membuang sumber daya yang besar pada masalah ini.

Rapids adalah payung untuk beberapa projek sumber terbuka, diinkubasi oleh Nvidia, yang meletakkan keseluruhan saluran pemprosesan pada GPU, menghilangkan pemindahan data terikat I / O, sementara juga meningkatkan kecepatan setiap langkah individu. Ini juga menyediakan format umum untuk data, meringankan beban pertukaran data antara sistem yang berbeza. Di peringkat pengguna, Rapids meniru API Python untuk memudahkan peralihan untuk pangkalan pengguna itu.

Buku Masakan Tidyverse

Senibina ekosistem Rapids

Projek Rapids bertujuan untuk meniru, sebahagian besarnya, pembelajaran mesin dan API analisis data Python, tetapi untuk GPU dan bukan CPU. Ini bermakna bahawa pembangun Python sudah memiliki semua yang mereka perlukan untuk menjalankan GPU, tanpa perlu mempelajari perincian tahap rendah pengaturcaraan CUDA dan operasi selari. Pythonistas dapat mengembangkan kod pada mesin yang tidak menggunakan GPU, kemudian, dengan beberapa tweak, jalankan pada semua GPU yang tersedia untuknya.

Kit alat Nvidia CUDA menyediakan primitif peringkat rendah untuk perpustakaan matematik, algoritma selari, dan analisis grafik. Inti seni bina adalah kerangka data GPU, berdasarkan Apache Arrow, yang menyediakan struktur data kolumnar, dalam memori yang memprogram bahasa agnostik. Pengguna berinteraksi dengan kerangka data GPU melalui cuDF dan API seperti Pandas. Dask, perpustakaan Python untuk pengkomputeran selari, meniru API Python hulu dan bekerjasama dengan perpustakaan CUDA untuk pengiraan selari. Fikirkan Dask sebagai Spark untuk Python.

RAPID

Tiga projek utama, cuDF, cuML dan cuGraph, dibangunkan secara bebas, tetapi dirancang untuk bekerjasama dengan lancar. Jambatan ke ekosistem Python yang lebih luas juga sedang dikembangkan sebagai sebahagian daripada projek ini.

Pemasangan Rapids

Pemasangan melalui Anaconda pada mesin Linux di AWS kebanyakannya mudah, tanpa sedikit masalah kerana perubahan kebergantungan dalam versi 0.11. Memasang Pustaka C / C ++ untuk menggunakan libcudf tidak begitu mudah, dan saya akan mengesyorkan agar tetap mengikuti proses pemasangan API Python dan Conda. Rapids termasuk buku nota Jupyter, juga tersedia di Colab percuma Google, yang menjadikan permulaannya mudah. Saya menggunakan notebook Jupyter versi 0.10 untuk menjalankan kod di Google Colab, yang merangkumi GPU Nvidia Tesla T4.

Rangka data GPU Rapids

Inti aliran kerja sains data adalah kerangka data. Di sinilah kejuruteraan ciri berlaku, dan di mana sebahagian besar masa dihabiskan, kerana para saintis data menyusun data kotor. cuDF adalah projek Rapids untuk kerangka data berasaskan GPU, seperti Pandas. CuDF yang mendasari adalah libcudf, sebuah perpustakaan C ++ yang menerapkan primitif peringkat rendah untuk mengimport data Apache Arrow, melakukan matematik elemen-elemen pada tatasusunan, dan melaksanakan operasi semacam, gabung, kelompokkan, pengurangan, dan operasi lain pada matriks memori dalam-GPU. Struktur data asas libcudf adalah GPU DataFrame (GDF), yang pada gilirannya dimodelkan di penyimpanan data kolumnar Apache Arrow.

RAPID

Perpustakaan Rapids Python menghadirkan pengguna dengan antara muka tahap yang lebih tinggi yang menyerupai kerangka data, seperti yang ada di Pandas. Dalam banyak kes, kod Pandas tidak berubah pada cuDF. Sekiranya ini tidak berlaku, biasanya hanya perubahan kecil yang diperlukan.

Fungsi yang ditentukan pengguna dalam cuDF

Setelah melewati manipulasi data asas, kadang-kadang perlu memproses baris dan lajur dengan fungsi yang ditentukan pengguna (UDF). cuDF menyediakan API gaya PyData untuk menulis kod untuk memproses struktur data yang lebih jelas seperti tatasusunan, siri, dan tingkap bergerak. Pada masa ini hanya jenis numerik dan Boolean yang disokong. UDF disusun menggunakan penyusun Numba JIT, yang menggunakan subset LLVM untuk menyusun fungsi angka ke kod mesin CUDA. Ini menghasilkan masa berjalan pada GPU yang jauh lebih pantas.

Rentetan dalam cuDF

Walaupun GPU sangat bagus untuk memproses vektor apungan dengan cepat, mereka biasanya tidak digunakan untuk memproses data rentetan, dan kenyataannya adalah bahawa kebanyakan data datang kepada kami dalam bentuk rentetan. cuStrings adalah perpustakaan manipulasi rentetan GPU untuk pemisahan, penerapan regex, penggabungan, penggantian token, dan lain-lain dalam tatasusunan rentetan. Seperti fungsi cuDF lain, ia dilaksanakan sebagai perpustakaan C / C ++ (libnvStrings) dan dibungkus oleh lapisan Python yang dirancang untuk meniru Pandas. Walaupun jenis data rentetan tidak dioptimumkan untuk pelaksanaan pada GPU, pelaksanaan kode selari harus memberikan percepatan manipulasi tali berdasarkan CPU.

Mendapatkan data masuk atau keluar dari cuDF

Dataframe I / O dikendalikan oleh perpustakaan khusus, cuIO. Semua format yang paling kerap ditemui disokong, termasuk Arrow, ORC, Parquet, HDF5, dan CSV. Sekiranya anda cukup bernasib baik kerana menggunakan perkakasan DGX-2, anda boleh menggunakan integrasi Penyimpanan Langsung GPU untuk memindahkan data secara langsung dari storan berkelajuan tinggi ke GPU tanpa melibatkan CPU. Pengguna fana masih akan menghargai kepantasan yang diberikan oleh GPU ketika menyahmampatkan set data yang besar, dan integrasi yang ketat dengan ekosistem Python.

Penyimpanan Langsung GPU kini dalam alpha, dan apabila dilepaskan akan tersedia di kebanyakan GPU Tesla. Anda boleh membuat bingkai data GPU dari tatasusunan NumPy, Pandas DataFrames, dan tabel PyArrow dengan hanya satu baris kod. Projek lain dapat bertukar data melalui __cuda_array_interface__perpustakaan yang berada dalam ekosistem Numba. DLPack untuk perpustakaan rangkaian neural juga merupakan antara muka yang disokong.

Mungkin kelemahan terbesar dalam menggunakan cuDF adalah kurangnya interoperabiliti di luar Python. Saya rasa fokus pada asas kuat API C / C ++, seperti yang dilakukan Arrow, akan memungkinkan ekosistem yang lebih luas dan memberi manfaat kepada projek ini secara keseluruhan.

CuML Rapids

Tujuan yang dinyatakan cuML adalah "Python's Scikit-learning yang dikuasakan oleh GPU." Secara teori ini bermaksud anda hanya perlu mengubah penyataan import anda dan mungkin menyesuaikan beberapa parameter untuk memperhitungkan perbezaan dalam menjalankan CPU, di mana kadang-kadang pendekatan brute force lebih baik. Manfaat memiliki Scikit-learning berasaskan GPU sukar untuk diremehkan. Peningkatannya sangat besar, dan penganalisis data boleh berkali-kali lebih produktif. API C ++ tidak cukup untuk penggunaan yang luas di luar pengikatan Pythonnya, tetapi ini diharapkan akan bertambah baik.

cuML juga merangkumi API untuk membantu penalaan hyperparameter melalui Dask, sebuah perpustakaan untuk menskalakan Python melintasi pelbagai nod. Banyak algoritma pembelajaran mesin dapat dibuat secara berkesan selari, dan cuML secara aktif mengembangkan algoritma multi-GPU dan multi-nod, multi-GPU.

RAPID

Rapid 'cuGraph

cuGraph adalah anggota ketiga ekosistem Rapids, dan seperti yang lain, cuGraph digabungkan sepenuhnya dengan cuDF dan cuML. Ia menawarkan pilihan algoritma grafik, primitif, dan utiliti yang baik, semuanya dengan prestasi dipercepat GPU. Pemilihan API di cuGraph agak lebih luas daripada di bahagian lain Rapids, dengan NetworkX, Pregel, GraphBLAS, dan GQL (Graph Query Language) tersedia.

RAPID

cuGraph lebih menyerupai toolkit daripada cuML. Teknologi grafik adalah ruang bergerak pantas di akademik dan industri. Oleh itu, dengan reka bentuk, cuGraph memberi pemaju akses ke lapisan C ++ dan grafik primitif, mendorong pihak ketiga untuk mengembangkan produk menggunakan cuGraph. Beberapa universiti telah memberikan sumbangan, dan projek dari Texas A&M (GraphBLAS), Georgia Tech (Hornet), dan UC Davis (Gunrock) telah "diproduksi" dan dimasukkan di bawah payung cuGraph. Setiap projek menyediakan satu set kemampuan yang berbeza, semua dipercepat GPU, dan semuanya disokong oleh kerangka data cuDF yang sama.

NetworkX adalah Python API yang disasarkan oleh pasukan Rapids untuk antaramuka asalnya. Terdapat sebilangan algoritma yang tersedia melalui antara muka tersebut. Walaupun hanya kedudukan halaman yang terdiri daripada multi-GPU, pasukan ini secara aktif mengusahakan versi multi-GPU yang lain, jika berkenaan.

RAPID

Salah satu sub-projek cuGraph yang saya anggap menarik adalah cugraphBLAS, suatu usaha untuk menyeragamkan blok bangunan untuk algoritma grafik dalam bahasa aljabar linear. Berdasarkan GraphBLAS (graphblas.org), struktur data khusus yang direka untuk pemprosesan grafik dinamik yang jarang.

Sub-projek cuGraph lain, Hornet menyediakan format bebas sistem untuk mengandungi data grafik, serupa dengan cara anak panah Apache menyediakan cara bebas sistem untuk memproses kerangka data. Hornet menyokong sebahagian besar format grafik yang popular termasuk SNAP, mtx, metis, dan edge.

Sesuai dengan semangat untuk dekat dengan komuniti Python, paket NetworkX asli Python dapat digunakan untuk kajian rangkaian yang kompleks. Ini termasuk struktur data untuk grafik dan multi-grafik, yang diimplementasikan semula menggunakan primitif CUDA, yang memungkinkan anda menggunakan semula banyak algoritma grafik standard dan melakukan struktur dan langkah-langkah analisis rangkaian. Sebilangan besar algoritma adalah GPU tunggal, seperti NetworkX. Walaupun begitu, menjalankannya pada GPU sahaja menawarkan peningkatan yang ketara, sementara kerja terus beralih ke implementasi multi-GPU.

Pada peta jalan Rapids 

Memandangkan kepantasan luar biasa yang disediakan oleh analisis berasaskan GPU, ada beberapa projek baru yang akan digabungkan dalam versi mendatang.

DLPack dan array_interface untuk pembelajaran mendalam

Rangkaian saraf pelbagai lapisan adalah salah satu beban kerja pertama yang dipindahkan ke GPU, dan terdapat banyak kod yang cukup besar untuk kes penggunaan pembelajaran mesin ini. DLPack sebelumnya adalah standard de-facto untuk pertukaran data di antara perpustakaan pembelajaran mendalam. Pada masa ini array_interface biasanya disokong Rapids menyokong kedua-duanya.

cuSignal

Seperti kebanyakan projek lain di Rapids, cuSignal adalah versi dipercepat GPU dari perpustakaan Python yang ada, dalam hal ini perpustakaan Signal SciPy. Perpustakaan Signal SciPy yang asal didasarkan pada NumPy, yang digantikan dengan setara yang dipercepat GPU, CuPy dalam cuSignal. Ini adalah contoh yang baik dari falsafah reka bentuk Rapids di tempat kerja. Dengan pengecualian beberapa kernel CUDA khusus, port ke GPU kebanyakannya melibatkan penggantian pernyataan import dan mengubah beberapa parameter fungsi. 

Membawa pemprosesan isyarat ke lipatan Rapids adalah langkah yang bijak. Pemprosesan isyarat ada di mana-mana dan mempunyai banyak aplikasi komersial yang berguna dalam industri dan pertahanan.

cuSpatial

Operasi spatial dan spatiotemporal adalah calon yang tepat untuk percepatan GPU, dan mereka menyelesaikan banyak masalah dunia nyata yang kita hadapi dalam kehidupan seharian, seperti menganalisis corak lalu lintas, kesihatan / kualiti tanah, dan risiko banjir. Sebilangan besar data yang dikumpulkan oleh peranti mudah alih, termasuk drone, memiliki komponen geospasial, dan analisis spasial berada di jantung Smart City. 

Diarkibkan seperti komponen lain, cuSpatial adalah perpustakaan C ++ yang dibina berdasarkan primitif CUDA dan perpustakaan pemprosesan vektor Thrust, menggunakan cuDF untuk pertukaran data. Pengguna perpustakaan C ++ dapat membaca data titik, polyline, dan poligon menggunakan pembaca C ++. Pengguna Python lebih baik menggunakan pakej Python yang ada seperti Shapely atau Fiona untuk mengisi array NumPy, kemudian menggunakan API cuSpatial Python atau menukar ke bingkai data cuDF. 

cuxfilter untuk visualisasi data

Memvisualisasikan data adalah asas, baik dalam aliran kerja analisis dan untuk membentangkan atau melaporkan hasil. Namun untuk semua keajaiban bahawa GPU dapat menggunakan data itu sendiri, mengeluarkan data ke penyemak imbas bukanlah tugas yang remeh. cuxfilter, yang diilhami oleh perpustakaan Crossfilter JavaScript, bertujuan untuk merapatkan jurang itu dengan menyediakan timbunan untuk membolehkan perpustakaan visualisasi pihak ketiga untuk menampilkan data dalam bingkai data cuDF.

Terdapat beberapa iterasi cuxfilter ketika pasukan menyusun corak seni bina dan penyambung terbaik. Iterasi terbaru memanfaatkan notebook Jupyter, pelayan Bokeh, dan panel PyViz, sementara eksperimen integrasi merangkumi projek dari Uber, Falcon, dan PyDeck. Komponen ini belum siap untuk waktu perdana, tetapi dijadualkan untuk dilancarkan di Rapids 0.13. Terdapat banyak bahagian yang bergerak, dan saya tidak dapat bereksperimen dengan tangan pertama, tetapi jika sesuai dengan janjinya, ini akan menjadi tambahan yang bagus untuk toolkit Rapids.

Meningkatkan dan keluar dengan Dask

Dask diedarkan penjadual tugas untuk Python, memainkan peranan yang serupa untuk Python yang dimainkan oleh Apache Spark untuk Scala. Dask-cuDF adalah perpustakaan yang menyediakan kerangka data yang disokong GPU berpartisi. Dask-cuDF berfungsi dengan baik ketika anda merancang untuk menggunakan cuML atau ketika anda memuatkan set data yang lebih besar dari memori GPU atau tersebar di beberapa fail.

Seperti Spark RDD (Resilient Distributed Dataset), kerangka data yang diedarkan Dask-cuDF kebanyakannya berperilaku seperti tempatan, jadi anda boleh bereksperimen dengan mesin tempatan anda dan beralih ke model yang diedarkan apabila anda perlu meningkatkan. Dask-cuML memberikan keupayaan multi-node cuML, menjadikannya pilihan yang baik apabila anda tidak mempunyai anggaran untuk stesen kerja DGX.