Percepat numpy, scikit, dan panda 100 kali dengan Rust dan LLVM: wawancara dengan pengembang Weld

Halo, Habr! Saya mempersembahkan untuk Anda terjemahan artikel "Wawancara dengan kontributor utama Weld: percepatan numpy, scikit dan panda sebanyak 100x dengan Rust dan LLVM" .

Setelah bekerja selama beberapa minggu dengan perangkat ilmu data dalam Python dan R, saya mulai bertanya-tanya apakah ada representasi perantara (IR) seperti CUDA yang dapat digunakan dalam berbagai bahasa. Pasti ada sesuatu yang lebih baik daripada implementasi ulang dan optimalisasi metode yang sama di setiap bahasa. Selain itu, alangkah baiknya jika ada runtime umum untuk mengoptimalkan seluruh program, daripada masing-masing fungsi secara individual.

Setelah beberapa hari meneliti dan menguji berbagai proyek, saya menemukan Weld(Anda dapat membaca artikel akademik ).

Yang mengejutkan saya, salah satu penulis Weld adalah Matei Zaharia (Matei Zaharia), pencipta Spark.

Jadi, saya menghubungi Shoumik Palkar , kontributor utama Weld, dan mewawancarainya. Showmick adalah mahasiswa pascasarjana di Departemen Ilmu Komputer di Universitas Stanford, di mana ia masuk atas saran dari Matey Zakharia.

Las belum siap untuk penggunaan industri, tetapi sangat menjanjikan. Jika Anda tertarik pada masa depan ilmu data dan Rust khususnya, Anda akan menyukai wawancara ini.

Iklan penulis artikel asli
image
«Not a Monad Tutorial», Weld . !

, mail@fcarrone.com @unbalancedparen.

Untuk apa Las dirancang, masalah apa yang dipecahkannya?


Tujuan Weld adalah untuk meningkatkan produktivitas untuk aplikasi yang menggunakan API tingkat tinggi seperti NumPy dan Pandas. Masalah utama yang dipecahkannya adalah optimisasi lintas-fungsional dan lintas-perpustakaan yang tidak disediakan oleh perpustakaan lain saat ini. Secara khusus, banyak perpustakaan yang banyak digunakan memiliki implementasi modern dari algoritma untuk fungsi individu (misalnya, algoritma join cepat diimplementasikan di Pandas oleh C, atau perkalian matriks cepat di NumPy), tetapi mereka tidak memberikan kemungkinan mengoptimalkan kombinasi fungsi-fungsi ini. Misalnya, mencegah pemindaian memori yang tidak perlu saat melakukan perkalian matriks diikuti dengan agregasi.

Weld menyediakan lingkungan runtime umum yang memungkinkan perpustakaan untuk mengekspresikan komputasi dalam representasi perantara sedang (IR). IR ini kemudian dapat dioptimalkan menggunakan optimizer kompiler, dan kemudian dikompilasi dengan cepat (JIT) ke dalam kode mesin paralel dengan optimisasi seperti penggabungan loop, vektorisasi, dll. IR Weld awalnya paralel, sehingga program-program yang dinyatakan di dalamnya selalu bisa diparalelkan secara sepele.

Kami juga memiliki proyek baru yang disebut anotasi Split, yang akan diintegrasikan dengan Weld dan dirancang untuk mengurangi hambatan dengan dimasukkannya optimasi tersebut di perpustakaan yang ada.

Bukankah lebih mudah untuk mengoptimalkan numpy, panda, dan scikit? Seberapa cepat?


Weld menyediakan optimalisasi kombinasi fungsi di pustaka ini, sementara optimalisasi pustaka dapat mempercepat panggilan hanya fungsi individu. Bahkan, banyak perpustakaan ini sudah dioptimalkan dengan sangat baik untuk setiap fungsi individu, tetapi memberikan kinerja di bawah batas peralatan modern, karena mereka tidak menggunakan paralelisme atau tidak menggunakan hierarki memori secara efisien.

Sebagai contoh, banyak fungsi NumPy untuk array multidimensi (ndarray) diimplementasikan dalam bahasa C tingkat rendah, tetapi panggilan ke setiap fungsi memerlukan pemindaian penuh dari data input. Jika array ini tidak sesuai dengan cache CPU, sebagian besar waktu eksekusi dapat dihabiskan memuat data dari memori utama, daripada melakukan perhitungan. Weld dapat melihat panggilan fungsi individual dan melakukan optimasi, seperti menggabungkan loop yang akan menyimpan data dalam cache atau register CPU. Optimalisasi semacam itu dapat meningkatkan kinerja lebih dari satu urutan besarnya dalam sistem multi-core, karena mereka memberikan skalabilitas yang lebih baik.

gambar

Integrasi prototipe Weld dengan Spark (kiri atas), NumPy (kanan atas) dan TensorFlow (kiri bawah) menunjukkan peningkatan hingga 30 kali lipat dibandingkan implementasi infrastruktur mereka sendiri tanpa perubahan dalam kode aplikasi pengguna. Optimalisasi lintas-perpustakaan Pandas dan NumPy (kanan bawah) dapat meningkatkan kinerja dengan dua kali lipat.

Apa itu Baloo?


Baloo adalah perpustakaan yang mengimplementasikan subset dari Pandas API menggunakan Weld. Ini dikembangkan oleh Radu Jica, seorang Master di CWI (Centrum Wiskunde & Informatica, Amsterdam). Tujuan dari Baloo adalah untuk menerapkan jenis optimasi di atas untuk Pandas untuk meningkatkan kinerja single-threaded, mengurangi penggunaan memori, dan memastikan konkurensi.

Apakah Weld / Baloo mendukung operasi eksternal (seperti, katakanlah, Dask) untuk memproses data yang tidak sesuai dengan memori?


Weld dan Baloo saat ini tidak mendukung operasi eksternal (out-of-core, memori eksternal), meskipun kami akan dengan senang hati menerima pengembangan opensource ke arah ini!

Mengapa Anda memilih Rust dan LLVM untuk mengimplementasikan Weld? Apakah Anda datang ke Rust segera?


Kami memilih Rust karena:

  • Ini memiliki runtime minimal (pada kenyataannya, itu hanya memeriksa batas-batas array) dan mudah untuk ditanamkan dalam bahasa lain seperti Java dan Python
  • Ini berisi paradigma pemrograman fungsional, seperti pencocokan pola, yang membuat penulisan kode lebih mudah, misalnya, untuk mengoptimalkan kompilasi pencocokan pola
  • ( Rust crates), .

Kami memilih LLVM karena ini merupakan kerangka kompilasi sumber terbuka yang banyak digunakan dan didukung. Kami menghasilkan LLVM secara langsung, bukan C / C ++, jadi kami tidak memerlukan kompiler C. Ini juga mengurangi waktu kompilasi, karena kami tidak menguraikan kode C / C ++.

Karat bukan bahasa pertama Weld diimplementasikan di. Implementasi pertama adalah pada Scala, yang dipilih karena tipe data aljabar dan kehadiran fitur yang kuat seperti pencocokan pola. Ini menyederhanakan penulisan optimizer, yang merupakan bagian utama dari kompiler. Pengoptimal asli kami dibuat seperti Catalyst, pengoptimal yang dapat dikembangkan dalam Spark SQL.

Kami pindah dari Scala karena terlalu sulit untuk menanamkan bahasa berbasis JVM di runtimes dan bahasa lain.

Weld CPU GPU, RAPIDS, data science Python GPU?


Perbedaan utama antara Weld dan sistem seperti RAPIDS adalah bahwa ia ditujukan untuk mengoptimalkan aplikasi yang berisi kernel yang berbeda (fungsi dalam istilah CUDA) dengan mengkompilasi dengan cepat, dan tidak mengoptimalkan implementasi dari fungsi individual. Misalnya, backend GPU Weld akan mengkompilasi satu kernel CUDA tunggal yang dioptimalkan untuk aplikasi akhir, alih-alih memanggil kernel yang terpisah.

Selain itu, Weld IR adalah perangkat keras yang independen, yang memungkinkannya digunakan untuk GPU dan CPU, serta peralatan non-standar seperti prosesor vektor.
Tentu saja, Weld pada dasarnya bersinggungan dengan proyek-proyek lain di bidang yang sama, termasuk RAPIDS, dan dibuat di bawah pengaruh mereka.

Lingkungan runtime seperti Bohrium (mengimplementasikan komputasi malas di NumPy) dan Numba (pustaka Python, kompiler kode JIT) berbagi tujuan tingkat tinggi Weld. Dan sistem pengoptimal seperti Spark SQL secara langsung memengaruhi desain Weld.

Apakah Weld memiliki kegunaan lain selain optimasi perpustakaan sains data?


Salah satu aspek yang paling menarik dari Weld IR adalah bahwa ia secara asli mendukung konkurensi data. Ini berarti bahwa paralelisasi loop dalam Weld IR selalu aman. Ini membuat Weld IR menarik untuk jenis peralatan baru.

Sebagai contoh, karyawan NEC menggunakan Weld untuk menjalankan beban kerja Python pada prosesor vektor bandwidth tinggi kustom, cukup menambahkan backend baru ke IR Weld yang ada.

IR juga dapat digunakan untuk mengimplementasikan lapisan operasi fisik dalam database. Dan kami berencana untuk menambahkan fitur yang juga memungkinkan kami untuk mengkompilasi subset Python ke dalam kode Weld.

Apakah perpustakaan siap digunakan dalam proyek nyata? Dan jika tidak, kapan Anda bisa mengharapkan hasil yang selesai?


Banyak contoh dan tolok ukur di mana kami menguji perpustakaan ini diambil dari beban kerja nyata. Karena itu, kami sangat ingin pengguna mencoba versi saat ini di aplikasi mereka, dan meninggalkan umpan balik mereka. Dan yang terbaik, mereka mengusulkan tambalan mereka sendiri.

Secara umum, saat ini tidak dapat dikatakan bahwa dalam aplikasi nyata semuanya akan bekerja di luar kotak.

Rilis kami berikutnya selama beberapa bulan ke depan akan fokus secara eksklusif pada kegunaan dan keandalan perpustakaan Python. Tujuan kami adalah membuat perpustakaan cukup baik untuk dimasukkan dalam proyek nyata. Dan juga kemampuan untuk menggunakan versi pustaka non-Weld di tempat-tempat di mana dukungan belum ditambahkan.

Seperti yang saya catat dalam pertanyaan pertama, proyek anotasi Split ( kode sumber dan artikel akademik ) harus menyederhanakan transisi ini.

Split annotations adalah sistem yang memungkinkan Anda menambahkan anotasi ke kode yang ada untuk menentukan cara memecah, mengubah, dan memparalelkannya. Ini memberikan optimasi yang kami anggap paling efektif di Weld (menyimpan potongan data dalam cache CPU di antara panggilan fungsi, alih-alih memindai seluruh kumpulan data). Tetapi anotasi Split jauh lebih mudah diintegrasikan daripada Weld, karena mereka menggunakan kode pustaka yang ada tanpa mengandalkan kompiler IR. Ini juga memfasilitasi pemeliharaan dan debugging, yang pada gilirannya meningkatkan keandalan.

Perpustakaan yang belum memiliki dukungan las penuh dapat menggunakan anotasi Split. Ini akan memungkinkan kami untuk secara bertahap menambahkan dukungan Weld berdasarkan umpan balik pengguna, sambil memasukkan optimasi baru.

All Articles