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!
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.
sumber
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
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.
sumber