Ulasan: Nvidia's Rapids menghadirkan analisis Python ke GPU

Membuat model pembelajaran mesin adalah proses yang berulang. Seringkali menghafal dan rutin, ini adalah permainan "tercepat melalui siklus menang," karena semakin cepat Anda bisa mengulang, semakin mudah untuk mengeksplorasi teori baru dan mendapatkan jawaban yang baik. Ini adalah salah satu alasan penggunaan perusahaan praktis AI saat ini didominasi oleh perusahaan terbesar, yang dapat membuang sumber daya yang sangat besar pada masalah tersebut.

Rapids adalah payung untuk beberapa proyek open source, diinkubasi oleh Nvidia, yang menempatkan seluruh pipeline pemrosesan pada GPU, menghilangkan transfer data terikat I / O, sementara juga secara substansial meningkatkan kecepatan setiap langkah individu. Ini juga menyediakan format umum untuk data, meringankan beban pertukaran data antara sistem yang berbeda. Pada tingkat pengguna, Rapids meniru API Python untuk memudahkan transisi untuk basis pengguna tersebut.

Buku Masakan Tidyverse

Arsitektur ekosistem Rapids

Proyek Rapids bertujuan untuk mereplikasi, sebagian besar, pembelajaran mesin dan API analisis data Python, tetapi untuk GPU daripada CPU. Ini berarti bahwa pengembang Python sudah memiliki semua yang mereka butuhkan untuk dijalankan pada GPU, tanpa harus mempelajari detail tingkat rendah dari pemrograman CUDA dan operasi paralel. Pythonistas dapat mengembangkan kode pada mesin berkemampuan non-GPU, kemudian, dengan beberapa penyesuaian, menjalankannya pada semua GPU yang tersedia untuk mereka.

Toolkit Nvidia CUDA menyediakan primitif tingkat rendah untuk perpustakaan matematika, algoritme paralel, dan analisis grafik. Inti dari arsitektur adalah bingkai data GPU, berdasarkan Apache Arrow, yang menyediakan struktur data dalam memori berbentuk kolom yang merupakan bahasa pemrograman agnostik. Pengguna berinteraksi dengan dataframe GPU melalui cuDF dan API mirip Pandas. Dask, pustaka Python untuk komputasi paralel, meniru API Python hulu dan bekerja dengan pustaka CUDA untuk komputasi paralel. Pikirkan Dask sebagai Spark untuk Python.

RAPIDS

Tiga proyek utama, cuDF, cuML dan cuGraph, dikembangkan secara independen, tetapi dirancang untuk bekerja sama dengan mulus. Jembatan ke ekosistem Python yang lebih luas juga sedang dikembangkan sebagai bagian dari proyek.

Instalasi jeram

Penginstalan melalui Anaconda pada mesin Linux di AWS sebagian besar sangat mudah, kecuali ada beberapa gangguan karena perubahan dependensi di versi 0.11. Menginstal pustaka C / C ++ untuk menggunakan libcudf tidak semudah itu, dan saya merekomendasikan untuk tetap menggunakan Python API dan proses instalasi Conda. Rapids menyertakan notebook Jupyter, juga tersedia di Colab gratis Google, yang membuat memulai menjadi sederhana. Saya menggunakan notebook Jupyter versi 0.10 untuk menjalankan kode di Google Colab, yang menyertakan GPU Nvidia Tesla T4.

Kerangka data GPU Rapids

Inti dari setiap alur kerja ilmu data adalah kerangka data. Di sinilah rekayasa fitur terjadi, dan sebagian besar waktu dihabiskan, karena data scientist memperebutkan data kotor. cuDF adalah proyek Rapids untuk kerangka data berbasis GPU, mirip Pandas. Yang mendasari cuDF adalah libcudf, pustaka C ++ yang menerapkan primitif tingkat rendah untuk mengimpor data Apache Arrow, melakukan matematika berbasis elemen pada larik, dan menjalankan pengurutan, penggabungan, pengelompokan berdasarkan, pengurangan, dan operasi lainnya pada matriks memori dalam GPU. Struktur data dasar libcudf adalah GPU DataFrame (GDF), yang pada gilirannya dimodelkan pada penyimpanan data kolom Apache Arrow.

RAPIDS

Pustaka Rapids Python menyajikan pengguna dengan antarmuka tingkat yang lebih tinggi yang menyerupai kerangka data, seperti yang ada di Pandas. Dalam banyak kasus, kode Pandas tidak berubah di cuDF. Jika tidak demikian, biasanya hanya diperlukan perubahan kecil.

Fungsi yang ditentukan pengguna di cuDF

Setelah Anda melewati manipulasi data dasar, terkadang perlu untuk memproses baris dan kolom dengan fungsi yang ditentukan pengguna (UDF). cuDF menyediakan API gaya PyData untuk menulis kode guna memproses lebih banyak struktur data berbutir kursus seperti array, seri, dan jendela pemindahan. Saat ini hanya jenis numerik dan Boolean yang didukung. UDF dikompilasi menggunakan kompiler JIT Numba, yang menggunakan subset LLVM untuk mengompilasi fungsi numerik ke kode mesin CUDA. Hal ini menghasilkan waktu pengoperasian yang jauh lebih cepat pada GPU.

String di cuDF

Meskipun GPU sangat bagus untuk memproses vektor float dengan cepat, mereka biasanya tidak digunakan untuk memproses data string, dan kenyataannya adalah sebagian besar data datang kepada kami dalam bentuk string. cuStrings adalah pustaka manipulasi string GPU untuk memisahkan, menerapkan ekspresi reguler, menggabungkan, mengganti token, dll. dalam larik string. Seperti fungsi cuDF lainnya, ini diimplementasikan sebagai pustaka C / C ++ (libnvStrings) dan dibungkus oleh lapisan Python yang dirancang untuk meniru Pandas. Meskipun tipe data string tidak dioptimalkan untuk eksekusi pada GPU, eksekusi paralel kode harus memberikan percepatan atas manipulasi string berbasis CPU.

Mendapatkan data masuk atau keluar dari cuDF

Dataframe I / O ditangani oleh pustaka khusus, cuIO. Semua format yang paling sering ditemui didukung, termasuk Panah, ORC, Parquet, HDF5, dan CSV. Jika Anda cukup beruntung untuk menjalankan perangkat keras DGX-2, Anda dapat menggunakan integrasi Penyimpanan Langsung GPU untuk memindahkan data secara langsung dari penyimpanan berkecepatan tinggi ke GPU tanpa melibatkan CPU. Pengguna fana masih akan menghargai kecepatan yang diberikan GPU saat mendekompresi kumpulan data besar, dan integrasi yang erat dengan ekosistem Python.

GPU Direct Storage saat ini dalam versi alfa, dan saat dirilis akan tersedia di sebagian besar GPU Tesla. Anda dapat membuat kerangka data GPU dari array NumPy, Pandas DataFrames, dan tabel PyArrow hanya dengan satu baris kode. Proyek lain dapat bertukar data melalui __cuda_array_interface__perpustakaan yang termasuk dalam ekosistem Numba. DLPack untuk pustaka jaringan neural juga merupakan antarmuka yang didukung.

Mungkin kelemahan terbesar dalam menggunakan cuDF adalah kurangnya interoperabilitas di luar Python. Saya pikir fokus pada fondasi yang kuat dari C / C ++ API, seperti yang telah dilakukan Arrow, akan memungkinkan ekosistem yang lebih luas dan menguntungkan proyek secara keseluruhan.

CuML Rapids

Sasaran cuML adalah menjadi "Scikit-learn Python yang didukung oleh GPU". Secara teori, ini berarti Anda hanya perlu mengubah pernyataan impor dan mungkin menyesuaikan beberapa parameter untuk menjelaskan perbedaan dalam menjalankan CPU, di mana terkadang pendekatan brute force lebih baik. Manfaat memiliki Scikit-learn berbasis GPU sulit untuk diremehkan. Percepatannya substansial, dan analis data bisa berkali-kali lipat lebih produktif. C ++ API belum cukup siap untuk konsumsi luas di luar binding Python-nya, tetapi ini diharapkan dapat ditingkatkan.

cuML juga menyertakan API untuk membantu penyetelan hyperparameter melalui Dask, pustaka untuk menskalakan Python di banyak node. Banyak algoritme pembelajaran mesin dapat secara efektif dibuat paralel, dan cuML secara aktif mengembangkan algoritme multi-GPU dan multi-node, multi-GPU.

RAPIDS

CuGraph Rapids

cuGraph adalah anggota ketiga dari ekosistem Rapids, dan seperti yang lainnya, cuGraph terintegrasi penuh dengan cuDF dan cuML. Ini menawarkan pilihan yang baik dari algoritma grafik, primitif, dan utilitas, semuanya dengan kinerja yang dipercepat GPU. Pemilihan API di cuGraph agak lebih luas daripada di bagian lain Rapids, dengan NetworkX, Pregel, GraphBLAS, dan GQL (Graph Query Language) semuanya tersedia.

RAPIDS

cuGraph lebih seperti sebuah toolkit dalam semangatnya daripada cuML. Teknologi grafik adalah ruang yang bergerak cepat baik di dunia akademis maupun industri. Jadi, berdasarkan desain, cuGraph memberi pengembang akses ke lapisan C ++ dan primitif grafik, mendorong pihak ketiga untuk mengembangkan produk menggunakan cuGraph. Beberapa universitas telah berkontribusi, dan proyek dari Texas A&M (GraphBLAS), Georgia Tech (Hornet), dan UC Davis (Gunrock) telah "diproduksikan" dan dimasukkan di bawah payung cuGraph. Setiap proyek menyediakan sekumpulan kemampuan yang berbeda, semuanya diakselerasi dengan GPU, dan semuanya didukung oleh kerangka data cuDF yang sama.

NetworkX adalah Python API yang ditargetkan oleh tim Rapids untuk antarmuka aslinya. Ada sejumlah algoritma yang tersedia melalui antarmuka itu. Meskipun hanya peringkat halaman yang multi-GPU, tim ini secara aktif mengerjakan versi multi-GPU dari yang lain, jika memungkinkan.

RAPIDS

Salah satu subproyek cuGraph yang menurut saya menarik adalah cugraphBLAS, upaya untuk menstandarkan blok bangunan untuk algoritme grafik dalam bahasa aljabar linier. Berdasarkan GraphBLAS (graphblas.org), struktur data khusus yang dirancang untuk pemrosesan grafik dinamis jarang.

Sub-proyek cuGraph lainnya, Hornet menyediakan format independen sistem untuk memuat data grafik, serupa dengan cara panah Apache menyediakan cara independen sistem untuk memproses kerangka data. Hornet mendukung sebagian besar format grafik populer termasuk SNAP, mtx, metis, dan edge.

Sesuai dengan semangat kedekatan dengan komunitas Python, paket NetworkX asli Python dapat digunakan untuk mempelajari jaringan yang kompleks. Ini termasuk struktur data untuk grafik dan multi-grafik, diimplementasikan kembali menggunakan primitif CUDA, memungkinkan Anda untuk menggunakan kembali banyak algoritma grafik standar dan melakukan struktur jaringan dan ukuran analisis. Mayoritas algoritme adalah GPU tunggal, seperti NetworkX. Namun demikian, menjalankannya di GPU saja menawarkan kecepatan yang signifikan, sementara pekerjaan terus beralih ke implementasi multi-GPU.

Di peta jalan Rapids 

Mengingat kecepatan luar biasa yang disediakan analitik berbasis GPU, ada beberapa proyek baru yang akan digabungkan dalam versi mendatang.

DLPack dan array_interface untuk pembelajaran mendalam

Jaringan neural multi-lapisan adalah salah satu dari beban kerja pertama yang dipindahkan ke GPU, dan ada banyak kode untuk kasus penggunaan pembelajaran mesin ini. Sebelumnya DLPack adalah standar de-facto untuk pertukaran data di antara pustaka pembelajaran mendalam. Saat ini array_interface umumnya didukung. Rapids mendukung keduanya.

cuSignal

Seperti kebanyakan proyek lain di Rapids, cuSignal adalah versi akselerasi GPU dari pustaka Python yang ada, dalam hal ini pustaka SciPy Signal. Pustaka SciPy Signal asli didasarkan pada NumPy, yang diganti dengan yang setara dengan akselerasi GPU, CuPy di ​​cuSignal. Ini adalah contoh bagus dari filosofi desain Rapids yang sedang bekerja. Dengan pengecualian beberapa kernel CUDA khusus, port ke GPU sebagian besar melibatkan penggantian pernyataan impor dan mengubah beberapa parameter fungsi. 

Membawa pemrosesan sinyal ke dalam lipatan Rapids adalah langkah cerdas. Pemrosesan sinyal ada di mana-mana dan memiliki banyak aplikasi komersial yang segera berguna dalam industri dan pertahanan.

cuSpatial

Operasi spasial dan spasial merupakan kandidat yang bagus untuk akselerasi GPU, dan mereka memecahkan banyak masalah dunia nyata yang kita hadapi dalam kehidupan sehari-hari, seperti menganalisis pola lalu lintas, kesehatan / kualitas tanah, dan risiko banjir. Sebagian besar data yang dikumpulkan oleh perangkat seluler, termasuk drone, memiliki komponen geospasial, dan analisis spasial merupakan inti dari Kota Cerdas. 

Diarsipkan seperti komponen lainnya, cuSpatial adalah pustaka C ++ yang dibangun di atas primitif CUDA dan pustaka pemrosesan vektor Thrust, menggunakan cuDF untuk pertukaran data. Konsumen pustaka C ++ dapat membaca data titik, polyline, dan poligon menggunakan pembaca C ++. Pengguna Python lebih baik menggunakan paket Python yang ada seperti Shapely atau Fiona untuk mengisi array NumPy, kemudian menggunakan cuSpatial Python API atau mengonversi ke dataframe cuDF. 

cuxfilter untuk visualisasi data

Memvisualisasikan data adalah hal mendasar, baik dalam alur kerja analitik dan untuk menyajikan atau melaporkan hasil. Namun untuk semua keajaiban bahwa GPU dapat mengerjakan datanya sendiri, mengeluarkan data itu ke browser bukanlah tugas yang sepele. cuxfilter, terinspirasi oleh perpustakaan JavaScript Crossfilter, bertujuan untuk menjembatani kesenjangan itu dengan menyediakan tumpukan untuk memungkinkan perpustakaan visualisasi pihak ketiga untuk menampilkan data dalam dataframe cuDF.

Ada beberapa iterasi cuxfilter saat tim memilah arsitektur dan pola konektor terbaik. Iterasi terbaru memanfaatkan notebook Jupyter, server Bokeh, dan panel PyViz, sementara eksperimen integrasi mencakup proyek dari Uber, Falcon, dan PyDeck. Komponen ini belum cukup siap untuk prime time, tetapi dijadwalkan untuk rilis di Rapids 0.13. Ada banyak bagian yang bergerak, dan saya tidak sempat bereksperimen dengannya secara langsung, tetapi jika memenuhi janjinya, ini akan menjadi tambahan yang bagus untuk perangkat Rapids.

Peningkatan dan peningkatan dengan Dask

Dask adalah penjadwal tugas terdistribusi untuk Python, yang memainkan peran serupa untuk Python yang dimainkan Apache Spark untuk Scala. Dask-cuDF adalah pustaka yang menyediakan kerangka data yang dipartisi dan didukung GPU. Dask-cuDF berfungsi dengan baik saat Anda berencana menggunakan cuML atau saat Anda memuat kumpulan data yang lebih besar dari memori GPU atau tersebar di beberapa file.

Seperti Spark RDD (Set Data Terdistribusi Tangguh), dataframe terdistribusi Dask-cuDF sebagian besar berperilaku seperti komputer lokal, sehingga Anda dapat bereksperimen dengan mesin lokal dan pindah ke model terdistribusi saat Anda perlu meningkatkan skala. Dask-cuML memberikan kemampuan multi-node cuML, menjadikannya pilihan yang baik saat Anda tidak memiliki anggaran untuk workstation DGX.