Bagaimana saya bisa mengoptimalkan efisiensi komputasi ketika memasang model yang kompleks ke kumpulan data besar berulang kali?

12

Saya mengalami masalah kinerja menggunakan MCMCglmmpaket di R untuk menjalankan model efek campuran. Kode ini terlihat seperti ini:

MC1<-MCMCglmm(bull~1,random=~school,data=dt,family="categorical"
, prior=list(R=list(V=1,fix=1), G=list(G1=list(V=1, nu=0)))
, slice=T, nitt=iter, ,burnin=burn, verbose=F)

Ada sekitar 20.000 pengamatan dalam data dan mereka terkelompok di sekitar 200 sekolah. Saya telah membuang semua variabel yang tidak digunakan dari kerangka data dan menghapus semua objek lain dari memori, sebelum dijalankan. Masalah yang saya miliki adalah bahwa hal itu membutuhkan waktu yang sangat lama untuk dijalankan, kecuali saya mengurangi iterasi ke jumlah yang sangat kecil. Dengan 50.000 iterasi, dibutuhkan 5 jam dan saya punya banyak model berbeda untuk dijalankan. Jadi saya ingin tahu apakah ada cara untuk mempercepat eksekusi kode, atau paket lain yang bisa saya gunakan. Saya menggunakan MCMCglmmkarena saya ingin interval kepercayaan untuk efek acak.

Di sisi lain, saya berharap untuk mendapatkan PC baru akhir tahun ini, tetapi dengan sedikit keberuntungan saya dapat membawa itu ke depan, jadi saya telah bertanya-tanya bagaimana cara terbaik menghabiskan sejumlah uang terbatas pada perangkat keras baru - lebih banyak RAM , lebih cepat CPU, dll. Dari menonton task manager, saya tidak percaya bahwa RAM adalah masalahnya (tidak pernah mendapatkan lebih dari 50% dari fisik yang digunakan), tetapi penggunaan CPU juga tidak jauh di atas 50%, yang menurut saya aneh. . Pengaturan saya saat ini adalah intel core i5 2.66GHz, RAM 4GB, HDD 7200rpm. Apakah masuk akal untuk mendapatkan CPU tercepat mungkin, dengan mengorbankan RAM tambahan? Saya juga bertanya-tanya tentang pengaruh ukuran cache CPU level 3 pada masalah komputasi statistik seperti ini?

Pembaruan: Setelah ditanyakan pada meta SO, saya disarankan untuk mengulangi pertanyaan dan mengirimnya ke Superuser. Untuk melakukannya saya perlu memberikan rincian lebih lanjut tentang apa yang terjadi "di bawah tenda" di MCMCglmm. Apakah saya benar dalam berpikir bahwa sebagian besar waktu perhitungan dihabiskan untuk melakukan optimasi - maksud saya menemukan maksimum dari beberapa fungsi yang rumit? Apakah inversi matriks dan / atau operasi aljabar linier lainnya juga merupakan operasi umum yang dapat menyebabkan kemacetan? Setiap informasi lain yang bisa saya berikan kepada komunitas Pengguna Super akan sangat diterima dengan penuh rasa syukur.

Joe King
sumber
Saya tidak berpikir itu akan menjadi kejutan bahwa MCMC membutuhkan waktu lama untuk masalah seperti itu. Saya yakin mungkin ada cara untuk membuatnya berjalan lebih cepat. Tetapi untuk mendapatkan jawaban yang benar masih akan membutuhkan waktu.
Michael R. Chernick
@Michael Chernick, terima kasih - Saya tahu ini masih akan memakan waktu. Saya hanya ingin meminimalkannya sebanyak mungkin, itu saja. Ayah saya memiliki Oracle SPARC T4 di tempat kerjanya dan menjalankan MCMC cukup cepat;)
Joe King
3
@ JoKing, saya telah mengedit judul Anda agar lebih deskriptif dan mungkin menarik lebih banyak pengguna yang dapat membantu Anda. Saya juga menemukan bahwa pemasangan lmer()model ke kumpulan data besar bisa memakan waktu cukup lama, terutama jika Anda perlu melakukannya berkali-kali. Jawaban atas pertanyaan Anda mungkin terletak pada komputasi paralel meskipun pengguna lain (mis. @DirkEddelbuettel) akan jauh lebih membantu daripada saya dalam hal ini. Ada juga kemungkinan Anda mendapatkan jawaban yang lebih baik tentang stackoverflow.
Makro
Makro, terima kasih atas hasil edit yang bermanfaat. Saya juga telah menggunakan glmer(seperti yang Anda tahu dari posting saya yang lain) dan itu membutuhkan waktu sekitar 20 detik, tetapi masalahnya adalah tidak memberikan interval kepercayaan atau kesalahan standar, dan dari apa yang saya baca di milis arsipkan penulis lme4paket mengatakan bahwa distribusi sampling dari efek acak dapat sangat miring, sehingga statistik tersebut tidak dilaporkan. Sebenarnya saya menemukan dari MCMCglmmjauh bahwa dalam kasus saya mereka mendekati normal (bukan berarti ini banyak membantu - saya hanya mengatakan). Apakah akan lebih baik jika saya meminta untuk memigrasikannya ke SO?
Joe King
1
Saya tidak tahu secara spesifik mcmcglmm, tetapi telah banyak menggunakan metode MCMC. Hal yang menyenangkan tentang MCMC adalah hal itu memaralelkan memalukan (itu istilah teknis!). Jika Anda memiliki beberapa inti, Anda menjalankan rantai independen pada masing-masing kemudian mengumpulkan hasilnya. Ini adalah bagaimana saya menjalankan MCMC, tetapi saya telah menulis kode C ++ paralel saya sendiri (menggunakan MPI) untuk melakukannya. Dalam hal saran perangkat keras, cari sesuatu dengan core sebanyak mungkin. Itu mengasumsikan bahwa alat apa pun yang Anda gunakan dapat memanfaatkan beberapa inti. Dalam hal info untuk memberikan SU dalam pertanyaan Anda, cari tahu apakah Anda dapat memanfaatkan inti.
Bogdanovist

Jawaban:

3

Mengapa tidak menjalankannya di layanan cloud-computing Amazon EC2 atau layanan serupa serupa? MCMCpackadalah, jika saya ingat dengan benar, sebagian besar diimplementasikan dalam C, jadi itu tidak akan menjadi jauh lebih cepat kecuali jika Anda mengurangi kompleksitas model Anda, iterasi, dll. Dengan EC2, atau layanan komputasi awan yang serupa, Anda dapat memiliki beberapa instance di mana pun spesifikasi yang Anda inginkan, dan jalankan semua model Anda sekaligus.

Zach
sumber
Satu modifikasi untuk ini: berjalan pada m2.4xlarge (opsi 68.7GB RAM) adalah satu-satunya cara untuk menjamin Anda mendapatkan mesin lengkap, sehingga Anda tidak perlu menekan masalah caching RAM yang mungkin terjadi pada VM (mesin virtual) / AMI) yang beroperasi di sebagian kecil dari mesin.
Iterator