Instans vs. core saat menggunakan EC2

12

Bekerja pada apa yang sering disebut proyek "data menengah", saya dapat memparalelkan kode saya (kebanyakan untuk pemodelan dan prediksi dalam Python) pada sistem tunggal di mana saja dari 4 hingga 32 core. Sekarang saya sedang mencari peningkatan skala pada EC2 (mungkin dengan StarCluster / IPython, tetapi terbuka untuk saran lain juga), dan telah bingung dengan cara merekonsiliasi distribusi pekerjaan lintas core pada instance vs instance pada sebuah cluster.

Apakah bahkan praktis untuk memparalelkan antar instance dan lintas core pada setiap instance? Jika demikian, adakah yang bisa memberikan ikhtisar cepat dari pro + kontra menjalankan banyak instance dengan masing-masing beberapa core vs beberapa instance dengan banyak core? Apakah ada aturan praktis untuk memilih rasio instance yang tepat untuk core per instance?

Bandwidth dan RAM adalah masalah non-sepele dalam proyek saya, tetapi mudah dikenali ketika itu adalah kemacetan dan penyesuaian kembali. Jauh lebih sulit, saya bayangkan, untuk membandingkan campuran inti yang tepat untuk contoh tanpa pengujian berulang, dan proyek saya terlalu bervariasi untuk setiap pengujian tunggal untuk diterapkan pada semua keadaan. Terima kasih sebelumnya, dan jika saya baru saja gagal menggunakan google ini, jangan ragu untuk mengarahkan saya ke jawaban yang tepat di tempat lain!

Therriault
sumber

Jawaban:

11

Saat menggunakan IPython, Anda hampir tidak perlu khawatir tentang hal itu (dengan mengorbankan beberapa efisiensi / overhead komunikasi yang lebih besar). Plugin IPython paralel di StarCluster secara default akan memulai satu mesin per inti fisik pada setiap node (saya percaya ini dapat dikonfigurasi tetapi tidak yakin di mana). Anda cukup menjalankan apa pun yang Anda inginkan di semua mesin dengan menggunakan api DirectView (map_sync, apply_sync, ...) atau perintah% px magic. Jika Anda sudah menggunakan IPython secara paralel pada satu mesin, menggunakannya pada sebuah cluster tidak berbeda.

Mengatasi beberapa pertanyaan spesifik Anda:

"bagaimana merekonsiliasi pekerjaan distribusi lintas core pada instance vs instance pada sebuah cluster" - Anda mendapatkan satu engine per core (setidaknya); pekerjaan didistribusikan secara otomatis di semua core dan di semua instance.

"Apakah bahkan praktis untuk memparalelkan antar instance dan lintas core pada setiap instance?" - Ya :) Jika kode yang Anda jalankan paralel memalukan (sama persis dengan beberapa set data), maka Anda sebagian besar dapat mengabaikan di mana mesin tertentu sedang berjalan. Jika intinya membutuhkan banyak komunikasi antar mesin, maka tentu saja Anda perlu menyusunnya sehingga mesin-mesin tersebut berkomunikasi dengan mesin lain pada mesin fisik yang sama; tapi masalah semacam itu tidak cocok untuk IPython, saya pikir.

"Jika demikian, adakah yang bisa memberikan ikhtisar cepat dari pro + kontra menjalankan banyak instance dengan masing-masing beberapa core vs beberapa instance dengan banyak core? Apakah ada aturan praktis untuk memilih rasio instance yang tepat untuk core per instance? " - Gunakan instance c3 terbesar untuk komputasi-terikat, dan terkecil untuk masalah memori-bandwidth-terikat; untuk masalah pesan-lewat-terikat, juga menggunakan instance terbesar tetapi cobalah untuk mempartisi masalah sehingga setiap partisi berjalan pada satu mesin fisik dan sebagian besar pesan yang lewat berada di dalam partisi yang sama. Masalah yang akan berjalan secara signifikan lebih lambat pada instance N quadruple c3 daripada pada 2N double c3 jarang terjadi (contoh buatan mungkin menjalankan beberapa filter sederhana pada sejumlah besar gambar, di mana Anda menelusuri semua gambar untuk setiap filter daripada semua filter untuk gambar yang sama).

Alex I
sumber
1
Saya pikir Anda harus mencatat bahwa untuk proses pada mesin tunggal Anda dapat memetakan variabel variabel dengan joblib / Numpy. Anda kehilangan kemampuan itu untuk proses pada mesin yang berbeda.
gallamine
11

Aturan umum adalah untuk tidak mendistribusikan sampai Anda harus melakukannya. Biasanya lebih efisien untuk memiliki N server dengan kapasitas tertentu dari 2N server dengan setengah kapasitas itu. Lebih banyak akses data akan bersifat lokal, dan karenanya cepat dalam memori versus lambat di seluruh jaringan.

Pada titik tertentu, meningkatkan satu mesin menjadi tidak ekonomis karena biaya sumber daya tambahan lebih dari linear. Namun poin ini masih luar biasa tinggi.

Khususnya di Amazon, ekonomi masing-masing tipe instance dapat sangat bervariasi jika Anda menggunakan instance pasar spot. Harga default kurang lebih berarti bahwa jumlah biaya sumber daya yang sama hampir sama terlepas dari jenis instance, yang dapat sangat bervariasi; mesin virtual besar bisa lebih murah daripada mesin kecil, atau mesin virtual kecil bisa jauh lebih murah dari satu mesin besar dengan sumber daya yang setara.

Satu pertimbangan besar di sini adalah bahwa paradigma komputasi dapat berubah cukup banyak ketika Anda berpindah dari satu mesin ke beberapa mesin. Pengorbanan yang disebabkan oleh overhead komunikasi dapat memaksa Anda untuk, misalnya, mengadopsi paradigma data paralel untuk skala. Itu berarti pilihan alat dan algoritma yang berbeda. Sebagai contoh, SGD terlihat sangat berbeda dalam memori dan Python daripada pada MapReduce. Jadi, Anda harus mempertimbangkan ini sebelum memparalelkan.

Anda dapat memilih untuk mendistribusikan pekerjaan di seluruh cluster, bahkan jika satu node dan paradigma non-distribusi bekerja untuk Anda, untuk keandalan. Jika satu node gagal, Anda kehilangan semua perhitungan; perhitungan terdistribusi dapat berpotensi pulih dan menyelesaikan hanya bagian dari perhitungan yang hilang.

Sean Owen
sumber
6

Semua hal dianggap sama (biaya, performa CPU, dll.) Anda bisa memilih contoh terkecil yang dapat menyimpan semua dataset saya dalam memori dan skala keluar. Seperti itu

  • Anda pastikan untuk tidak menyebabkan latensi yang tidak perlu karena komunikasi jaringan, dan
  • Anda cenderung untuk memaksimalkan bandwidth memori yang tersedia secara keseluruhan untuk proses Anda.

Dengan asumsi Anda menjalankan semacam skema validasi silang untuk mengoptimalkan beberapa parameter meta model Anda, tetapkan setiap inti nilai untuk diuji dan pilih banyak contoh yang diperlukan untuk mencakup semua ruang parameter dalam beberapa putaran sesuai keinginan Anda.

Jika data Anda tidak sesuai dengan memori satu sistem, tentu saja Anda harus mendistribusikan seluruh instance. Maka itu adalah masalah menyeimbangkan latensi memori (lebih baik dengan banyak contoh) dengan latensi jaringan (lebih baik dengan lebih sedikit contoh) tetapi mengingat sifat EC2 saya yakin Anda akan sering lebih suka bekerja dengan beberapa instance lemak.

damienfrancois
sumber