Làm cách nào để tối ưu hóa hiệu quả tính toán khi lắp mô hình phức tạp vào tập dữ liệu lớn nhiều lần?


12

Tôi gặp vấn đề về hiệu năng khi sử dụng MCMCglmmgói trong R để chạy mô hình hiệu ứng hỗn hợp. Mã trông như thế này:

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)

Có khoảng 20.000 quan sát trong dữ liệu và chúng được tập hợp trong khoảng 200 trường học. Tôi đã bỏ tất cả các biến không sử dụng khỏi khung dữ liệu và xóa tất cả các đối tượng khác khỏi bộ nhớ, trước khi chạy. Vấn đề tôi gặp phải là phải mất một thời gian rất dài để chạy, trừ khi tôi giảm số lần lặp xuống một số nhỏ không thể chấp nhận được. Với 50.000 lần lặp, phải mất 5 giờ và tôi có nhiều mô hình khác nhau để chạy. Vì vậy, tôi muốn biết liệu có cách nào để tăng tốc độ thực thi mã hay các gói khác mà tôi có thể sử dụng. Tôi đang sử dụng MCMCglmmvì tôi muốn khoảng tin cậy cho các hiệu ứng ngẫu nhiên.

Mặt khác, tôi đã hy vọng sẽ có được một PC mới vào cuối năm nay nhưng với một chút may mắn tôi có thể mang lại điều đó, vì vậy tôi đã tự hỏi làm thế nào để chi tiêu một lượng tiền hạn chế cho phần cứng mới - nhiều RAM hơn , CPU nhanh hơn, v.v. Từ việc xem trình quản lý tác vụ, tôi không tin RAM là vấn đề (nó không bao giờ được sử dụng trên 50% vật lý), nhưng việc sử dụng CPU cũng không đạt được nhiều hơn 50%, điều này gây cho tôi sự kỳ quặc . Thiết lập hiện tại của tôi là lõi intel i5 2.66GHz, RAM 4GB, ổ cứng 7200rpm. Có hợp lý không khi chỉ cần có CPU nhanh nhất có thể, với chi phí thêm RAM? Tôi cũng tự hỏi về ảnh hưởng của kích thước bộ đệm CPU cấp 3 đối với các vấn đề tính toán thống kê như thế này?

Cập nhật: Đã hỏi về meta SO Tôi đã được khuyên nên viết lại câu hỏi và đăng lên Superuser. Để làm như vậy, tôi cần cung cấp thêm chi tiết về những gì đang diễn ra "dưới mui xe" trong MCMCglmm. Tôi có đúng không khi nghĩ rằng phần lớn thời gian tính toán được dành cho việc tối ưu hóa - ý tôi là tìm tối đa một số hàm phức tạp? Là nghịch đảo ma trận và / hoặc các hoạt động đại số tuyến tính khác cũng là một hoạt động phổ biến có thể gây ra tắc nghẽn? Bất kỳ thông tin nào khác tôi có thể cung cấp cho cộng đồng Superuser sẽ được nhận một cách biết ơn nhất.


Tôi không nghĩ nên ngạc nhiên khi MCMC mất nhiều thời gian cho những vấn đề như vậy. Tôi chắc chắn có nhiều cách để làm cho nó chạy nhanh hơn. Nhưng để tạo ra một câu trả lời đúng vẫn sẽ mất thời gian.
Michael R. Chernick

@Michael Chernick, cảm ơn bạn - Tôi biết nó sẽ vẫn mất thời gian. Tôi chỉ muốn giảm thiểu nó càng nhiều càng tốt, đó là tất cả. Cha tôi có một Oracle SPARC T4 tại nơi làm việc và nó chạy MCMC khá nhanh;)
Joe King

3
@JoeKing, tôi đã chỉnh sửa tiêu đề của bạn để mô tả nhiều hơn và có thể thu hút nhiều người dùng hơn có thể giúp bạn. Tôi cũng thấy rằng lmer()các mô hình phù hợp với các tập dữ liệu lớn có thể mất nhiều thời gian, đặc biệt nếu bạn cần thực hiện nhiều lần. Một câu trả lời cho câu hỏi của bạn có thể nằm trong tính toán song song mặc dù những người dùng khác (ví dụ @DirkEddelbuettel) sẽ hữu ích hơn nhiều so với tôi với điều này. Cũng có cơ hội bạn có thể nhận được câu trả lời tốt hơn trên stackoverflow.
Macro

Macro, cảm ơn bạn đã chỉnh sửa hữu ích. Tôi cũng đã sử dụng glmer(như bạn biết từ các bài đăng khác của tôi) và mất khoảng 20 giây, nhưng vấn đề là nó không đưa ra các khoảng tin cậy hoặc lỗi tiêu chuẩn và từ những gì tôi đọc trên danh sách gửi thư lưu trữ tác giả của lme4gói nói rằng phân phối lấy mẫu của các hiệu ứng ngẫu nhiên có thể rất sai lệch, vì vậy những thống kê đó không được báo cáo. Trên thực tế tôi đã tìm thấy từ MCMCglmmtrước đến nay trong trường hợp của tôi họ đang tiếp cận bình thường (không phải điều này giúp ích nhiều - tôi chỉ nói). Sẽ tốt hơn nếu tôi yêu cầu chuyển nó sang SO?
Joe King

1
Tôi không biết chi tiết cụ thể của mcmcglmm, nhưng đã sử dụng các phương pháp MCMC rất nhiều. Điều hay ho về MCMC là song song xấu hổ (đó là một thuật ngữ kỹ thuật!). Nếu bạn có nhiều lõi, bạn chạy các chuỗi độc lập trên mỗi chuỗi sau đó gộp kết quả. Đây là cách tôi chạy MCMC, nhưng tôi đã viết mã C ++ song song của riêng mình (sử dụng MPI) để làm điều đó. Về mặt tư vấn phần cứng sau đó, hãy tìm một cái gì đó có càng nhiều lõi càng tốt. Điều đó giả định rằng bất kỳ công cụ nào bạn đang sử dụng đều có thể tận dụng nhiều lõi. Về mặt thông tin để cung cấp SU trong câu hỏi của bạn, hãy tìm hiểu xem bạn có thể sử dụng lõi không.
Bogdanovist

Câu trả lời:


3

Tại sao không chạy nó trên dịch vụ điện toán đám mây EC2 của Amazon hoặc một dịch vụ tương tự như vậy? MCMCpacklà, nếu tôi nhớ chính xác, chủ yếu được triển khai trong C, vì vậy nó sẽ không nhanh hơn nhiều trừ khi bạn giảm độ phức tạp của mô hình, các lần lặp, v.v. Với EC2 hoặc các dịch vụ điện toán đám mây tương tự, bạn có thể có nhiều trường hợp thông số kỹ thuật bạn mong muốn và chạy tất cả các mô hình của bạn cùng một lúc.


Một sửa đổi cho vấn đề này: chạy trên m2.4xlarge (tùy chọn RAM 68,7GB) là một cách duy nhất để đảm bảo bạn có được máy đầy đủ, do đó bạn không nhất thiết phải gặp sự cố bộ nhớ cache RAM có thể xảy ra trên máy ảo (máy ảo / AMIs) chạy trên một phần nhỏ của máy.
Lặp lại
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.