Beberapa Pertimbangan untuk Komputasi Bersamaan dalam R untuk Tugas "Perusahaan"

Komputasi paralel atau terdistribusi itu sendiri bukanlah hal yang sangat sepele. Dan lingkungan pengembangan harus mendukung, dan spesialis DS harus memiliki keterampilan untuk melakukan komputasi paralel, dan tugas tersebut harus dibawa ke bentuk terpisah, jika ada. Tetapi dengan pendekatan yang kompeten, Anda dapat mempercepat solusi masalah dengan R ulir tunggal, jika Anda memiliki setidaknya prosesor multicore (dan hampir semua orang memilikinya sekarang), disesuaikan dengan batas percepatan teoritis yang ditentukan oleh hukum Amdal . Namun, dalam beberapa kasus, bahkan bisa dielakkan.


Ini adalah kelanjutan dari publikasi sebelumnya .


Pendekatan khas


Sebagai aturan, ketika seorang analis (spesialis DS, pengembang, atau memilih nama yang cocok untuk Anda sendiri) mencoba untuk mempercepat tugas dalam satu komputer dan mulai beralih dari mode single-threaded ke multi-threaded, ia melakukannya dengan cara boilerplate. parApply , foreach\%dopar% , dll. Anda dapat melihat secara ringkas dan cerdas, misalnya, di sini: "Paralelisme dalam R" . 3 langkah:


  1. buat core-1 utas
  2. jalankan menggunakan foreach ,
  3. kumpulkan jawaban dan dapatkan hasilnya.

Untuk tugas komputasi tipikal yang menempati 100% CPU dan tidak memerlukan transfer sejumlah besar informasi input, ini adalah pendekatan yang tepat. Poin utama yang perlu diperhatikan adalah menyediakan logging di utas agar dapat mengontrol proses. Tanpa logging, penerbangan akan pergi bahkan tanpa instrumen.


Dalam kasus tugas "perusahaan", ketika diparalelkan, banyak kesulitan metodologi tambahan muncul yang secara signifikan mengurangi efek dari pendekatan langsung di atas:


  • kemungkinan ketidakseimbangan beban yang kuat pada arus;
  • Persyaratan kinerja CPU dalam satu tugas dapat dihancurkan hanya dengan beberapa semburan tajam;
  • setiap perhitungan individu mungkin memerlukan sejumlah besar memori untuk input dan output hasil juga dari ukuran yang cukup besar;
  • sebagai bagian dari tugas yang terpisah, mungkin ada campuran antara komputasi, bekerja dengan disk dan meminta sistem eksternal.

Ini adalah skenario yang sangat khas ketika, sebagai bagian dari proses, Anda perlu mendapatkan pekerjaan yang banyak sebagai input, membaca data dari disk, mengambil sebagian besar dari database, meminta sistem eksternal dan menunggu jawaban dari mereka (klasik - REST API request), dan kemudian mengembalikan N ke proses induk megabita sebagai hasilnya.


Map-reduce oleh pengguna, lokasi, dokumen, alamat ip, tanggal, ... (tambahkan sendiri). Dalam kasus yang paling menyedihkan, eksekusi paralel mungkin lebih lama dari single-threaded. Masalah kehabisan memori juga dapat terjadi. Apakah semuanya hilang? Tidak semuanya.


Cara alternatif


Mari kita perhatikan tesis cara untuk secara radikal memperbaiki situasi. Pada saat yang sama, kita tidak lupa bahwa kita hidup dalam kerangka kebun binatang penuh. Sirkuit produktif pada *nix , laptop DS pada Win * nix \ MacOS, tetapi perlu untuk bekerja secara seragam di mana-mana.


  1. Tugas mikro: diterima pada input pengguna, meminta basis data, meminta 2 IC eksternal melalui REST, mengunduh dan mengurai direktori dari disk, melakukan perhitungan, membuang hasilnya ke disk \ basis data. Pengguna, misalnya, 10^6 .
  2. Kami beralih ke penggunaan paket future dan adaptor doFuture universal.
  3. Jika tugas terpisah sedemikian rupa sehingga dalam tugas terpisah waktu prosesor diperlukan dalam jumlah kecil (kami menunggu jawaban dari sistem pihak ketiga), maka doFuture memungkinkan Anda untuk beralih dari pemisahan aliran ke pemisahan menjadi proses terpisah dalam satu baris (Anda dapat melihat parameter startup di *nix in htop ) .
  4. Proses-proses ini dapat dibuat lebih dari inti. Tidak ada penjepit yang akan terjadi karena proses individu dalam mode siaga sebagian besar waktu. Tetapi akan diperlukan untuk secara eksperimental memilih jumlah proses yang optimal berdasarkan pada cyclogram dari proses pemrosesan yang khas.

Hasil - tugas awal jauh lebih cepat. Akselerasi bisa lebih besar dari jumlah core yang tersedia.
Tidak ada kode secara sadar, karena tugas utama dari publikasi adalah untuk membagikan pendekatan dan keluarga paket future sangat baik.


PS


Ada beberapa nuansa kecil yang juga perlu dilacak:


  • setiap proses akan mengkonsumsi memori, termasuk data yang diterima dan dikembalikan. Peningkatan jumlah proses akan melipatgandakan persyaratan untuk RAM yang tersedia.
  • doFuture menggunakan "sihir" untuk secara otomatis menentukan komposisi variabel dan paket yang ditransfer ke proses, tetapi Anda tidak harus membiarkan semuanya berjalan dengan sendirinya, lebih baik untuk memeriksa.
  • dalam proses, kontrol gc eksplisit dan penghapusan variabel eksplisit menggunakan rm tidak akan merugikan. Ini bukan obat mujarab dan mungkin tidak berfungsi , tetapi secara eksplisit menunjukkan objek yang dihapus akan membantu.
  • setelah perhitungan selesai, panggil plan(sequential) . Ini akan menutup semua proses dan membebaskan memori yang ditempatinya.
  • Jika Anda perlu mentransfer sejumlah besar data ke proses, pertimbangkan untuk menggunakan penyimpanan eksternal (disk, basis data). Jangan lupa bahwa deskriptor tidak dapat ditransfer, sumber harus dibuka di dalam proses itu sendiri.

Publikasi sebelumnya - “Proses bisnis di perusahaan perusahaan: spekulasi dan kenyataan. Kami menjelaskan dengan R " .

Source: https://habr.com/ru/post/id462469/


All Articles